From: Jérémie Galarneau Date: Fri, 24 Aug 2018 00:35:58 +0000 (-0400) Subject: Add notification session rotation hooks X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=commitdiff_plain;h=17dd12323bbd9f979e5b3886f979a1e02e2dcbe6 Add notification session rotation hooks Add hooks to inform the notification subsystem of session rotation state changes (ongoing or completed). This allows the notification system to track the rotation state and inform clients that are subscribed to those conditions. Signed-off-by: Jérémie Galarneau --- diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c index 1041b9f1a..7f05655ec 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include "channel.h" @@ -4562,10 +4563,11 @@ int cmd_rotate_session(struct ltt_session *session, session->rotation_state = LTTNG_ROTATION_STATE_ONGOING; ret = notification_thread_command_session_rotation_ongoing( notification_thread_handle, - session->name, session->current_archive_id); - if (ret) { - ret = LTTNG_ERR_UNK; - goto end; + session->name, session->uid, session->gid, + session->current_archive_id); + if (ret != LTTNG_OK) { + ERR("Failed to notify notification thread that a session rotation is ongoing for session %s", + session->name); } /* @@ -4679,13 +4681,29 @@ int cmd_rotate_session(struct ltt_session *session, * session_list locks. */ if (!session->kernel_session && !ust_active) { + struct lttng_trace_archive_location *location; + + session->rotate_pending = false; + session->rotation_state = LTTNG_ROTATION_STATE_COMPLETED; ret = rename_complete_chunk(session, now); if (ret < 0) { ERR("Failed to rename completed rotation chunk"); goto end; } - session->rotate_pending = false; - session->rotation_state = LTTNG_ROTATION_STATE_COMPLETED; + + /* Ownership of location is transferred. */ + location = session_get_trace_archive_location(session); + ret = notification_thread_command_session_rotation_completed( + notification_thread_handle, + session->name, + session->uid, + session->gid, + session->current_archive_id, + location); + if (ret != LTTNG_OK) { + ERR("Failed to notify notification thread that rotation is complete for session %s", + session->name); + } } } diff --git a/src/bin/lttng-sessiond/rotation-thread.c b/src/bin/lttng-sessiond/rotation-thread.c index 24ab0c803..900892bdb 100644 --- a/src/bin/lttng-sessiond/rotation-thread.c +++ b/src/bin/lttng-sessiond/rotation-thread.c @@ -42,6 +42,7 @@ #include "cmd.h" #include "session.h" #include "sessiond-timer.h" +#include "notification-thread-commands.h" #include #include @@ -409,7 +410,23 @@ int handle_channel_rotation_pipe(int fd, uint32_t revents, goto end_unlock_session; } } else { + struct lttng_trace_archive_location *location; + session->rotation_state = LTTNG_ROTATION_STATE_COMPLETED; + /* Ownership of location is transferred. */ + location = session_get_trace_archive_location(session); + ret = notification_thread_command_session_rotation_completed( + notification_thread_handle, + session->name, + session->uid, + session->gid, + session->current_archive_id, + location); + if (ret != LTTNG_OK) { + ERR("Failed to notify notification thread that rotation is complete for session %s", + session->name); + } + } DBG("Rotation completed for session %s", session->name); } @@ -442,6 +459,8 @@ int rotate_pending_relay_timer(struct ltt_session *session) goto end; } if (ret == 0) { + struct lttng_trace_archive_location *location; + DBG("[rotation-thread] Rotation completed on the relay for " "session %" PRIu64, session->id); /* @@ -450,6 +469,21 @@ int rotate_pending_relay_timer(struct ltt_session *session) */ session->rotate_pending_relay = false; session->rotation_state = LTTNG_ROTATION_STATE_COMPLETED; + + session->rotation_state = LTTNG_ROTATION_STATE_COMPLETED; + /* Ownership of location is transferred. */ + location = session_get_trace_archive_location(session); + ret = notification_thread_command_session_rotation_completed( + notification_thread_handle, + session->name, + session->uid, + session->gid, + session->current_archive_id, + location); + if (ret != LTTNG_OK) { + ERR("Failed to notify notification thread that rotation is complete for session %s", + session->name); + } } else if (ret == 1) { DBG("[rotation-thread] Rotation still pending on the relay for " "session %" PRIu64, session->id);