Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / qa / workunits / fs / misc / filelock_deadlock.py
1 #!/usr/bin/python
2
3 import errno
4 import fcntl
5 import os
6 import signal
7 import struct
8 import time
9
10
11 def handler(signum, frame):
12     pass
13
14
15 def lock_two(f1, f2):
16     lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 10, 0, 0)
17     fcntl.fcntl(f1, fcntl.F_SETLKW, lockdata)
18     time.sleep(10)
19
20     # don't wait forever
21     signal.signal(signal.SIGALRM, handler)
22     signal.alarm(10)
23     exitcode = 0
24     try:
25         fcntl.fcntl(f2, fcntl.F_SETLKW, lockdata)
26     except IOError as e:
27         if e.errno == errno.EDEADLK:
28             exitcode = 1
29         elif e.errno == errno.EINTR:
30             exitcode = 2
31         else:
32             exitcode = 3
33     os._exit(exitcode)
34
35
36 def main():
37     pid1 = os.fork()
38     if pid1 == 0:
39         f1 = open("testfile1", 'w')
40         f2 = open("testfile2", 'w')
41         lock_two(f1, f2)
42
43     pid2 = os.fork()
44     if pid2 == 0:
45         f1 = open("testfile2", 'w')
46         f2 = open("testfile3", 'w')
47         lock_two(f1, f2)
48
49     pid3 = os.fork()
50     if pid3 == 0:
51         f1 = open("testfile3", 'w')
52         f2 = open("testfile1", 'w')
53         lock_two(f1, f2)
54
55     deadlk_count = 0
56     i = 0
57     while i < 3:
58         pid, status = os.wait()
59         exitcode = status >> 8
60         if exitcode == 1:
61             deadlk_count += 1
62         elif exitcode != 0:
63             raise RuntimeError("unexpect exit code of child")
64         i += 1
65
66     if deadlk_count != 1:
67         raise RuntimeError("unexpect count of EDEADLK")
68
69     print('ok')
70
71
72 main()