Propagate trace format to relayd on session creation
[lttng-tools.git] / src / bin / lttng-relayd / main.cpp
index 5c4792bfae688544dfb843c582b1f1bdffafebeb..d217b9def238a6f1c7a80f5634b1838349a41ac0 100644 (file)
@@ -9,14 +9,19 @@
  */
 
 #define _LGPL_SOURCE
+#include <algorithm>
+#include <ctype.h>
+#include <fcntl.h>
 #include <getopt.h>
 #include <grp.h>
+#include <inttypes.h>
 #include <limits.h>
 #include <pthread.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <strings.h>
 #include <sys/mman.h>
 #include <sys/mount.h>
 #include <sys/resource.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/wait.h>
-#include <sys/resource.h>
-#include <inttypes.h>
+#include <unistd.h>
 #include <urcu/futex.h>
-#include <urcu/uatomic.h>
 #include <urcu/rculist.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <strings.h>
-#include <ctype.h>
-#include <algorithm>
+#include <urcu/uatomic.h>
 
-#include <lttng/lttng.h>
+#include <common/align.hpp>
+#include <common/buffer-view.hpp>
 #include <common/common.hpp>
-#include <common/compat/poll.hpp>
-#include <common/compat/socket.hpp>
 #include <common/compat/endian.hpp>
 #include <common/compat/getenv.hpp>
-#include <common/defaults.hpp>
+#include <common/compat/poll.hpp>
+#include <common/compat/socket.hpp>
 #include <common/daemonize.hpp>
+#include <common/defaults.hpp>
+#include <common/dynamic-buffer.hpp>
+#include <common/fd-tracker/fd-tracker.hpp>
+#include <common/fd-tracker/utils.hpp>
 #include <common/futex.hpp>
-#include <common/sessiond-comm/sessiond-comm.hpp>
+#include <common/ini-config/ini-config.hpp>
+#include <common/path.hpp>
 #include <common/sessiond-comm/inet.hpp>
 #include <common/sessiond-comm/relayd.hpp>
+#include <common/sessiond-comm/sessiond-comm.hpp>
+#include <common/string-utils/format.hpp>
 #include <common/uri.hpp>
 #include <common/utils.hpp>
-#include <common/path.hpp>
-#include <common/align.hpp>
-#include <common/ini-config/ini-config.hpp>
-#include <common/dynamic-buffer.hpp>
-#include <common/buffer-view.hpp>
-#include <common/string-utils/format.hpp>
-#include <common/fd-tracker/fd-tracker.hpp>
-#include <common/fd-tracker/utils.hpp>
+#include <lttng/lttng.h>
+#include <lttng/trace-format-descriptor-internal.hpp>
 
 #include "backward-compatibility-group-by.hpp"
 #include "cmd.hpp"
@@ -1401,15 +1401,15 @@ static bool session_streams_have_index(const struct relay_session *session)
  *
  * On success, send back the session id or else return a negative value.
  */
