X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcmd.c;h=1a3c22a6c8f87715dc85c878ec5b0c3443d7d1e3;hb=15623b7d24de5bd828ac21f55bdfea4835c4227a;hp=f3ff25642e701a0f83e78bbfd02144c1a118dfdb;hpb=9f449915b9d44ce3c9c9255f5d491a62545fee25;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c index f3ff25642..1a3c22a6c 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -243,11 +244,11 @@ end: /* * Fill lttng_channel array of all channels. */ -static void list_lttng_channels(enum lttng_domain_type domain, +static ssize_t list_lttng_channels(enum lttng_domain_type domain, struct ltt_session *session, struct lttng_channel *channels, struct lttng_channel_extended *chan_exts) { - int i = 0, ret; + int i = 0, ret = 0; struct ltt_kernel_channel *kchan; DBG("Listing channels for session %s", session->name); @@ -277,6 +278,7 @@ static void list_lttng_channels(enum lttng_domain_type domain, chan_exts[i].lost_packets = lost_packets; chan_exts[i].monitor_timer_interval = extended->monitor_timer_interval; + chan_exts[i].blocking_timeout = 0; i++; } } @@ -322,6 +324,11 @@ static void list_lttng_channels(enum lttng_domain_type domain, break; } + chan_exts[i].monitor_timer_interval = + uchan->monitor_timer_interval; + chan_exts[i].blocking_timeout = + uchan->attr.u.s.blocking_timeout; + ret = get_ust_runtime_stats(session, uchan, &discarded_events, &lost_packets); if (ret < 0) { @@ -329,8 +336,6 @@ static void list_lttng_channels(enum lttng_domain_type domain, } chan_exts[i].discarded_events = discarded_events; chan_exts[i].lost_packets = lost_packets; - chan_exts[i].monitor_timer_interval = - uchan->monitor_timer_interval; i++; } rcu_read_unlock(); @@ -341,7 +346,11 @@ static void list_lttng_channels(enum lttng_domain_type domain, } end: - return; + if (ret < 0) { + return -LTTNG_ERR_FATAL; + } else { + return LTTNG_OK; + } } static void increment_extended_len(const char *filter_expression, @@ -898,6 +907,8 @@ error: /* * Connect to the relayd using URI and send the socket to the right consumer. + * + * The consumer socket lock must be held by the caller. */ static int send_consumer_relayd_socket(enum lttng_domain_type domain, unsigned int session_id, struct lttng_uri *relayd_uri, @@ -911,7 +922,7 @@ static int send_consumer_relayd_socket(enum lttng_domain_type domain, /* Connect to relayd and make version check if uri is the control. */ ret = create_connect_relayd(relayd_uri, &rsock, consumer); if (ret != LTTNG_OK) { - goto error; + goto relayd_comm_error; } assert(rsock); @@ -951,10 +962,6 @@ static int send_consumer_relayd_socket(enum lttng_domain_type domain, */ close_sock: - (void) relayd_close(rsock); - free(rsock); - -error: if (ret != LTTNG_OK) { /* * The consumer output for this session should not be used anymore @@ -963,6 +970,10 @@ error: */ consumer->enabled = 0; } + (void) relayd_close(rsock); + free(rsock); + +relayd_comm_error: return ret; } @@ -970,6 +981,8 @@ error: * Send both relayd sockets to a specific consumer and domain. This is a * helper function to facilitate sending the information to the consumer for a * session. + * + * The consumer socket lock must be held by the caller. */ static int send_consumer_relayd_sockets(enum lttng_domain_type domain, unsigned int session_id, struct consumer_output *consumer, @@ -1349,6 +1362,30 @@ int cmd_enable_channel(struct ltt_session *session, attr->attr.switch_timer_interval = 0; } + /* Check for feature support */ + switch (domain->type) { + case LTTNG_DOMAIN_KERNEL: + { + if (kernel_supports_ring_buffer_snapshot_sample_positions(kernel_tracer_fd) != 1) { + /* Sampling position of buffer is not supported */ + WARN("Kernel tracer does not support buffer monitoring. " + "Setting the monitor interval timer to 0 " + "(disabled) for channel '%s' of session '%s'", + attr-> name, session->name); + lttng_channel_set_monitor_timer_interval(attr, 0); + } + break; + } + case LTTNG_DOMAIN_UST: + case LTTNG_DOMAIN_JUL: + case LTTNG_DOMAIN_LOG4J: + case LTTNG_DOMAIN_PYTHON: + break; + default: + ret = LTTNG_ERR_UNKNOWN_DOMAIN; + goto error; + } + switch (domain->type) { case LTTNG_DOMAIN_KERNEL: { @@ -1617,6 +1654,16 @@ int cmd_add_context(struct ltt_session *session, enum lttng_domain_type domain, int ret, chan_kern_created = 0, chan_ust_created = 0; char *app_ctx_provider_name = NULL, *app_ctx_name = NULL; + /* + * Don't try to add a context if the session has been started at + * some point in time before. The tracer does not allow it and would + * result in a corrupted trace. + */ + if (session->has_been_started) { + ret = LTTNG_ERR_TRACE_ALREADY_STARTED; + goto end; + } + if (ctx->ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT) { app_ctx_provider_name = ctx->u.app_ctx.provider_name; app_ctx_name = ctx->u.app_ctx.ctx_name; @@ -2936,7 +2983,12 @@ ssize_t cmd_list_channels(enum lttng_domain_type domain, channel_exts = ((void *) *channels) + (nb_chan * sizeof(struct lttng_channel)); - list_lttng_channels(domain, session, *channels, channel_exts); + ret = list_lttng_channels(domain, session, *channels, channel_exts); + if (ret != LTTNG_OK) { + free(*channels); + *channels = NULL; + goto end; + } } else { *channels = NULL; } @@ -3512,7 +3564,6 @@ int cmd_regenerate_statedump(struct ltt_session *session) ret = LTTNG_ERR_SESSION_NOT_STARTED; goto end; } - ret = 0; if (session->kernel_session) { ret = kernctl_session_regenerate_statedump( @@ -3587,7 +3638,10 @@ int cmd_register_trigger(struct command_ctx *cmd_ctx, int sock, ret = notification_thread_command_register_trigger(notification_thread, trigger); + /* Ownership of trigger was transferred. */ + trigger = NULL; end: + lttng_trigger_destroy(trigger); lttng_dynamic_buffer_reset(&trigger_buffer); return ret; } @@ -3630,6 +3684,7 @@ int cmd_unregister_trigger(struct command_ctx *cmd_ctx, int sock, ret = notification_thread_command_unregister_trigger(notification_thread, trigger); end: + lttng_trigger_destroy(trigger); lttng_dynamic_buffer_reset(&trigger_buffer); return ret; } @@ -3665,10 +3720,12 @@ static int set_relayd_for_snapshot(struct consumer_output *consumer, rcu_read_lock(); cds_lfht_for_each_entry(snap_output->consumer->socks->ht, &iter.iter, socket, node.node) { + pthread_mutex_lock(socket->lock); ret = send_consumer_relayd_sockets(0, session->id, snap_output->consumer, socket, session->name, session->hostname, session->live_timer); + pthread_mutex_unlock(socket->lock); if (ret != LTTNG_OK) { rcu_read_unlock(); goto error;