Fix: sessiond: previously created channel cannot be enabled
authorJonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Thu, 7 Oct 2021 20:19:41 +0000 (16:19 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 15 Oct 2021 16:01:50 +0000 (12:01 -0400)
Observed issue
==============

A previously created channel cannot be enabled back once a session is
started.

Cause
=====

The check validating that the session was started is to early in the
`cmd_enable_channel` function.

Solution
========

Move the check at the creation code path when the channel is not found.

Known drawbacks
=========

None.

Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Change-Id: I8e7d62b7e97246e65f1cf9022270293a6dd34cc9
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/cmd.c

index 1c660c6128ac186a6f4d8c0e7b593c443795d693..2c0fa462d38fe63a728679b0dc3072ae6e88502a 100644 (file)
@@ -1386,15 +1386,6 @@ 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;
-       }
-
        /*
         * If the session is a live session, remove the switch timer, the
         * live timer does the same thing but sends also synchronisation
@@ -1443,6 +1434,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->has_been_started) {
+                               ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
+                               goto error;
+                       }
+
                        if (session->snapshot.nb_output > 0 ||
                                        session->snapshot_mode) {
                                /* Enforce mmap output for snapshot sessions. */
@@ -1502,6 +1502,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->has_been_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;
This page took 0.027382 seconds and 4 git commands to generate.