Fix: don't set enabled flag is session start fails
authorDavid Goulet <dgoulet@efficios.com>
Tue, 25 Mar 2014 16:14:01 +0000 (12:14 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Thu, 10 Jul 2014 19:26:52 +0000 (15:26 -0400)
The "started" var. is changed to the flag "has_been_started" indicating
if at least ONE start command has been seen.

The "enabled" var. is changed to the flag "active" and the semantic is
the same.

Backported from master.

Signed-off-by: David Goulet <dgoulet@efficios.com>
Fixes #801

Conflicts:
src/bin/lttng-sessiond/cmd.c

src/bin/lttng-sessiond/cmd.c
src/bin/lttng-sessiond/session.h

index c1f5a4e70b7ce83545ce0858db2f781b563fdc26..14390f3ec3951e2b031226d4bb81740c16418b4b 100644 (file)
@@ -850,6 +850,15 @@ int cmd_enable_channel(struct ltt_session *session,
 
        rcu_read_lock();
 
+       /*
+        * 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->has_been_started) {
+               ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
+               goto error;
+       }
+
        /*
         * The ringbuffer (both in user space and kernel) behave badly in overwrite
         * mode and with less than 2 subbuf so block it right away and send back an
@@ -868,15 +877,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;
@@ -900,15 +900,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;
@@ -1603,8 +1594,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;
        }
@@ -1624,8 +1615,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);
@@ -1645,7 +1634,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;
 
@@ -1669,13 +1660,12 @@ 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) {
                DBG("Stop kernel tracing");
@@ -1717,6 +1707,8 @@ int cmd_stop_trace(struct ltt_session *session)
                }
        }
 
+       /* Flag inactive after a successful stop. */
+       session->active = 0;
        ret = LTTNG_OK;
 
 error:
@@ -1738,8 +1730,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;
        }
@@ -2300,7 +2292,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;
                i++;
        }
@@ -2319,7 +2311,7 @@ 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 {
@@ -2333,7 +2325,7 @@ int cmd_data_pending(struct ltt_session *session)
                 * *VERY* important that we don't ask the consumer before a start
                 * trace.
                 */
-               if (!session->started) {
+               if (!session->has_been_started) {
                        ret = 0;
                        goto error;
                }
@@ -2765,7 +2757,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;
        }
index 0fd2fb16a4dc416c73784611300085651ce857fc..f0e7bdb0ec0b5b924e0caff1232f6fc17b310be6 100644 (file)
@@ -68,7 +68,6 @@ struct ltt_session {
         */
        pthread_mutex_t lock;
        struct cds_list_head list;
-       int enabled;    /* enabled/started flag */
        uint64_t id;            /* session unique identifier */
        /* UID/GID of the user owning the session */
        uid_t uid;
@@ -86,8 +85,13 @@ struct ltt_session {
         */
        struct consumer_output *consumer;
 
-       /* Did a start command occured before the kern/ust session creation? */
-       unsigned int started;
+       /* Did at least ONE start command has been triggered?. */
+       unsigned int has_been_started:1;
+       /*
+        * Is the session active? Start trace command sets this to 1 and the stop
+        * command reset it to 0.
+        */
+       unsigned int active:1;
 
        /* Snapshot representation in a session. */
        struct snapshot snapshot;
This page took 0.030707 seconds and 4 git commands to generate.