Save/load: support session trace format
[deliverable/lttng-tools.git] / src / common / config / session-config.cpp
index f9d9d0eca558973a1e649bd4281d2572f9795bd2..351c7f921db7fe2389fd00f685a095c49d6b9979 100644 (file)
@@ -1154,9 +1154,10 @@ end:
        return ret;
 }
 
-static
-int create_snapshot_session(const char *session_name, xmlNodePtr output_node,
-               const struct config_load_session_override_attr *overrides)
+static int create_snapshot_session(const char *session_name,
+               xmlNodePtr output_node,
+               const struct config_load_session_override_attr *overrides,
+               const struct lttng_trace_format_descriptor *trace_format_descriptor)
 {
        int ret;
        enum lttng_error_code ret_code;
@@ -1178,6 +1179,16 @@ int create_snapshot_session(const char *session_name, xmlNodePtr output_node,
                goto end;
        }
 
+       if (trace_format_descriptor != nullptr) {
+               enum lttng_session_descriptor_status s_status;
+               s_status = lttng_session_descriptor_set_trace_format_descriptor(
+                               session_descriptor, trace_format_descriptor);
+               if (s_status != LTTNG_SESSION_DESCRIPTOR_STATUS_OK) {
+                       ret = -LTTNG_ERR_FATAL;
+                       goto end;
+               }
+       }
+
        ret_code = lttng_create_session_ext(session_descriptor);
        if (ret_code != LTTNG_OK) {
                ret = -ret_code;
@@ -1313,11 +1324,11 @@ end:
        return ret;
 }
 
-static
-int create_session(const char *name,
-       xmlNodePtr output_node,
-       uint64_t live_timer_interval,
-       const struct config_load_session_override_attr *overrides)
+static int create_session(const char *name,
+               xmlNodePtr output_node,
+               uint64_t live_timer_interval,
+               const struct config_load_session_override_attr *overrides,
+               const struct lttng_trace_format_descriptor *trace_format_descriptor)
 {
        int ret = 0;
        enum lttng_error_code ret_code;
@@ -1408,6 +1419,16 @@ int create_session(const char *name,
                goto end;
        }
 
+       if (trace_format_descriptor != nullptr) {
+               enum lttng_session_descriptor_status s_status;
+               s_status = lttng_session_descriptor_set_trace_format_descriptor(
+                               session_descriptor, trace_format_descriptor);
+               if (s_status != LTTNG_SESSION_DESCRIPTOR_STATUS_OK) {
+                       ret = -LTTNG_ERR_FATAL;
+                       goto end;
+               }
+       }
+
        ret_code = lttng_create_session_ext(session_descriptor);
        if (ret_code != LTTNG_OK) {
                ret = -ret_code;
@@ -3261,6 +3282,49 @@ end:
        return ret;
 }
 
+/* TODO: this could most probably be moved to a similar scheme to create_from_buffer/payload for the
+ * lttng::trace_format_descriptor object */
+static int process_trace_format_descriptor_node(xmlNodePtr trace_format_descriptor_node,
+               struct lttng_trace_format_descriptor **descriptor)
+{
+       int ret;
+       xmlNodePtr node;
+       struct lttng_trace_format_descriptor *local_descriptor = nullptr;
+       struct lttng_trace_format_descriptor *(*constructor)(void) = nullptr;
+
+       for (node = xmlFirstElementChild(trace_format_descriptor_node); node;
+                       node = xmlNextElementSibling(node)) {
+               if (!strcmp((const char *) node->name, config_element_session_trace_format_ctf1)) {
+                       constructor = lttng_trace_format_ctf_1_descriptor_create;
+                       break;
+               } else if (!strcmp((const char *) node->name,
+                                          config_element_session_trace_format_ctf2)) {
+                       constructor = lttng_trace_format_ctf_2_descriptor_create;
+                       break;
+               }
+       }
+
+       if (constructor == nullptr) {
+               ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
+               goto end;
+       }
+
+       local_descriptor = constructor();
+
+       if (local_descriptor == nullptr) {
+               ret = -LTTNG_ERR_NOMEM;
+               goto end;
+       }
+
+       *descriptor = local_descriptor;
+       local_descriptor = nullptr;
+       ret = 0;
+
+end:
+       lttng_trace_format_descriptor_destroy(local_descriptor);
+       return ret;
+}
+
 static
 int process_session_node(xmlNodePtr session_node, const char *session_name,
                int overwrite,
@@ -3281,6 +3345,7 @@ int process_session_node(xmlNodePtr session_node, const char *session_name,
        struct lttng_domain *jul_domain = NULL;
        struct lttng_domain *log4j_domain = NULL;
        struct lttng_domain *python_domain = NULL;
+       struct lttng_trace_format_descriptor *trace_format_descriptor = nullptr;
 
        for (node = xmlFirstElementChild(session_node); node;
                node = xmlNextElementSibling(node)) {
@@ -3327,6 +3392,13 @@ int process_session_node(xmlNodePtr session_node, const char *session_name,
                        }
 
                        shm_path = node_content;
+               } else if (!trace_format_descriptor &&
+                               !strcmp((const char *) node->name,
+                                               config_element_session_trace_format)) {
+                       ret = process_trace_format_descriptor_node(node, &trace_format_descriptor);
+                       if (ret) {
+                               goto error;
+                       }
                } else {
                        /*
                         * attributes, snapshot_mode, live_timer_interval, rotation_size,
@@ -3482,16 +3554,16 @@ domain_init_error:
 
        /* Create session type depending on output type */
        if (snapshot_mode && snapshot_mode != -1) {
-               ret = create_snapshot_session((const char *) name, output_node,
-                               overrides);
+               ret = create_snapshot_session((const char *) name, output_node, overrides,
+                               trace_format_descriptor);
        } else if (live_timer_interval &&
                live_timer_interval != UINT64_MAX) {
-               ret = create_session((const char *) name,
-                               output_node, live_timer_interval, overrides);
+               ret = create_session((const char *) name, output_node, live_timer_interval,
+                               overrides, trace_format_descriptor);
        } else {
                /* regular session */
-               ret = create_session((const char *) name,
-                               output_node, UINT64_MAX, overrides);
+               ret = create_session((const char *) name, output_node, UINT64_MAX, overrides,
+                               trace_format_descriptor);
        }
        if (ret) {
                goto error;
@@ -3543,6 +3615,7 @@ end:
        }
 
 error:
+       lttng_trace_format_descriptor_destroy(trace_format_descriptor);
        free(kernel_domain);
        free(ust_domain);
        free(jul_domain);
This page took 0.02672 seconds and 5 git commands to generate.