This change adds a command line option to print a line to standard out when the storage daemon has completed initialization and is ready to serve client connections.
This option will be used to resolve a hang in the vhost-user-blk-test. Signed-off-by: Raphael Norwitz <raphael.norw...@nutanix.com> --- storage-daemon/qemu-storage-daemon.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/storage-daemon/qemu-storage-daemon.c b/storage-daemon/qemu-storage-daemon.c index fc8b150629..c4f76d1564 100644 --- a/storage-daemon/qemu-storage-daemon.c +++ b/storage-daemon/qemu-storage-daemon.c @@ -61,6 +61,9 @@ static const char *pid_file; static volatile bool exit_requested = false; +static bool print_setup; + +const char *init_msg = "Block exports setup\n"; void qemu_system_killed(int signal, pid_t pid) { @@ -82,6 +85,7 @@ static void help(void) " -T, --trace [[enable=]<pattern>][,events=<file>][,file=<file>]\n" " specify tracing options\n" " -V, --version output version information and exit\n" +" -P, --printset print to stdout once server is fully initialized\n" "\n" " --blockdev [driver=]<driver>[,node-name=<N>][,discard=ignore|unmap]\n" " [,cache.direct=on|off][,cache.no-flush=on|off]\n" @@ -174,6 +178,7 @@ static void process_options(int argc, char *argv[]) {"nbd-server", required_argument, NULL, OPTION_NBD_SERVER}, {"object", required_argument, NULL, OPTION_OBJECT}, {"pidfile", required_argument, NULL, OPTION_PIDFILE}, + {"printset", no_argument, NULL, 'P'}, {"trace", required_argument, NULL, 'T'}, {"version", no_argument, NULL, 'V'}, {0, 0, 0, 0} @@ -195,6 +200,9 @@ static void process_options(int argc, char *argv[]) trace_opt_parse(optarg); trace_init_file(); break; + case 'P': + print_setup = true; + break; case 'V': printf("qemu-storage-daemon version " QEMU_FULL_VERSION "\n" QEMU_COPYRIGHT "\n"); @@ -310,6 +318,7 @@ static void pid_file_init(void) int main(int argc, char *argv[]) { + int err; #ifdef CONFIG_POSIX signal(SIGPIPE, SIG_IGN); #endif @@ -341,6 +350,18 @@ int main(int argc, char *argv[]) */ pid_file_init(); + /* + * If requested to pipe output once exports are initialized, print to + * stdout. + */ + if (print_setup) { + err = write(1, init_msg, strlen(init_msg)); + if (err == -1) { + fprintf(stderr, "Write to pipe failed: %m\n"); + return -1; + } + } + while (!exit_requested) { main_loop_wait(false); } -- 2.20.1