[PATCH] osmo-gsm-tester[master]: fix util.py/FileLock and lock_test

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Neels Hofmeyr gerrit-no-reply at lists.osmocom.org
Wed Sep 13 23:05:11 UTC 2017


Review at  https://gerrit.osmocom.org/3937

fix util.py/FileLock and lock_test

Do not pass os.O_TRUNC to open(), that immediately empties out the lock file.

Fix lock_test to be able to catch this error. So far things were happening too
fast to notice it.

Caught by running 'make check' on a main unit APU that has different timing
behavior.

Change-Id: I8a6e992836b09df3ecec89b3ec36d3641744fc0c
---
M selftest/lock_test.ok
M selftest/lock_test.sh
M selftest/lock_test_help.py
M src/osmo_gsm_tester/util.py
4 files changed, 42 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/37/3937/1

diff --git a/selftest/lock_test.ok b/selftest/lock_test.ok
index 604767b..011a89c 100644
--- a/selftest/lock_test.ok
+++ b/selftest/lock_test.ok
@@ -1,4 +1,14 @@
+creating files
+launch a program that locks a given file, it will create $dir/lock_test
+wait until this lock_test lock file was created by program
+expecting the lock file to reflect "long name"
 launched first, locked by: 'long name'
+launching second program, should find the lock intact and wait
 launched second, locked by: 'long name'
+drop the first lock, $f1 removal signals the first process to stop locking
+wait for first program to carry out the lock release
+now expecting second program to lock
 waited, locked by: 'shorter'
+release the second program also
+expecting the lock to be gone
 waited more, locked by: ''
diff --git a/selftest/lock_test.sh b/selftest/lock_test.sh
index 049c4d9..4f3f7ad 100755
--- a/selftest/lock_test.sh
+++ b/selftest/lock_test.sh
@@ -1,4 +1,6 @@
 #!/bin/sh
+
+echo 'creating files'
 dir="$(mktemp -d)"
 n1="long name"
 f1="$dir/$n1"
@@ -7,21 +9,45 @@
 f2="$dir/$n2"
 touch "$f2"
 sync
+
+echo 'launch a program that locks a given file, it will create $dir/lock_test'
 python3 ./lock_test_help.py "$dir" "$n1" &
+
+echo 'wait until this lock_test lock file was created by program'
 while [ ! -f "$dir/lock_test" ]; do
   sleep .1
 done
+sync
+
+echo 'expecting the lock file to reflect "long name"'
 echo "launched first, locked by: '$(cat "$dir/lock_test")'"
+
+echo 'launching second program, should find the lock intact and wait'
 python3 ./lock_test_help.py "$dir" "$n2" &
+while [ ! -f "$f2.ready" ]; do
+  sleep .1
+done
+sleep 1
+sync
 echo "launched second, locked by: '$(cat "$dir/lock_test")'"
+
+echo 'drop the first lock, $f1 removal signals the first process to stop locking'
 rm "$f1"
+
+echo 'wait for first program to carry out the lock release'
 while [ ! -f "$f1.done" ]; do
   sleep .1
 done
+
+echo 'now expecting second program to lock'
 echo "waited, locked by: '$(cat "$dir/lock_test")'"
+
+echo 'release the second program also'
 rm "$f2"
 while [ ! -f "$f2.done" ]; do
   sleep .1
 done
+
+echo 'expecting the lock to be gone'
 echo "waited more, locked by: '$(cat "$dir/lock_test")'"
 rm -rf "$dir"
diff --git a/selftest/lock_test_help.py b/selftest/lock_test_help.py
index bdf7c64..f4e1f9b 100644
--- a/selftest/lock_test_help.py
+++ b/selftest/lock_test_help.py
@@ -8,11 +8,15 @@
 
 testdir, name = sys.argv[1:]
 stop_signalling_file = os.path.join(testdir, name)
-assert os.path.isfile(stop_signalling_file)
+if not os.path.isfile(stop_signalling_file):
+    print('expected a stop-file %r' % stop_signalling_file)
+    exit(1)
 
 lockfile_path = os.path.join(testdir, 'lock_test')
 fl = FileLock(lockfile_path, name)
 
+touch_file(stop_signalling_file + '.ready')
+
 with fl:
     while os.path.exists(stop_signalling_file):
         time.sleep(.1)
diff --git a/src/osmo_gsm_tester/util.py b/src/osmo_gsm_tester/util.py
index af6a2f0..197dc97 100644
--- a/src/osmo_gsm_tester/util.py
+++ b/src/osmo_gsm_tester/util.py
@@ -101,7 +101,7 @@
     def __enter__(self):
         if self.f is not None:
             return
-        self.fd = os.open(self.path, os.O_CREAT | os.O_WRONLY | os.O_TRUNC)
+        self.fd = os.open(self.path, os.O_CREAT | os.O_WRONLY)
         fcntl.flock(self.fd, fcntl.LOCK_EX)
         os.truncate(self.fd, 0)
         os.write(self.fd, str(self.owner).encode('utf-8'))

-- 
To view, visit https://gerrit.osmocom.org/3937
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8a6e992836b09df3ecec89b3ec36d3641744fc0c
Gerrit-PatchSet: 1
Gerrit-Project: osmo-gsm-tester
Gerrit-Branch: master
Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>



More information about the gerrit-log mailing list