time_t now = time(NULL);
if (now == (time_t) -1) {
- session->rotation_status = LTTNG_ROTATION_STATUS_ERROR;
+ session->rotation_state = LTTNG_ROTATION_STATE_ERROR;
ret = LTTNG_ERR_UNK;
goto end_unlock_session;
}
goto end_unlock_session;
}
session->rotate_pending = false;
- session->rotation_status = LTTNG_ROTATION_STATUS_COMPLETED;
+ session->rotation_state = LTTNG_ROTATION_STATE_COMPLETED;
session->last_chunk_start_ts = session->current_chunk_start_ts;
if (session->rotate_pending_relay) {
ret = sessiond_timer_rotate_pending_start(
return ret;
}
+/*
+ * Process the rotate_timer, called with session lock held.
+ */
+static
+int rotate_timer(struct ltt_session *session)
+{
+ int ret;
+
+ /*
+ * Complete _at most_ one scheduled rotation on a stopped session.
+ */
+ if (!session->active && session->rotate_timer_enabled &&
+ session->rotated_after_last_stop) {
+ ret = 0;
+ goto end;
+ }
+
+ /* Ignore this timer if a rotation is already in progress. */
+ if (session->rotate_pending || session->rotate_pending_relay) {
+ ret = 0;
+ goto end;
+ }
+
+ DBG("[rotation-thread] Rotate timer on session %s", session->name);
+
+ ret = cmd_rotate_session(session, NULL);
+ if (ret == -LTTNG_ERR_ROTATION_PENDING) {
+ DBG("Scheduled rotation aborted since a rotation is already in progress");
+ ret = 0;
+ goto end;
+ } else if (ret != LTTNG_OK) {
+ ERR("[rotation-thread] Automatic time-triggered rotation failed with error code %i", ret);
+ ret = -1;
+ goto end;
+ }
+
+ ret = 0;
+
+end:
+ return ret;
+}
+
static
int handle_rotate_timer_pipe(uint32_t revents,
struct rotation_thread_handle *handle,
if (timer_data->signal == LTTNG_SESSIOND_SIG_ROTATE_PENDING) {
ret = rotate_pending_relay_timer(session);
+ } else if (timer_data->signal == LTTNG_SESSIOND_SIG_ROTATE_TIMER) {
+ ret = rotate_timer(session);
} else {
ERR("Unknown signal in rotate timer %d", timer_data->signal);
ret = -1;