X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Frotation-thread.c;h=ecccc7bb01ab00bbbba7dd71675b88a7f4b08e3d;hp=9e599e48999c90808f4861414c13f49286861925;hb=259c267446a63c501298f39a5d2397314b11f729;hpb=f5eeb9d734eb6727a2ee04f08e3eedf9827ed66f diff --git a/src/bin/lttng-sessiond/rotation-thread.c b/src/bin/lttng-sessiond/rotation-thread.c index 9e599e489..ecccc7bb0 100644 --- a/src/bin/lttng-sessiond/rotation-thread.c +++ b/src/bin/lttng-sessiond/rotation-thread.c @@ -435,6 +435,48 @@ end: 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, @@ -504,6 +546,8 @@ int handle_rotate_timer_pipe(uint32_t revents, 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;