Fix: report initialization error of app registration thread
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 11 Dec 2018 21:54:20 +0000 (16:54 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 11 Dec 2018 22:03:37 +0000 (17:03 -0500)
The health check tests use the testpoints() in the application
registration thread to force a pthread_exit() or simulate a
catastrophic error within the thread.

The testpoints were moved before the signal that the thread's
initialization was completed by recent changes. This caused the thread
to fail to complete its initialization, causing a deadlock of the
session daemon on launch.

This commit reports initialization errors through the
launch_application_registration_thread() function to the "main" thread
and shuts down the session daemon. It also moves the testpoints after
the thread's initialization to respect the test's intent.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/register.c

index 319514a366839460f9e1bbf176fd0f21793a817f..d0a1ff14a69dc3173d89fbcf866de09fdb339816 100644 (file)
@@ -38,6 +38,7 @@ struct thread_notifiers {
        struct lttng_pipe *quit_pipe;
        struct ust_cmd_queue *ust_cmd_queue;
        sem_t ready;
+       bool running;
 };
 
 /*
@@ -114,19 +115,31 @@ static void cleanup_application_registration_thread(void *data)
        free(notifiers);
 }
 
-static
-void mark_thread_as_ready(struct thread_notifiers *notifiers)
+static void set_thread_status(struct thread_notifiers *notifiers, bool running)
 {
-       DBG("Marking application registration thread as ready");
+       DBG("Marking application registration thread's state as %s", running ? "running" : "error");
+       notifiers->running = running;
        sem_post(&notifiers->ready);
 }
 
-static
-void wait_until_thread_is_ready(struct thread_notifiers *notifiers)
+static bool wait_thread_status(struct thread_notifiers *notifiers)
 {
        DBG("Waiting for application registration thread to be ready");
        sem_wait(&notifiers->ready);
-       DBG("Application registration thread is ready");
+       if (notifiers->running) {
+               DBG("Application registration thread is ready");
+       } else {
+               ERR("Initialization of application registration thread failed");
+       }
+
+       return notifiers->running;
+}
+
+static void thread_init_cleanup(void *data)
+{
+       struct thread_notifiers *notifiers = data;
+
+       set_thread_status(notifiers, false);
 }
 
 /*
@@ -150,12 +163,9 @@ static void *thread_application_registration(void *data)
 
        DBG("[thread] Manage application registration started");
 
+       pthread_cleanup_push(thread_init_cleanup, NULL);
        health_register(health_sessiond, HEALTH_SESSIOND_TYPE_APP_REG);
 
-       if (testpoint(sessiond_thread_registration_apps)) {
-               goto error_testpoint;
-       }
-
        apps_sock = create_application_socket();
        if (apps_sock < 0) {
                goto error_listen;
@@ -166,7 +176,12 @@ static void *thread_application_registration(void *data)
                goto error_listen;
        }
 
-       mark_thread_as_ready(notifiers);
+       set_thread_status(notifiers, true);
+       pthread_cleanup_pop(0);
+
+       if (testpoint(sessiond_thread_registration_apps)) {
+               goto error_create_poll;
+       }
 
        /*
         * Pass 2 as size here for the thread quit pipe and apps_sock. Nothing
@@ -361,7 +376,6 @@ error_poll_add:
        lttng_poll_clean(&events);
 error_listen:
 error_create_poll:
-error_testpoint:
        DBG("UST Registration thread cleanup complete");
        if (err) {
                health_error();
@@ -407,7 +421,10 @@ struct lttng_thread *launch_application_registration_thread(
        if (!thread) {
                goto error;
        }
-       wait_until_thread_is_ready(notifiers);
+       if (!wait_thread_status(notifiers)) {
+               lttng_thread_put(thread);
+               thread = NULL;
+       }
        return thread;
 error:
        cleanup_application_registration_thread(notifiers);
This page took 0.0359 seconds and 4 git commands to generate.