sessiond: introduce cleared_after_last_stop
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 12 Dec 2019 16:55:50 +0000 (11:55 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 19 Dec 2019 23:21:04 +0000 (18:21 -0500)
Track whether a session was cleared after the last stop, so
additional clear will be effect-less until it is started again.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Icaa86acab20081b436bd55d026ec79a10c56034b
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/cmd.c
src/bin/lttng-sessiond/session.h

index 7af855eacb14e13b204730cdd2848f888c3bc352..6f824bf316811c2fa486cb4a661abcca5c5b4c3f 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;
        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);
 
 
        assert(session);
 
@@ -2682,6 +2684,7 @@ int cmd_start_trace(struct ltt_session *session)
 
        session->active = 1;
        session->rotated_after_last_stop = false;
 
        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;
        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;
                /* 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;
 }
        }
        return ret;
 }
@@ -4967,6 +4972,18 @@ int cmd_rotate_session(struct ltt_session *session,
                cmd_ret = LTTNG_ERR_ROTATION_MULTIPLE_AFTER_STOP;
                goto end;
        }
                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);
        if (session->active) {
                new_trace_chunk = session_create_new_trace_chunk(session, NULL,
                                NULL, NULL);
index 3625ece6d4ce5196586c632025cc6567ab06557f..a60354d756ca45f0c5885dfdf53c7e473a0bc0b6 100644 (file)
@@ -173,6 +173,12 @@ struct ltt_session {
         * chunk.
         */
        bool rotated_after_last_stop;
         * chunk.
         */
        bool rotated_after_last_stop;
+       /*
+        * Track whether the session was cleared after last stop. All subsequent
+        * clear (without prior start) will succeed, but will be effect-less. A
+        * subsequent rotate (without prior start) will return an error.
+        */
+       bool cleared_after_last_stop;
        /*
         * Condition and trigger for size-based rotations.
         */
        /*
         * Condition and trigger for size-based rotations.
         */
This page took 0.028666 seconds and 5 git commands to generate.