tests: commandtest: Make 'test4' checking daemonization more reliable

The 'commandhelper' checks effectively whether the parent process is
still around to report whether it was daemonized or not.

This creates a unlikely race condition in cases when we do actually
daemonize the process as the intermediate process used for the
daemonization might not have terminated yet which would report wrong
result leading to test failure.

For now there's just 'test4' which actually daemonizes the process.

Add an argument '--check-daemonize' which asks for retries of the
daemonization check in cases where we expect that the commandhelper is
going to be daemonized and use it in 'test4' to make the test more
reliable.

I've observed the test failure sporadically when my box is under load
e.g. while building two trees at once.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2020-07-21 12:32:10 +02:00
parent 957107184f
commit 6ae53a1509
3 changed files with 19 additions and 2 deletions

View File

@ -1,3 +1,4 @@
ARG:--check-daemonize
ENV:DISPLAY=:0.0 ENV:DISPLAY=:0.0
ENV:HOME=/home/test ENV:HOME=/home/test
ENV:HOSTNAME=test ENV:HOSTNAME=test

View File

@ -72,6 +72,8 @@ int main(int argc, char **argv) {
char *buffers[3] = {NULL, NULL, NULL}; char *buffers[3] = {NULL, NULL, NULL};
size_t buflen[3] = {0, 0, 0}; size_t buflen[3] = {0, 0, 0};
char c; char c;
bool daemonize_check = false;
size_t daemonize_retries = 3;
if (!log) if (!log)
return ret; return ret;
@ -83,6 +85,8 @@ int main(int argc, char **argv) {
sscanf(argv[i], "%u%c", &readfds[numreadfds++], &c) != 1) { sscanf(argv[i], "%u%c", &readfds[numreadfds++], &c) != 1) {
printf("Could not parse fd %s\n", argv[i]); printf("Could not parse fd %s\n", argv[i]);
goto cleanup; goto cleanup;
} else if (STREQ(argv[i], "--check-daemonize")) {
daemonize_check = true;
} }
} }
@ -126,7 +130,18 @@ int main(int argc, char **argv) {
fprintf(log, "FD:%zu\n", i); fprintf(log, "FD:%zu\n", i);
} }
fprintf(log, "DAEMON:%s\n", getpgrp() != getppid() ? "yes" : "no"); while (true) {
bool daemonized = getpgrp() != getppid();
if (daemonize_check && !daemonized && daemonize_retries-- > 0) {
usleep(100*1000);
continue;
}
fprintf(log, "DAEMON:%s\n", daemonized ? "yes" : "no");
break;
}
if (!(cwd = getcwd(NULL, 0))) if (!(cwd = getcwd(NULL, 0)))
goto cleanup; goto cleanup;
if (strlen(cwd) > strlen(".../commanddata") && if (strlen(cwd) > strlen(".../commanddata") &&

View File

@ -255,7 +255,8 @@ static int test3(const void *unused G_GNUC_UNUSED)
*/ */
static int test4(const void *unused G_GNUC_UNUSED) static int test4(const void *unused G_GNUC_UNUSED)
{ {
virCommandPtr cmd = virCommandNew(abs_builddir "/commandhelper"); virCommandPtr cmd = virCommandNewArgList(abs_builddir "/commandhelper",
"--check-daemonize", NULL);
char *pidfile = virPidFileBuildPath(abs_builddir, "commandhelper"); char *pidfile = virPidFileBuildPath(abs_builddir, "commandhelper");
pid_t pid; pid_t pid;
int ret = -1; int ret = -1;