sessiond: snapshot: set trace chunk to NULL before closing it
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index 7af855eacb14e13b204730cdd2848f888c3bc352..53850f74aae784b97a668f30c429c92cca8858be 100644 (file)
@@ -2636,6 +2636,8 @@ int cmd_start_trace(struct ltt_session *session)
        struct ltt_ust_session *usess;
        const bool session_rotated_after_last_stop =
                        session->rotated_after_last_stop;
+       const bool session_cleared_after_last_stop =
+                       session->cleared_after_last_stop;
 
        assert(session);
 
@@ -2682,6 +2684,7 @@ int cmd_start_trace(struct ltt_session *session)
 
        session->active = 1;
        session->rotated_after_last_stop = false;
+       session->cleared_after_last_stop = false;
        if (session->output_traces && !session->current_trace_chunk) {
                if (!session->has_been_started) {
                        struct lttng_trace_chunk *trace_chunk;
@@ -2770,6 +2773,8 @@ error:
                /* Restore initial state on error. */
                session->rotated_after_last_stop =
                                session_rotated_after_last_stop;
+               session->cleared_after_last_stop =
+                               session_cleared_after_last_stop;
        }
        return ret;
 }
@@ -3323,9 +3328,7 @@ int cmd_destroy_session(struct ltt_session *session,
                session->rotate_size = 0;
        }
 
-       if (session->most_recent_chunk_id.is_set &&
-                       session->most_recent_chunk_id.value != 0 &&
-                       session->current_trace_chunk && session->output_traces) {
+       if (session->rotated && session->current_trace_chunk && session->output_traces) {
                /*
                 * Perform a last rotation on destruction if rotations have
                 * occurred during the session's lifetime.
@@ -4710,7 +4713,13 @@ enum lttng_error_code snapshot_record(struct ltt_session *session,
                }
        }
 
-       if (session_close_trace_chunk(session, session->current_trace_chunk,
+       if (session_set_trace_chunk(session, NULL, &snapshot_trace_chunk)) {
+               ERR("Failed to release the current trace chunk of session \"%s\"",
+                               session->name);
+               ret_code = LTTNG_ERR_UNK;
+       }
+
+       if (session_close_trace_chunk(session, snapshot_trace_chunk,
                        LTTNG_TRACE_CHUNK_COMMAND_TYPE_NO_OPERATION, NULL)) {
                /*
                 * Don't goto end; make sure the chunk is closed for the session
@@ -4720,11 +4729,6 @@ enum lttng_error_code snapshot_record(struct ltt_session *session,
                                session->name);
                ret_code = LTTNG_ERR_CLOSE_TRACE_CHUNK_FAIL_CONSUMER;
        }
-       if (session_set_trace_chunk(session, NULL, NULL)) {
-               ERR("Failed to release the current trace chunk of session \"%s\"",
-                               session->name);
-               ret_code = LTTNG_ERR_UNK;
-       }
 error:
        if (original_ust_consumer_output) {
                session->ust_session->consumer = original_ust_consumer_output;
@@ -4967,6 +4971,18 @@ int cmd_rotate_session(struct ltt_session *session,
                cmd_ret = LTTNG_ERR_ROTATION_MULTIPLE_AFTER_STOP;
                goto end;
        }
+
+       /*
+        * After a stop followed by a clear, disallow following rotations a they would
+        * generate empty chunks.
+        */
+       if (session->cleared_after_last_stop) {
+               DBG("Session \"%s\" was already cleared after stop, refusing rotation",
+                               session->name);
+               cmd_ret = LTTNG_ERR_ROTATION_AFTER_STOP_CLEAR;
+               goto end;
+       }
+
        if (session->active) {
                new_trace_chunk = session_create_new_trace_chunk(session, NULL,
                                NULL, NULL);
This page took 0.024605 seconds and 4 git commands to generate.