case LTTNG_REGISTER_TRIGGER:
case LTTNG_UNREGISTER_TRIGGER:
case LTTNG_ROTATE_SESSION:
- case LTTNG_ROTATE_PENDING:
- case LTTNG_ROTATE_GET_CURRENT_PATH:
+ case LTTNG_ROTATION_GET_INFO:
+ case LTTNG_SESSION_GET_CURRENT_OUTPUT:
+ case LTTNG_ROTATION_SET_SCHEDULE:
+ case LTTNG_ROTATION_SCHEDULE_GET_TIMER_PERIOD:
+ case LTTNG_ROTATION_SCHEDULE_GET_SIZE:
need_domain = 0;
break;
default:
case LTTNG_LIST_TRACKER_PIDS:
case LTTNG_DATA_PENDING:
case LTTNG_ROTATE_SESSION:
- case LTTNG_ROTATE_PENDING:
+ case LTTNG_ROTATION_GET_INFO:
+ case LTTNG_ROTATION_SCHEDULE_GET_TIMER_PERIOD:
+ case LTTNG_ROTATION_SCHEDULE_GET_SIZE:
break;
default:
/* Setup lttng message with no payload */
}
case LTTNG_START_TRACE:
{
+ /*
+ * On the first start, if we have a kernel session and we have
+ * enabled time or size-based rotations, we have to make sure
+ * the kernel tracer supports it.
+ */
+ if (!cmd_ctx->session->has_been_started && \
+ cmd_ctx->session->kernel_session && \
+ (cmd_ctx->session->rotate_timer_period || \
+ cmd_ctx->session->rotate_size) && \
+ !check_rotate_compatible()) {
+ DBG("Kernel tracer version is not compatible with the rotation feature");
+ ret = LTTNG_ERR_ROTATION_WRONG_VERSION;
+ goto error;
+ }
ret = cmd_start_trace(cmd_ctx->session);
break;
}
DBG("Client rotate session \"%s\"", cmd_ctx->session->name);
+ memset(&rotate_return, 0, sizeof(rotate_return));
if (cmd_ctx->session->kernel_session && !check_rotate_compatible()) {
DBG("Kernel tracer version is not compatible with the rotation feature");
ret = LTTNG_ERR_ROTATION_WRONG_VERSION;
ret = LTTNG_OK;
break;
}
- case LTTNG_ROTATE_PENDING:
+ case LTTNG_ROTATION_GET_INFO:
{
- struct lttng_rotate_pending_return *pending_return = NULL;
+ struct lttng_rotation_get_info_return get_info_return;
+
+ memset(&get_info_return, 0, sizeof(get_info_return));
+ ret = cmd_rotate_get_info(cmd_ctx->session, &get_info_return,
+ cmd_ctx->lsm->u.get_rotation_info.rotation_id);
+ if (ret < 0) {
+ ret = -ret;
+ goto error;
+ }
+
+ ret = setup_lttng_msg_no_cmd_header(cmd_ctx, &get_info_return,
+ sizeof(get_info_return));
+ if (ret < 0) {
+ ret = -ret;
+ goto error;
+ }
+
+ ret = LTTNG_OK;
+ break;
+ }
+ case LTTNG_SESSION_GET_CURRENT_OUTPUT:
+ {
+ struct lttng_session_get_current_output_return output_return;
+
+ memset(&output_return, 0, sizeof(output_return));
+ ret = cmd_session_get_current_output(cmd_ctx->session,
+ &output_return);
+ if (ret < 0) {
+ ret = -ret;
+ goto error;
+ }
- ret = cmd_rotate_pending(cmd_ctx->session, &pending_return,
- cmd_ctx->lsm->u.rotate_pending.rotate_id);
+ ret = setup_lttng_msg_no_cmd_header(cmd_ctx, &output_return,
+ sizeof(output_return));
if (ret < 0) {
ret = -ret;
goto error;
}
- ret = setup_lttng_msg_no_cmd_header(cmd_ctx, pending_return,
- sizeof(struct lttng_rotate_session_handle));
- free(pending_return);
+ ret = LTTNG_OK;
+ break;
+ }
+ case LTTNG_ROTATION_SET_SCHEDULE:
+ {
+ if (cmd_ctx->session->kernel_session && !check_rotate_compatible()) {
+ DBG("Kernel tracer version does not support session rotations");
+ ret = LTTNG_ERR_ROTATION_WRONG_VERSION;
+ goto error;
+ }
+
+ ret = cmd_rotation_set_schedule(cmd_ctx->session,
+ cmd_ctx->lsm->u.rotate_setup.timer_us,
+ cmd_ctx->lsm->u.rotate_setup.size);
if (ret < 0) {
ret = -ret;
goto error;
ret = LTTNG_OK;
break;
}
- case LTTNG_ROTATE_GET_CURRENT_PATH:
+ case LTTNG_ROTATION_SCHEDULE_GET_TIMER_PERIOD:
{
- struct lttng_rotate_get_current_path *get_return = NULL;
+ struct lttng_rotation_schedule_get_timer_period *get_timer;
- ret = cmd_rotate_get_current_path(cmd_ctx->session, &get_return);
+ get_timer = zmalloc(sizeof(struct lttng_rotation_schedule_get_timer_period));
+ if (!get_timer) {
+ ret = ENOMEM;
+ goto error;
+ }
+ get_timer->rotate_timer = cmd_ctx->session->rotate_timer_period;
+
+ ret = setup_lttng_msg_no_cmd_header(cmd_ctx, get_timer,
+ sizeof(struct lttng_rotation_schedule_get_timer_period));
+ free(get_timer);
if (ret < 0) {
ret = -ret;
goto error;
}
- ret = setup_lttng_msg_no_cmd_header(cmd_ctx, get_return,
- sizeof(struct lttng_rotate_get_current_path));
- free(get_return);
+ ret = LTTNG_OK;
+ break;
+ }
+ case LTTNG_ROTATION_SCHEDULE_GET_SIZE:
+ {
+ struct lttng_rotation_schedule_get_size *get_size;
+
+ get_size = zmalloc(sizeof(struct lttng_rotation_schedule_get_size));
+ if (!get_size) {
+ ret = ENOMEM;
+ goto error;
+ }
+ get_size->rotate_size = cmd_ctx->session->rotate_size;
+
+ ret = setup_lttng_msg_no_cmd_header(cmd_ctx, get_size,
+ sizeof(struct lttng_rotation_schedule_get_size));
+ free(get_size);
if (ret < 0) {
ret = -ret;
goto error;