On Wed, Jan 11, 2023 at 05:30:18PM -0500, Stefan Berger wrote: > To prevent getting stuck on waitpid() in case the target process does > not terminate on SIGTERM, poll on waitpid() for 10s and if the target > process has not changed state until then send a SIGKILL to it. > > Signed-off-by: Stefan Berger <stef...@linux.ibm.com> > --- > tests/qtest/libqtest.c | 18 +++++++++++++++++- > 1 file changed, 17 insertions(+), 1 deletion(-)
Since this is a test suite and we know our CI system gets very heavily loaded, I think we should wait more than 10 secs, to ensure QEMU has time to flush pending I/O in particular which is most likely to delay things. If you bump the time to 30 secs then Reviewed-by: Daniel P. Berrangé <berra...@redhat.com> > > diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c > index 2fbc3b88f3..362b1f724f 100644 > --- a/tests/qtest/libqtest.c > +++ b/tests/qtest/libqtest.c > @@ -202,8 +202,24 @@ void qtest_wait_qemu(QTestState *s) > { > #ifndef _WIN32 > pid_t pid; > + uint64_t end; > + > + /* poll for 10s until sending SIGKILL */ > + end = g_get_monotonic_time() + 10 * G_TIME_SPAN_SECOND; > + > + do { > + pid = waitpid(s->qemu_pid, &s->wstatus, WNOHANG); > + if (pid != 0) { > + break; > + } > + g_usleep(100 * 1000); > + } while (g_get_monotonic_time() < end); > + > + if (pid == 0) { > + kill(s->qemu_pid, SIGKILL); > + TFR(pid = waitpid(s->qemu_pid, &s->wstatus, 0)); > + } > > - TFR(pid = waitpid(s->qemu_pid, &s->wstatus, 0)); > assert(pid == s->qemu_pid); > #else > DWORD ret; > -- > 2.39.0 > With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|