-static int relay_create_session(
-               const struct lttcomm_relayd_hdr *recv_hdr __attribute__((unused)),
+static int relay_create_session(const struct lttcomm_relayd_hdr *recv_hdr __attribute__((unused)),
                struct relay_connection *conn,
                const struct lttng_buffer_view *payload)
 {
        int ret = 0;
+       enum lttng_error_code ret_code;
        ssize_t send_ret;
        struct relay_session *session = NULL;
-       struct lttcomm_relayd_create_session_reply_2_11 reply = {};
+       lttcomm_relayd_create_session_reply_2_15 reply = {};
        char session_name[LTTNG_NAME_MAX] = {};
        char hostname[LTTNG_HOST_NAME_MAX] = {};
        uint32_t live_timer = 0;
@@ -1421,6 +1421,9 @@ static int relay_create_session(
        LTTNG_OPTIONAL(uint64_t) id_sessiond = {};
        LTTNG_OPTIONAL(uint64_t) current_chunk_id = {};
        LTTNG_OPTIONAL(time_t) creation_time = {};
+       /* The default trace format is CTF1 */
+       enum relayd_trace_format trace_format = RELAYD_TRACE_FORMAT_CTF_1;
+
        struct lttng_dynamic_buffer reply_payload;
 
        lttng_dynamic_buffer_init(&reply_payload);
@@ -1430,9 +1433,10 @@ static int relay_create_session(
                ret = 0;
        } else if (conn->minor >= 4 && conn->minor < 11) {
                /* From 2.4 to 2.10 */
-               ret = cmd_create_session_2_4(payload, session_name,
-                       hostname, &live_timer, &snapshot);
-       } else {
+               ret = cmd_create_session_2_4(
+                               payload, session_name, hostname, &live_timer, &snapshot);
+       } else if (conn->minor >= 11 && conn->minor < 15) {
+               /* From 2.11 to 2.15 */
                bool has_current_chunk;
                uint64_t current_chunk_id_value;
                time_t creation_time_value;
@@ -1447,9 +1451,33 @@ static int relay_create_session(
                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;
+                       ret_code = LTTNG_ERR_FATAL;
+                       goto send_reply;
+               }
+               LTTNG_OPTIONAL_SET(&id_sessiond, id_sessiond_value);
+               LTTNG_OPTIONAL_SET(&creation_time, creation_time_value);
+               if (has_current_chunk) {
+                       LTTNG_OPTIONAL_SET(&current_chunk_id, current_chunk_id_value);
+               }
+       } else {
+               /* From 2.15 to ... */
+               bool has_current_chunk;
+               uint64_t current_chunk_id_value;
+               time_t creation_time_value;
+               uint64_t id_sessiond_value;
+
+               /* From 2.11 to ... */
+               ret = cmd_create_session_2_15(payload, session_name, hostname, base_path,
+                               &live_timer, &snapshot, &id_sessiond_value, sessiond_uuid,
+                               &has_current_chunk, &current_chunk_id_value, &creation_time_value,
+                               &session_name_contains_creation_timestamp, trace_format);
+               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_code = LTTNG_ERR_FATAL;
                        goto send_reply;
                }
+
                LTTNG_OPTIONAL_SET(&id_sessiond, id_sessiond_value);
                LTTNG_OPTIONAL_SET(&creation_time, creation_time_value);
                if (has_current_chunk) {
@@ -1459,32 +1487,38 @@ static int relay_create_session(
        }
 
        if (ret < 0) {
+               ret_code = LTTNG_ERR_FATAL;
+               goto send_reply;
+       }
+
+       /*
+        * Trace format check. TODO: move to a separate function or inside
+        * session create?
+        */
+       if (trace_format == RELAYD_TRACE_FORMAT_CTF_2 && !opt_allow_ctf2) {
+               ret_code = LTTNG_ERR_TRACE_FORMAT_UNSUPPORTED_RELAY_DAEMON;
                goto send_reply;
        }
 
-       session = session_create(session_name, hostname, base_path, live_timer,
-                       snapshot, sessiond_uuid,
-                       id_sessiond.is_set ? &id_sessiond.value : NULL,
+       session = session_create(session_name, hostname, base_path, live_timer, snapshot,
+                       sessiond_uuid, id_sessiond.is_set ? &id_sessiond.value : NULL,
                        current_chunk_id.is_set ? &current_chunk_id.value : NULL,
-                       creation_time.is_set ? &creation_time.value : NULL,
-                       conn->major, conn->minor,
-                       session_name_contains_creation_timestamp);
+                       creation_time.is_set ? &creation_time.value : NULL, conn->major,
+                       conn->minor, session_name_contains_creation_timestamp, trace_format);
        if (!session) {
-               ret = -1;
+               ret_code = LTTNG_ERR_FATAL;
                goto send_reply;
        }
+
        LTTNG_ASSERT(!conn->session);
        conn->session = session;
        DBG("Created session %" PRIu64, session->id);
 
        reply.generic.session_id = htobe64(session->id);
+       ret_code = LTTNG_OK;
 
 send_reply:
-       if (ret < 0) {
-               reply.generic.ret_code = htobe32(LTTNG_ERR_FATAL);
-       } else {
-               reply.generic.ret_code = htobe32(LTTNG_OK);
-       }
+       reply.generic.ret_code = htobe32(ret_code);
 
        if (conn->minor < 11) {
                /* From 2.1 to 2.10 */
@@ -1496,8 +1530,8 @@ send_reply:
                        goto end;
                }
        } else {
-               const uint32_t output_path_length =
-                               session ? strlen(session->output_path) + 1 : 0;
+               /* From 2.11 to ... */
+               const uint32_t output_path_length = session ? strlen(session->output_path) + 1 : 0;
 
                reply.output_path_length = htobe32(output_path_length);
                ret = lttng_dynamic_buffer_append(
This page took 0.027955 seconds and 5 git commands to generate.