relayd: create sessiond trace chunk registry on session creation
[lttng-tools.git] / src / bin / lttng-relayd / main.c
index 1e2e9050fef2d6d77ca78e9767a2fea759ba99be..c7760cca45b67feaac6f7e50b0edb03d7d74e72d 100644 (file)
@@ -74,6 +74,7 @@
 #include "connection.h"
 #include "tracefile-array.h"
 #include "tcp_keep_alive.h"
+#include "sessiond-trace-chunks.h"
 
 static const char *help_msg =
 #ifdef LTTNG_EMBED_HELP
@@ -85,7 +86,7 @@ NULL
 
 enum relay_connection_status {
        RELAY_CONNECTION_STATUS_OK,
-       /* An error occured while processing an event on the connection. */
+       /* An error occurred while processing an event on the connection. */
        RELAY_CONNECTION_STATUS_ERROR,
        /* Connection closed/shutdown cleanly. */
        RELAY_CONNECTION_STATUS_CLOSED,
@@ -167,6 +168,8 @@ struct lttng_ht *sessions_ht;
 /* Relayd health monitoring */
 struct health_app *health_relayd;
 
+struct sessiond_trace_chunk_registry *sessiond_trace_chunk_registry;
+
 static struct option long_options[] = {
        { "control-port", 1, 0, 'C', },
        { "data-port", 1, 0, 'D', },
@@ -858,14 +861,6 @@ restart:
                        revents = LTTNG_POLL_GETEV(&events, i);
                        pollfd = LTTNG_POLL_GETFD(&events, i);
 
-                       if (!revents) {
-                               /*
-                                * No activity for this FD (poll
-                                * implementation).
-                                */
-                               continue;
-                       }
-
                        /* Thread quit pipe has been closed. Killing thread. */
                        ret = check_thread_quit_pipe(pollfd, revents);
                        if (ret) {
@@ -1099,12 +1094,14 @@ static int relay_create_session(const struct lttcomm_relayd_hdr *recv_hdr,
 {
        int ret = 0;
        ssize_t send_ret;
-       struct relay_session *session;
+       struct relay_session *session = NULL;
        struct lttcomm_relayd_status_session reply;
        char session_name[LTTNG_NAME_MAX];
        char hostname[LTTNG_HOST_NAME_MAX];
        uint32_t live_timer = 0;
        bool snapshot = false;
+       /* Left nil for peers < 2.11. */
+       lttng_uuid sessiond_uuid = {};
 
        memset(session_name, 0, LTTNG_NAME_MAX);
        memset(hostname, 0, LTTNG_HOST_NAME_MAX);
@@ -1121,7 +1118,14 @@ static int relay_create_session(const struct lttcomm_relayd_hdr *recv_hdr,
        } else {
                /* From 2.11 to ... */
                ret = cmd_create_session_2_11(payload, session_name,
-                       hostname, &live_timer, &snapshot);
+                               hostname, &live_timer, &snapshot,
+                               sessiond_uuid);
+               if (lttng_uuid_is_nil(sessiond_uuid)) {
+                       /* The nil UUID is reserved for pre-2.11 clients. */
+                       ERR("Illegal nil UUID announced by peer in create session command");
+                       ret = -1;
+                       goto send_reply;
+               }
        }
 
        if (ret < 0) {
@@ -1129,7 +1133,7 @@ static int relay_create_session(const struct lttcomm_relayd_hdr *recv_hdr,
        }
 
        session = session_create(session_name, hostname, live_timer,
-                       snapshot, conn->major, conn->minor);
+                       snapshot, sessiond_uuid, conn->major, conn->minor);
        if (!session) {
                ret = -1;
                goto send_reply;
@@ -1153,7 +1157,9 @@ send_reply:
                                send_ret);
                ret = -1;
        }
-
+       if (ret < 0 && session) {
+               session_put(session);
+       }
        return ret;
 }
 
@@ -1640,7 +1646,7 @@ int rotate_truncate_stream(struct relay_stream *stream)
 
        /*
         * Rewind the current tracefile to the position at which the rotation
-        * should have occured.
+        * should have occurred.
         */
        lseek_ret = lseek(stream->stream_fd->fd,
                        stream->pos_after_last_complete_data_index, SEEK_SET);
@@ -2973,7 +2979,7 @@ int relay_rotate_pending(const struct lttcomm_relayd_hdr *recv_hdr,
                        rotate_pending = true;
                        DBG("Stream %" PRIu64 " is still rotating",
                                        stream->stream_handle);
-               } else if (stream->current_chunk_id.value < chunk_id) {
+               } else if (stream->current_chunk_id.value <= chunk_id) {
                        /*
                         * Stream closed on the consumer but still active on the
                         * relay.
@@ -3811,14 +3817,6 @@ restart:
 
                        health_code_update();
 
-                       if (!revents) {
-                               /*
-                                * No activity for this FD (poll
-                                * implementation).
-                                */
-                               continue;
-                       }
-
                        /* Thread quit pipe has been closed. Killing thread. */
                        ret = check_thread_quit_pipe(pollfd, revents);
                        if (ret) {
@@ -4130,6 +4128,13 @@ int main(int argc, char **argv)
                }
        }
 
+       sessiond_trace_chunk_registry = sessiond_trace_chunk_registry_create();
+       if (!sessiond_trace_chunk_registry) {
+               ERR("Failed to initialize session daemon trace chunk registry");
+               retval = -1;
+               goto exit_sessiond_trace_chunk_registry;
+       }
+
        /* Initialize thread health monitoring */
        health_relayd = health_app_create(NR_HEALTH_RELAYD_TYPES);
        if (!health_relayd) {
@@ -4279,7 +4284,9 @@ exit_health_quit_pipe:
 
 exit_init_data:
        health_app_destroy(health_relayd);
+       sessiond_trace_chunk_registry_destroy(sessiond_trace_chunk_registry);
 exit_health_app_create:
+exit_sessiond_trace_chunk_registry:
 exit_options:
        /*
         * Wait for all pending call_rcu work to complete before tearing
This page took 0.024902 seconds and 4 git commands to generate.