Skip to content

Commit

Permalink
Fix: sessiond: previously created channel cannot be enabled
Browse files Browse the repository at this point in the history
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 <[email protected]>
Change-Id: I8e7d62b7e97246e65f1cf9022270293a6dd34cc9
Signed-off-by: Jérémie Galarneau <[email protected]>
  • Loading branch information
PSRCode authored and jgalar committed Oct 18, 2021
1 parent aa02346 commit 11ab4ae
Showing 1 changed file with 18 additions and 9 deletions.
27 changes: 18 additions & 9 deletions src/bin/lttng-sessiond/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1387,15 +1387,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
Expand Down Expand Up @@ -1444,6 +1435,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. */
Expand Down Expand Up @@ -1503,6 +1503,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;
Expand Down

0 comments on commit 11ab4ae

Please sign in to comment.