[OE-core] [PATCH] oe_syslog.py: Handle syslogd/klogd restart race
Jon Mason
jdmason at kudzu.us
Fri Jun 21 16:39:14 UTC 2019
On Fri, Jun 21, 2019 at 12:14 PM Richard Purdie
<richard.purdie at linuxfoundation.org> wrote:
>
> On Fri, 2019-06-21 at 11:42 -0400, Jon Mason wrote:
> > syslogd and klogd can occasionally take too long to restart, which
> > causes tests to fail by starting before the log daemons are ready. To
> > work around this problem, poll for up to 30 seconds on the processes to
> > verify the old ones are killed and the new ones are up and running.
> >
> > [YOCTO #13379]
> >
> > Signed-off-by: Jon Mason <jdmason at kudzu.us>
> > ---
> > meta/lib/oeqa/runtime/cases/oe_syslog.py | 37 ++++++++++++++++++++++++
> > 1 file changed, 37 insertions(+)
> >
> > diff --git a/meta/lib/oeqa/runtime/cases/oe_syslog.py b/meta/lib/oeqa/runtime/cases/oe_syslog.py
> > index 0f5f9f43ca..3270a0fc88 100644
> > --- a/meta/lib/oeqa/runtime/cases/oe_syslog.py
> > +++ b/meta/lib/oeqa/runtime/cases/oe_syslog.py
> > @@ -50,9 +50,46 @@ class SyslogTestConfig(OERuntimeTestCase):
> > @skipIfDataVar('VIRTUAL-RUNTIME_init_manager', 'systemd',
> > 'Not appropiate for systemd image')
> > def test_syslog_startup_config(self):
> > + status, syslogd_pid = self.target.run('pidof syslogd')
> > + status, klogd_pid = self.target.run('pidof klogd')
> > +
> > cmd = 'echo "LOGFILE=/var/log/test" >> /etc/syslog-startup.conf'
> > self.target.run(cmd)
> > status, output = self.target.run('/etc/init.d/syslog restart')
> > +
> > + # Error, most likely a race between shutting down and starting up
> > + if status:
> > + import time
> > + timeout = time.time() + 30
> > +
> > + while time.time() < timeout:
> > + time.sleep(1)
> > + # Verify the old ones are no longer running
> > + status, output = self.target.run('kill -0 %s' %syslogd_pid)
> > + if not status:
> > + self.logger.debug("old syslogd is running")
> > + continue
> > +
> > + status, output = self.target.run('kill -0 %s' %klogd_pid)
> > + if not status:
> > + self.logger.debug("old klogd is running")
> > + continue
> > +
> > + # Verify the new ones are running
> > + status, new_syslogd_pid = self.target.run('pidof syslogd')
> > + if status:
> > + self.logger.debug("new syslogd is not running")
> > + continue
> > +
> > + status, new_klogd_pid = self.target.run('pidof klogd')
> > + if status:
> > + self.logger.debug("new syslogd is not running")
> > + continue
> > +
> > + # Everything is fine now, so keep running
> > + status = 0
> > + break
> > +
> > msg = ('Could not restart syslog service. Status and output:'
> > ' %s and %s' % (status,output))
> > self.assertEqual(status, 0, msg)
>
> Thanks, I think this is reasonable however I think we may need to make
> the above a function and then call it from other places in the tests in
> that file.
>
> test_syslog_restart should check it did restart using the above
>
> test_syslog_startup_config does a second restart which we should also
> check?
Seems reasonable. I'll crank out v2 shortly.
> Out of interest were you able to see error codes being returned in
> status in your tests?
I used code to force every error path during development, but not that
the testcase will fail. So, your question did cause me to notice a
bug in the code when verifying that the old ones are no longer
running. That should return 0 if still running, which wouldn't cause
the assert outside of the loop. So, I'll need to tweak this there.
v2 will have this fix as well.
Thanks,
Jon
>
> Cheers,
>
> Richard
>
More information about the Openembedded-core
mailing list