Add live timer and tracefile count/size to list
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index 4b8d82efe255d398d9e5eba605be42d96cec5421..eb516d3b10c7cbf724c7f7b4c4090db24a510274 100644 (file)
@@ -166,6 +166,8 @@ static void list_lttng_channels(int domain, struct ltt_session *session,
                        channels[i].attr.read_timer_interval =
                                uchan->attr.read_timer_interval;
                        channels[i].enabled = uchan->enabled;
+                       channels[i].attr.tracefile_size = uchan->tracefile_size;
+                       channels[i].attr.tracefile_count = uchan->tracefile_count;
                        switch (uchan->attr.output) {
                        case LTTNG_UST_MMAP:
                        default:
@@ -458,6 +460,7 @@ static int add_uri_to_consumer(struct consumer_output *consumer,
                         * URI was the same in the consumer so we do not append the subdir
                         * again so to not duplicate output dir.
                         */
+                       ret = LTTNG_OK;
                        goto error;
                }
 
@@ -822,7 +825,7 @@ static int start_kernel_session(struct ltt_kernel_session *ksess, int wpipe)
        /* Quiescent wait after starting trace */
        kernel_wait_quiescent(kernel_tracer_fd);
 
-       ksess->started = 1;
+       ksess->active = 1;
 
        ret = LTTNG_OK;
 
@@ -915,7 +918,7 @@ int cmd_enable_channel(struct ltt_session *session,
         * Don't try to enable a channel if the session has been started at
         * some point in time before. The tracer does not allow it.
         */
-       if (session->started) {
+       if (session->has_been_started) {
                ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
                goto error;
        }
@@ -938,15 +941,6 @@ int cmd_enable_channel(struct ltt_session *session,
                kchan = trace_kernel_get_channel_by_name(attr->name,
                                session->kernel_session);
                if (kchan == NULL) {
-                       /*
-                        * Don't try to create a channel if the session
-                        * has been started at some point in time
-                        * before. The tracer does not allow it.
-                        */
-                       if (session->started) {
-                               ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
-                               goto error;
-                       }
                        ret = channel_kernel_create(session->kernel_session, attr, wpipe);
                        if (attr->name[0] != '\0') {
                                session->kernel_session->has_non_default_channel = 1;
@@ -970,15 +964,6 @@ int cmd_enable_channel(struct ltt_session *session,
 
                uchan = trace_ust_find_channel_by_name(chan_ht, attr->name);
                if (uchan == NULL) {
-                       /*
-                        * Don't try to create a channel if the session
-                        * has been started at some point in time
-                        * before. The tracer does not allow it.
-                        */
-                       if (session->started) {
-                               ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
-                               goto error;
-                       }
                        ret = channel_ust_create(usess, attr, domain->buf_type);
                        if (attr->name[0] != '\0') {
                                usess->has_non_default_channel = 1;
@@ -1462,7 +1447,7 @@ int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain,
                tmp_dom.type = LTTNG_DOMAIN_UST;
 
                ret = cmd_enable_event(session, &tmp_dom, DEFAULT_JUL_CHANNEL_NAME,
-                       &uevent, NULL, NULL, NULL, wpipe);
+                       &uevent, filter_expression, filter, NULL, wpipe);
                if (ret != LTTNG_OK && ret != LTTNG_ERR_UST_EVENT_ENABLED) {
                        goto error;
                }
@@ -1805,8 +1790,8 @@ int cmd_start_trace(struct ltt_session *session)
        ksession = session->kernel_session;
        usess = session->ust_session;
 
-       if (session->enabled) {
-               /* Already started. */
+       /* Is the session already started? */
+       if (session->active) {
                ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
                goto error;
        }
@@ -1826,8 +1811,6 @@ int cmd_start_trace(struct ltt_session *session)
                goto error;
        }
 
-       session->enabled = 1;
-
        /* Kernel tracing */
        if (ksession != NULL) {
                ret = start_kernel_session(ksession, kernel_tracer_fd);
@@ -1838,7 +1821,11 @@ int cmd_start_trace(struct ltt_session *session)
 
        /* Flag session that trace should start automatically */
        if (usess) {
-               usess->start_trace = 1;
+               /*
+                * Even though the start trace might fail, flag this session active so
+                * other application coming in are started by default.
+                */
+               usess->active = 1;
 
                ret = ust_app_start_trace_all(usess);
                if (ret < 0) {
@@ -1847,7 +1834,9 @@ int cmd_start_trace(struct ltt_session *session)
                }
        }
 
-       session->started = 1;
+       /* Flag this after a successful start. */
+       session->has_been_started = 1;
+       session->active = 1;
 
        ret = LTTNG_OK;
 
@@ -1871,15 +1860,14 @@ int cmd_stop_trace(struct ltt_session *session)
        ksession = session->kernel_session;
        usess = session->ust_session;
 
-       if (!session->enabled) {
+       /* Session is not active. Skip everythong and inform the client. */
+       if (!session->active) {
                ret = LTTNG_ERR_TRACE_ALREADY_STOPPED;
                goto error;
        }
 
-       session->enabled = 0;
-
        /* Kernel tracer */
-       if (ksession && ksession->started) {
+       if (ksession && ksession->active) {
                DBG("Stop kernel tracing");
 
                /* Flush metadata if exist */
@@ -1906,11 +1894,15 @@ int cmd_stop_trace(struct ltt_session *session)
 
                kernel_wait_quiescent(kernel_tracer_fd);
 
-               ksession->started = 0;
+               ksession->active = 0;
        }
 
-       if (usess && usess->start_trace) {
-               usess->start_trace = 0;
+       if (usess && usess->active) {
+               /*
+                * Even though the stop trace might fail, flag this session inactive so
+                * other application coming in are not started by default.
+                */
+               usess->active = 0;
 
                ret = ust_app_stop_trace_all(usess);
                if (ret < 0) {
@@ -1919,6 +1911,8 @@ int cmd_stop_trace(struct ltt_session *session)
                }
        }
 
+       /* Flag inactive after a successful stop. */
+       session->active = 0;
        ret = LTTNG_OK;
 
 error:
@@ -1940,8 +1934,8 @@ int cmd_set_consumer_uri(int domain, struct ltt_session *session,
        assert(uris);
        assert(nb_uri > 0);
 
-       /* Can't enable consumer after session started. */
-       if (session->enabled) {
+       /* Can't set consumer URI if the session is active. */
+       if (session->active) {
                ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
                goto error;
        }
@@ -2508,7 +2502,7 @@ void cmd_list_lttng_sessions(struct lttng_session *sessions, uid_t uid,
 
                strncpy(sessions[i].name, session->name, NAME_MAX);
                sessions[i].name[NAME_MAX - 1] = '\0';
-               sessions[i].enabled = session->enabled;
+               sessions[i].enabled = session->active;
                sessions[i].snapshot_mode = session->snapshot_mode;
                sessions[i].live_timer_interval = session->live_timer;
                i++;
@@ -2528,9 +2522,24 @@ int cmd_data_pending(struct ltt_session *session)
        assert(session);
 
        /* Session MUST be stopped to ask for data availability. */
-       if (session->enabled) {
+       if (session->active) {
                ret = LTTNG_ERR_SESSION_STARTED;
                goto error;
+       } else {
+               /*
+                * If stopped, just make sure we've started before else the above call
+                * will always send that there is data pending.
+                *
+                * The consumer assumes that when the data pending command is received,
+                * the trace has been started before or else no output data is written
+                * by the streams which is a condition for data pending. So, this is
+                * *VERY* important that we don't ask the consumer before a start
+                * trace.
+                */
+               if (!session->has_been_started) {
+                       ret = 0;
+                       goto error;
+               }
        }
 
        if (ksess && ksess->consumer) {
@@ -2961,7 +2970,7 @@ int cmd_snapshot_record(struct ltt_session *session,
        }
 
        /* The session needs to be started at least once. */
-       if (!session->started) {
+       if (!session->has_been_started) {
                ret = LTTNG_ERR_START_SESSION_ONCE;
                goto error;
        }
This page took 0.02698 seconds and 4 git commands to generate.