From 2ebb57e97ea77a3ab8203899fae59b699145cff8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Thu, 17 Oct 2019 14:37:37 -0400 Subject: [PATCH] Fix: sessiond: unbalanced health register/unregister on error MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- src/bin/lttng-sessiond/notification-thread.c | 12 ++++++------ src/bin/lttng-sessiond/rotation-thread.c | 11 +++++------ 2 files changed, 11 insertions(+), 12 deletions(-) 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; } -- 2.34.1