Fix: sessiond: unbalanced health register/unregister on error
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 17 Oct 2019 18:37:37 +0000 (14:37 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 17 Oct 2019 18:48:08 +0000 (14:48 -0400)
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 <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/notification-thread.c
src/bin/lttng-sessiond/rotation-thread.c

index 3686d72f7015e9b728eb2d6ab246a1e5a4d14f9a..8d69ef7c45919448d227056ad82880e21a476e48 100644 (file)
@@ -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;
 }
 
index ee25baaf1964d8d5a1809a2e1bfc53f5f723d1df..d12bd9d0150cf1b998ba6bde49343f31f17c78e4 100644 (file)
@@ -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;
 }
 
This page took 0.037055 seconds and 4 git commands to generate.