Rotate timer
[lttng-tools.git] / src / bin / lttng-sessiond / main.c
index 1d9ca91c5fc3b751d061fbcb3f543fcd52626f6b..5e4148fb6e707fc653dfa3cea4f0c883c8bd0f7f 100644 (file)
@@ -2964,8 +2964,9 @@ 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:
                need_domain = 0;
                break;
        default:
@@ -3009,7 +3010,7 @@ 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:
                break;
        default:
                /* Setup lttng message with no payload */
@@ -3701,6 +3702,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 +4119,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 +4142,20 @@ 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;
 
-               ret = cmd_rotate_pending(cmd_ctx->session, &pending_return,
-                               cmd_ctx->lsm->u.rotate_pending.rotate_id);
+               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, pending_return,
-                               sizeof(struct lttng_rotate_session_handle));
-               free(pending_return);
+               ret = setup_lttng_msg_no_cmd_header(cmd_ctx, &get_info_return,
+                               sizeof(get_info_return));
                if (ret < 0) {
                        ret = -ret;
                        goto error;
@@ -4148,19 +4164,39 @@ error_add_context:
                ret = LTTNG_OK;
                break;
        }
-       case LTTNG_ROTATE_GET_CURRENT_PATH:
+       case LTTNG_SESSION_GET_CURRENT_OUTPUT:
        {
-               struct lttng_rotate_get_current_path *get_return = NULL;
+               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_get_current_path(cmd_ctx->session, &get_return);
+               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, get_return,
-                               sizeof(struct lttng_rotate_get_current_path));
-               free(get_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;
This page took 0.025299 seconds and 4 git commands to generate.