Stop rotation pending check timer from the rotation thread
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 27 Nov 2018 23:17:16 +0000 (18:17 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Wed, 5 Dec 2018 17:25:11 +0000 (12:25 -0500)
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/rotation-thread.c
src/bin/lttng-sessiond/timer.c

index e8bd478e8db032934690979c86469b8de444d9f4..a0b924865d3e02fe04fc5ebd5c2517cb69ee165e 100644 (file)
@@ -527,6 +527,19 @@ int check_session_rotation_pending(struct ltt_session *session,
        DBG("[rotation-thread] Checking for pending rotation on session \"%s\", trace archive %" PRIu64,
                        session->name, session->current_archive_id - 1);
 
        DBG("[rotation-thread] Checking for pending rotation on session \"%s\", trace archive %" PRIu64,
                        session->name, session->current_archive_id - 1);
 
+       /*
+        * The rotation-pending check timer of a session is launched in
+        * one-shot mode. If the rotation is incomplete, the rotation
+        * thread will re-enable the pending-check timer.
+        *
+        * The timer thread can't stop the timer itself since it is involved
+        * in the check for the timer's quiescence.
+        */
+       ret = timer_session_rotation_pending_check_stop(session);
+       if (ret) {
+               goto end;
+       }
+
        if (session->rotation_pending_local) {
                /* Updates session->rotation_pending_local as needed. */
                ret = check_session_rotation_pending_local(session);
        if (session->rotation_pending_local) {
                /* Updates session->rotation_pending_local as needed. */
                ret = check_session_rotation_pending_local(session);
@@ -751,6 +764,7 @@ int handle_job_queue(struct rotation_thread_handle *handle,
                session_lock(session);
                ret = run_job(job, session, handle->notification_thread_handle);
                session_unlock(session);
                session_lock(session);
                ret = run_job(job, session, handle->notification_thread_handle);
                session_unlock(session);
+               /* Release reference held by the job. */
                session_put(session);
                session_unlock_list();
                free(job);
                session_put(session);
                session_unlock_list();
                free(job);
index d70d16710c91e7200f1a0c78f078e3d68a00c201..fa5e95cf194721bd5ff812ad1ea67fac9a312608 100644 (file)
@@ -388,15 +388,9 @@ void *timer_thread_func(void *data)
                        struct ltt_session *session =
                                        (struct ltt_session *) info.si_value.sival_ptr;
 
                        struct ltt_session *session =
                                        (struct ltt_session *) info.si_value.sival_ptr;
 
-                       session_lock_list();
-                       session_lock(session);
-                       /* Acquires a reference to the session. */
                        rotation_thread_enqueue_job(ctx->rotation_thread_job_queue,
                                        ROTATION_THREAD_JOB_TYPE_CHECK_PENDING_ROTATION,
                                        session);
                        rotation_thread_enqueue_job(ctx->rotation_thread_job_queue,
                                        ROTATION_THREAD_JOB_TYPE_CHECK_PENDING_ROTATION,
                                        session);
-                       /* Release the timer's reference to the session. */
-                       (void) timer_session_rotation_pending_check_stop(session);
-                       session_unlock_list();
                } else if (signr == LTTNG_SESSIOND_SIG_SCHEDULED_ROTATION) {
                        rotation_thread_enqueue_job(ctx->rotation_thread_job_queue,
                                        ROTATION_THREAD_JOB_TYPE_SCHEDULED_ROTATION,
                } else if (signr == LTTNG_SESSIOND_SIG_SCHEDULED_ROTATION) {
                        rotation_thread_enqueue_job(ctx->rotation_thread_job_queue,
                                        ROTATION_THREAD_JOB_TYPE_SCHEDULED_ROTATION,
This page took 0.026896 seconds and 4 git commands to generate.