tmp_urls, kdata_port, tmp_uurl, udata_port);
} else {
int dport;
- if (kuri) {
+ if (kuri || (!kuri && !uuri)) {
dport = kdata_port;
} else {
/* No kernel URI, use the UST port. */
case LTTNG_DST_IPV6:
DBG2("Setting network URI to consumer");
- consumer->type = CONSUMER_DST_NET;
-
- if ((uri->stype == LTTNG_STREAM_CONTROL &&
+ if (consumer->type == CONSUMER_DST_NET) {
+ if ((uri->stype == LTTNG_STREAM_CONTROL &&
consumer->dst.net.control_isset) ||
(uri->stype == LTTNG_STREAM_DATA &&
consumer->dst.net.data_isset)) {
- ret = LTTNG_ERR_URL_EXIST;
- goto error;
+ ret = LTTNG_ERR_URL_EXIST;
+ goto error;
+ }
+ } else {
+ memset(&consumer->dst.net, 0, sizeof(consumer->dst.net));
}
+ consumer->type = CONSUMER_DST_NET;
+
/* Set URI into consumer output object */
ret = consumer_set_network_uri(consumer, uri);
if (ret < 0) {
- ret = LTTNG_ERR_FATAL;
+ ret = -ret;
goto error;
} else if (ret == 1) {
/*
break;
}
+ ret = LTTNG_OK;
+
error:
return ret;
}
* On success, the relayd_sock pointer is set to the created socket.
* Else, it's stays untouched and a lttcomm error code is returned.
*/
-static int create_connect_relayd(struct consumer_output *output,
- const char *session_name, struct lttng_uri *uri,
- struct lttcomm_sock **relayd_sock)
+static int create_connect_relayd(struct lttng_uri *uri,
+ struct lttcomm_relayd_sock **relayd_sock)
{
int ret;
- struct lttcomm_sock *sock;
-
- /* Create socket object from URI */
- sock = lttcomm_alloc_sock_from_uri(uri);
- if (sock == NULL) {
- ret = LTTNG_ERR_FATAL;
- goto error;
- }
+ struct lttcomm_relayd_sock *rsock;
- ret = lttcomm_create_sock(sock);
- if (ret < 0) {
+ rsock = lttcomm_alloc_relayd_sock(uri, RELAYD_VERSION_COMM_MAJOR,
+ RELAYD_VERSION_COMM_MINOR);
+ if (!rsock) {
ret = LTTNG_ERR_FATAL;
goto error;
}
* state to be in poll execution.
*/
health_poll_entry();
- ret = relayd_connect(sock);
+ ret = relayd_connect(rsock);
health_poll_exit();
if (ret < 0) {
ERR("Unable to reach lttng-relayd");
DBG3("Creating relayd stream socket from URI");
/* Check relayd version */
- ret = relayd_version_check(sock, RELAYD_VERSION_COMM_MAJOR,
- RELAYD_VERSION_COMM_MINOR);
+ ret = relayd_version_check(rsock);
if (ret < 0) {
ret = LTTNG_ERR_RELAYD_VERSION_FAIL;
goto close_sock;
goto close_sock;
}
- *relayd_sock = sock;
+ *relayd_sock = rsock;
return LTTNG_OK;
close_sock:
- if (sock) {
- (void) relayd_close(sock);
- }
+ /* The returned value is not useful since we are on an error path. */
+ (void) relayd_close(rsock);
free_sock:
- if (sock) {
- lttcomm_destroy_sock(sock);
- }
+ free(rsock);
error:
return ret;
}
struct consumer_socket *consumer_sock)
{
int ret;
- struct lttcomm_sock *sock = NULL;
+ struct lttcomm_relayd_sock *rsock = NULL;
/* Connect to relayd and make version check if uri is the control. */
- ret = create_connect_relayd(consumer, session->name, relayd_uri, &sock);
+ ret = create_connect_relayd(relayd_uri, &rsock);
if (ret != LTTNG_OK) {
- goto close_sock;
+ goto error;
}
+ assert(rsock);
/* If the control socket is connected, network session is ready */
if (relayd_uri->stype == LTTNG_STREAM_CONTROL) {
}
/* Send relayd socket to consumer. */
- ret = consumer_send_relayd_socket(consumer_sock, sock,
- consumer, relayd_uri->stype, session->id);
+ ret = consumer_send_relayd_socket(consumer_sock, rsock, consumer,
+ relayd_uri->stype, session->id);
if (ret < 0) {
ret = LTTNG_ERR_ENABLE_CONSUMER_FAIL;
goto close_sock;
*/
close_sock:
- if (sock) {
- (void) relayd_close(sock);
- lttcomm_destroy_sock(sock);
- }
+ (void) relayd_close(rsock);
+ free(rsock);
+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;
}
/* Setup kernel consumer socket and send fds to it */
ret = init_kernel_tracing(ksess);
- if (ret < 0) {
+ if (ret != 0) {
ret = LTTNG_ERR_KERN_START_FAIL;
goto error;
}
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 */
if (chan_count == 0) {
struct lttng_channel *attr;
/* Create default channel */
- attr = channel_new_default_attr(domain);
+ attr = channel_new_default_attr(domain, usess->buffer_type);
if (attr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
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;
}
kchan = trace_kernel_get_channel_by_name(channel_name,
session->kernel_session);
if (kchan == NULL) {
- attr = channel_new_default_attr(LTTNG_DOMAIN_KERNEL);
+ attr = channel_new_default_attr(LTTNG_DOMAIN_KERNEL,
+ LTTNG_BUFFER_GLOBAL);
if (attr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
channel_name);
if (uchan == NULL) {
/* Create default channel */
- attr = channel_new_default_attr(LTTNG_DOMAIN_UST);
+ attr = channel_new_default_attr(LTTNG_DOMAIN_UST,
+ usess->buffer_type);
if (attr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
session->kernel_session);
if (kchan == NULL) {
/* Create default channel */
- attr = channel_new_default_attr(LTTNG_DOMAIN_KERNEL);
+ attr = channel_new_default_attr(LTTNG_DOMAIN_KERNEL,
+ LTTNG_BUFFER_GLOBAL);
if (attr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
channel_name);
if (uchan == NULL) {
/* Create default channel */
- attr = channel_new_default_attr(LTTNG_DOMAIN_UST);
+ attr = channel_new_default_attr(LTTNG_DOMAIN_UST,
+ usess->buffer_type);
if (attr == NULL) {
ret = LTTNG_ERR_FATAL;
goto error;
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:
for (i = 0; i < nb_uri; i++) {
ret = add_uri_to_consumer(consumer, &uris[i], domain, session->name);
- if (ret < 0) {
+ if (ret != LTTNG_OK) {
goto error;
}
}
size_t nb_uri, lttng_sock_cred *creds)
{
int ret;
- char *path = NULL;
struct ltt_session *session;
assert(name);
}
/* Create tracing session in the registry */
- ret = session_create(name, path, LTTNG_SOCK_GET_UID_CRED(creds),
+ ret = session_create(name, LTTNG_SOCK_GET_UID_CRED(creds),
LTTNG_SOCK_GET_GID_CRED(creds));
if (ret != LTTNG_OK) {
goto session_error;
const char *sock_path, struct consumer_data *cdata)
{
int ret, sock;
- struct consumer_socket *socket;
+ struct consumer_socket *socket = NULL;
assert(session);
assert(cdata);
goto error;
}
- ret = LTTNG_OK;
+ return LTTNG_OK;
error:
+ if (socket) {
+ consumer_destroy_socket(socket);
+ }
return ret;
}
if (session->ust_session != NULL) {
(*domains)[index].type = LTTNG_DOMAIN_UST;
+ (*domains)[index].buf_type = session->ust_session->buffer_type;
index++;
}
(ksess && ksess->consumer->type == CONSUMER_DST_NET) ||
(usess && usess->consumer->type == CONSUMER_DST_NET)) {
ret = build_network_session_path(sessions[i].path,
- sizeof(session[i].path), session);
+ sizeof(sessions[i].path), session);
} else {
- ret = snprintf(sessions[i].path, sizeof(session[i].path), "%s",
+ ret = snprintf(sessions[i].path, sizeof(sessions[i].path), "%s",
session->consumer->dst.trace_path);
}
if (ret < 0) {