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);
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;
/* 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;
}
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.
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);