X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fmain.c;h=cec3a504a01371aed72f81f419f43a66539ba162;hb=fc58be13f62e691645dd75d56ce26d2e121b13e0;hp=1d9ca91c5fc3b751d061fbcb3f543fcd52626f6b;hpb=5c408ad8ef08a226c018702aca969536f36ac4e5;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index 1d9ca91c5..cec3a504a 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -2964,8 +2964,11 @@ static int process_client_msg(struct command_ctx *cmd_ctx, int sock, 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: @@ -3009,7 +3012,9 @@ static int process_client_msg(struct command_ctx *cmd_ctx, int sock, 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 */ @@ -3701,6 +3706,20 @@ error_add_context: } 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; } @@ -4104,6 +4123,7 @@ error_add_context: 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; @@ -4126,20 +4146,61 @@ error_add_context: 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; @@ -4148,19 +4209,42 @@ error_add_context: 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;