Fix: channels can be _enabled_ after tracing is started, but not created
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index bba77023a6415ff0b52e9f0dcfde6729c5a0856f..5d375a179106fe495552488f2525b07582af09a9 100644 (file)
@@ -606,10 +606,11 @@ close_sock:
 error:
        if (ret != LTTNG_OK) {
                /*
-                * On error, nullify the consumer sequence index so streams are not
-                * associated with it once sent to the consumer.
+                * The consumer output for this session should not be used anymore
+                * since the relayd connection failed thus making any tracing or/and
+                * streaming not usable.
                 */
-               uatomic_set(&consumer->net_seq_index, -1);
+               consumer->enabled = 0;
        }
        return ret;
 }
@@ -856,15 +857,6 @@ int cmd_enable_channel(struct ltt_session *session,
 
        DBG("Enabling channel %s for session %s", attr->name, session->name);
 
-       /*
-        * 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) {
-               ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
-               goto error;
-       }
-
        rcu_read_lock();
 
        switch (domain->type) {
@@ -875,6 +867,15 @@ 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);
                } else {
                        ret = channel_kernel_enable(session->kernel_session, kchan);
@@ -895,6 +896,15 @@ 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);
                } else {
                        ret = channel_ust_enable(usess, uchan);
This page took 0.02517 seconds and 4 git commands to generate.