From b02f5986773579a5a331d3e108ba52ec9acde2e1 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 12 Dec 2019 11:55:50 -0500 Subject: [PATCH] sessiond: introduce cleared_after_last_stop MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Change-Id: Icaa86acab20081b436bd55d026ec79a10c56034b Signed-off-by: Jérémie Galarneau --- src/bin/lttng-sessiond/cmd.c | 17 +++++++++++++++++ src/bin/lttng-sessiond/session.h | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c index 7af855eac..6f824bf31 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -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; } @@ -4967,6 +4972,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); diff --git a/src/bin/lttng-sessiond/session.h b/src/bin/lttng-sessiond/session.h index 3625ece6d..a60354d75 100644 --- a/src/bin/lttng-sessiond/session.h +++ b/src/bin/lttng-sessiond/session.h @@ -173,6 +173,12 @@ struct ltt_session { * 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. */ -- 2.34.1