diff mbox series

[v4] oeqa/runtime: fix race-condition in minidebuginfo test

Message ID 20240611132447.1497274-1-ecordonnier@snap.com
State New
Headers show
Series [v4] oeqa/runtime: fix race-condition in minidebuginfo test | expand

Commit Message

Etienne Cordonnier June 11, 2024, 1:24 p.m. UTC
From: Etienne Cordonnier <ecordonnier@snap.com>

Fix this error where 'coredumpctl info' warns that the coredump is still being
processed:

```
AssertionError: 1 != 0 : MiniDebugInfo Test failed: No match found.
-- Notice: 1 systemd-coredump@.service unit is running, output may be incomplete.
```

Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com>
---
 meta/lib/oeqa/runtime/cases/systemd.py | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

Comments

Ross Burton June 12, 2024, 2:52 p.m. UTC | #1
On 11 Jun 2024, at 14:24, Etienne Cordonnier via lists.openembedded.org <ecordonnier=snap.com@lists.openembedded.org> wrote:
> 
> +        # Give some time to systemd-coredump@.service to process the coredump
> +        TIMEOUT_SEC = 20
> +        for x in range(TIMEOUT_SEC):
> +            status, output = self.target.run('coredumpctl list %s' % sleep_pid)
> +            if status == 0:
> +                break
> +            self.assertLess(x, TIMEOUT_SEC - 1, msg="Timed out waiting for coredump creation")
> +            time.sleep(1)

There’s a more Pythonic structure:

for x in range(20):
    status, output = self.target.run('coredumpctl list %s' % sleep_pid)
    if status == 0:
      break
    time.sleep(1)
else:
    self.fail("Timed out waiting for coredump creation”)

Cheers,
Ross
diff mbox series

Patch

diff --git a/meta/lib/oeqa/runtime/cases/systemd.py b/meta/lib/oeqa/runtime/cases/systemd.py
index 80fdae240a6..b399e2e279e 100644
--- a/meta/lib/oeqa/runtime/cases/systemd.py
+++ b/meta/lib/oeqa/runtime/cases/systemd.py
@@ -150,12 +150,21 @@  class SystemdServiceTests(SystemdTest):
         t_thread.start()
         time.sleep(1)
 
-        status, output = self.target.run('pidof sleep')
+        status, sleep_pid = self.target.run('pidof sleep')
         # cause segfault on purpose
-        self.target.run('kill -SEGV %s' % output)
-        self.assertEqual(status, 0, msg = 'Not able to find process that runs sleep, output : %s' % output)
+        self.target.run('kill -SEGV %s' % sleep_pid)
+        self.assertEqual(status, 0, msg = 'Not able to find process that runs sleep, output : %s' % sleep_pid)
+
+        # Give some time to systemd-coredump@.service to process the coredump
+        TIMEOUT_SEC = 20
+        for x in range(TIMEOUT_SEC):
+            status, output = self.target.run('coredumpctl list %s' % sleep_pid)
+            if status == 0:
+                break
+            self.assertLess(x, TIMEOUT_SEC - 1, msg="Timed out waiting for coredump creation")
+            time.sleep(1)
 
-        (status, output) = self.target.run('coredumpctl info')
+        (status, output) = self.target.run('coredumpctl info %s' % sleep_pid)
         self.assertEqual(status, 0, msg='MiniDebugInfo Test failed: %s' % output)
         self.assertEqual('sleep_for_duration (busybox.nosuid' in output or 'xnanosleep (sleep.coreutils' in output,
                          True, msg='Call stack is missing minidebuginfo symbols (functions shown as "n/a"): %s' % output)