From 86d0f1197d0d12c9e6e39c2a502d75e2de79c229 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Tue, 11 Dec 2018 16:54:20 -0500 Subject: [PATCH] Fix: report initialization error of app registration thread MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- src/bin/lttng-sessiond/register.c | 43 +++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/bin/lttng-sessiond/register.c b/src/bin/lttng-sessiond/register.c index 319514a36..d0a1ff14a 100644 --- a/src/bin/lttng-sessiond/register.c +++ b/src/bin/lttng-sessiond/register.c @@ -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(¬ifiers->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(¬ifiers->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); -- 2.34.1