Patchwork oeqa/runtime/systemd: remove race in settle()

login
register
mail settings
Submitter Ross Burton
Date Feb. 4, 2014, 12:41 p.m.
Message ID <1391517675-31524-1-git-send-email-ross.burton@intel.com>
Download mbox | patch
Permalink /patch/66299/
State New
Headers show

Comments

Ross Burton - Feb. 4, 2014, 12:41 p.m.
The settle() function had a race where services could still be activating at two
minutes but then when the final log is output, they've activated.

Remove this race and generally clean up the code.

Signed-off-by: Ross Burton <ross.burton@intel.com>
---
 meta/lib/oeqa/runtime/systemd.py |   22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)

Patch

diff --git a/meta/lib/oeqa/runtime/systemd.py b/meta/lib/oeqa/runtime/systemd.py
index 6414dd6..6de84f8 100644
--- a/meta/lib/oeqa/runtime/systemd.py
+++ b/meta/lib/oeqa/runtime/systemd.py
@@ -37,25 +37,19 @@  class SystemdBasicTests(SystemdTest):
         Block until systemd has finished activating any units being activated,
         or until two minutes has elapsed.
 
-        Returns a tuple, either (True, None) if all units have finished
-        acitvating, or (False, message string) if there are still units
+        Returns a tuple, either (True, '') if all units have finished
+        activating, or (False, message string) if there are still units
         activating (generally, failing units that restart).
         """
         import time
-        settled = False
         endtime = time.time() + (60 * 2)
-        while time.time() < endtime:
-            status = self.target.run('systemctl --state=activating | grep -q "0 loaded units listed"')
-            if status == 0:
-                settled = True
-                break
-            time.sleep(10)
-
-        if settled:
-            return (True, None)
-        else:
+        while True:
             status, output = self.target.run('systemctl --state=activating')
-        return (settled, output)
+            if "0 loaded units listed" in output:
+                return (True, '')
+            if time.time() >= endtime:
+                return (False, output)
+            time.sleep(10)
 
     @skipUnlessPassed('test_systemd_basic')
     def test_systemd_failed(self):