Add notification session rotation hooks
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 24 Aug 2018 00:35:58 +0000 (20:35 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 24 Aug 2018 01:15:18 +0000 (21:15 -0400)
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 <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/cmd.c
src/bin/lttng-sessiond/rotation-thread.c

index 1041b9f1a106d4090fff9d7422f2ea96d0b8333f..7f05655ecd7371a60c6fc3b5b9e1bd9eef768f84 100644 (file)
@@ -38,6 +38,7 @@
 #include <lttng/channel.h>
 #include <lttng/channel-internal.h>
 #include <lttng/rotate-internal.h>
+#include <lttng/location-internal.h>
 #include <common/string-utils/string-utils.h>
 
 #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);
+                       }
                }
        }
 
index 24ab0c8033fd715c829f036c67a2c3e891923c5d..900892bdb12bb8ad174f1248a4f4e2728278b3c0 100644 (file)
@@ -42,6 +42,7 @@
 #include "cmd.h"
 #include "session.h"
 #include "sessiond-timer.h"
+#include "notification-thread-commands.h"
 
 #include <urcu.h>
 #include <urcu/list.h>
@@ -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);
This page took 0.030997 seconds and 5 git commands to generate.