From: Jérémie Galarneau Date: Thu, 17 Oct 2019 18:37:37 +0000 (-0400) Subject: Fix: sessiond: unbalanced health register/unregister on error X-Git-Tag: v2.12.0-rc1~302 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=f620cc284daf7e87d17da0faf9e3652e60c8fb05 Fix: sessiond: unbalanced health register/unregister on error A number of threads do not correctly pair registrations and unregistrations to the health monitoring subsystem when an error forces them to abort early. Since the pattern is mostly the same in the notification and rotation thread, they are both fixed in the same commit. Signed-off-by: Jérémie Galarneau --- diff --git a/src/bin/lttng-sessiond/notification-thread.c b/src/bin/lttng-sessiond/notification-thread.c index 3686d72f7..8d69ef7c4 100644 --- a/src/bin/lttng-sessiond/notification-thread.c +++ b/src/bin/lttng-sessiond/notification-thread.c @@ -530,15 +530,15 @@ void *thread_notification(void *data) DBG("[notification-thread] Started notification thread"); + health_register(health_sessiond, HEALTH_SESSIOND_TYPE_NOTIFICATION); + rcu_register_thread(); + rcu_thread_online(); + if (!handle) { ERR("[notification-thread] Invalid thread context provided"); goto end; } - rcu_register_thread(); - rcu_thread_online(); - - health_register(health_sessiond, HEALTH_SESSIOND_TYPE_NOTIFICATION); health_code_update(); ret = init_thread_state(handle, &state); @@ -642,10 +642,10 @@ void *thread_notification(void *data) exit: error: fini_thread_state(&state); - health_unregister(health_sessiond); +end: rcu_thread_offline(); rcu_unregister_thread(); -end: + health_unregister(health_sessiond); return NULL; } diff --git a/src/bin/lttng-sessiond/rotation-thread.c b/src/bin/lttng-sessiond/rotation-thread.c index ee25baaf1..d12bd9d01 100644 --- a/src/bin/lttng-sessiond/rotation-thread.c +++ b/src/bin/lttng-sessiond/rotation-thread.c @@ -836,6 +836,10 @@ void *thread_rotation(void *data) int queue_pipe_fd; DBG("[rotation-thread] Started rotation thread"); + rcu_register_thread(); + rcu_thread_online(); + health_register(health_sessiond, HEALTH_SESSIOND_TYPE_ROTATION); + health_code_update(); if (!handle) { ERR("[rotation-thread] Invalid thread context provided"); @@ -845,11 +849,6 @@ void *thread_rotation(void *data) queue_pipe_fd = lttng_pipe_get_readfd( handle->rotation_timer_queue->event_pipe); - rcu_register_thread(); - rcu_thread_online(); - - health_register(health_sessiond, HEALTH_SESSIOND_TYPE_ROTATION); - health_code_update(); ret = init_thread_state(handle, &thread); if (ret) { @@ -930,10 +929,10 @@ exit: error: DBG("[rotation-thread] Exit"); fini_thread_state(&thread); +end: health_unregister(health_sessiond); rcu_thread_offline(); rcu_unregister_thread(); -end: return NULL; }