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;
}
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) {
}
kernel_wait_quiescent(kernel_tracer_fd);
-
- /*
- * If the session was previously started, start as well this newly
- * created kernel session so the events/channels enabled *after* the
- * start actually work.
- */
- if (session->started && !session->kernel_session->started) {
- ret = start_kernel_session(session->kernel_session, wpipe);
- if (ret != LTTNG_OK) {
- goto error;
- }
- }
break;
}
case LTTNG_DOMAIN_UST:
} else {
ret = channel_ust_enable(usess, uchan);
}
-
- /* Start the UST session if the session was already started. */
- if (session->started && !usess->start_trace) {
- ret = ust_app_start_trace_all(usess);
- if (ret < 0) {
- ret = LTTNG_ERR_UST_START_FAIL;
- goto error;
- }
- ret = LTTNG_OK;
- usess->start_trace = 1;
- }
break;
}
default:
int cmd_add_context(struct ltt_session *session, int domain,
char *channel_name, struct lttng_event_context *ctx, int kwpipe)
{
- int ret;
+ int ret, chan_kern_created = 0, chan_ust_created = 0;
switch (domain) {
case LTTNG_DOMAIN_KERNEL:
if (ret != LTTNG_OK) {
goto error;
}
+ chan_kern_created = 1;
}
/* Add kernel context to kernel tracer */
goto error;
}
free(attr);
+ chan_ust_created = 1;
}
ret = context_ust_add(usess, domain, ctx, channel_name);
goto error;
}
- ret = LTTNG_OK;
+ return LTTNG_OK;
error:
+ if (chan_kern_created) {
+ struct ltt_kernel_channel *kchan =
+ trace_kernel_get_channel_by_name(DEFAULT_CHANNEL_NAME,
+ session->kernel_session);
+ /* Created previously, this should NOT fail. */
+ assert(kchan);
+ kernel_destroy_channel(kchan);
+ }
+
+ if (chan_ust_created) {
+ struct ltt_ust_channel *uchan =
+ trace_ust_find_channel_by_name(
+ session->ust_session->domain_global.channels,
+ DEFAULT_CHANNEL_NAME);
+ /* Created previously, this should NOT fail. */
+ assert(uchan);
+ /* Remove from the channel list of the session. */
+ trace_ust_delete_channel(session->ust_session->domain_global.channels,
+ uchan);
+ trace_ust_destroy_channel(uchan);
+ }
return ret;
}
session->enabled = 0;
/* Kernel tracer */
- if (ksession) {
+ if (ksession && ksession->started) {
DBG("Stop kernel tracing");
/* Flush metadata if exist */
ksession->started = 0;
}
- if (usess) {
+ if (usess && usess->start_trace) {
usess->start_trace = 0;
ret = ust_app_stop_trace_all(usess);
}
}
- session->started = 0;
-
ret = LTTNG_OK;
error: