From: Jérémie Galarneau Date: Tue, 27 Nov 2018 23:17:16 +0000 (-0500) Subject: Stop rotation pending check timer from the rotation thread X-Git-Tag: v2.12.0-rc1~727 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=faf1bdcfa4aedc89c3c9777bd9453e4b7f20b193;hp=c8a9de5a85fb150d3ceaa5ca1a8b1b2b91d050d5 Stop rotation pending check timer from the rotation thread Signed-off-by: Jérémie Galarneau --- diff --git a/src/bin/lttng-sessiond/rotation-thread.c b/src/bin/lttng-sessiond/rotation-thread.c index e8bd478e8..a0b924865 100644 --- a/src/bin/lttng-sessiond/rotation-thread.c +++ b/src/bin/lttng-sessiond/rotation-thread.c @@ -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); + /* + * 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); @@ -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); + /* Release reference held by the job. */ session_put(session); session_unlock_list(); free(job); diff --git a/src/bin/lttng-sessiond/timer.c b/src/bin/lttng-sessiond/timer.c index d70d16710..fa5e95cf1 100644 --- a/src/bin/lttng-sessiond/timer.c +++ b/src/bin/lttng-sessiond/timer.c @@ -388,15 +388,9 @@ void *timer_thread_func(void *data) 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); - /* 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,