X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fust-consumer%2Fust-consumer.c;h=f783d4058c550033983045c93cbeddcc363028d3;hp=780a601f67e74b70b3632a6d489067d82e1359ef;hb=f2a444f17e07f805109c01ab4c7f53cc98b1adf3;hpb=821fffb2f13c9d5178df306f3c87edbeaf881a22 diff --git a/src/common/ust-consumer/ust-consumer.c b/src/common/ust-consumer/ust-consumer.c index 780a601f6..f783d4058 100644 --- a/src/common/ust-consumer/ust-consumer.c +++ b/src/common/ust-consumer/ust-consumer.c @@ -394,7 +394,7 @@ static int send_sessiond_channel(int sock, struct lttng_consumer_channel *channel, struct lttng_consumer_local_data *ctx, int *relayd_error) { - int ret; + int ret, ret_code = LTTNG_OK; struct lttng_consumer_stream *stream; assert(channel); @@ -403,18 +403,6 @@ static int send_sessiond_channel(int sock, DBG("UST consumer sending channel %s to sessiond", channel->name); - /* Send channel to sessiond. */ - ret = ustctl_send_channel_to_sessiond(sock, channel->uchan); - if (ret < 0) { - goto error; - } - - ret = ustctl_channel_close_wakeup_fd(channel->uchan); - if (ret < 0) { - goto error; - } - - /* The channel was sent successfully to the sessiond at this point. */ cds_list_for_each_entry(stream, &channel->streams.head, send_node) { /* Try to send the stream to the relayd if one is available. */ ret = send_stream_to_relayd(stream); @@ -426,9 +414,33 @@ static int send_sessiond_channel(int sock, if (relayd_error) { *relayd_error = 1; } - goto error; + ret_code = LTTNG_ERR_RELAYD_CONNECT_FAIL; } + } + /* Inform sessiond that we are about to send channel and streams. */ + ret = consumer_send_status_msg(sock, ret_code); + if (ret < 0 || ret_code != LTTNG_OK) { + /* + * Either the session daemon is not responding or the relayd died so we + * stop now. + */ + goto error; + } + + /* Send channel to sessiond. */ + ret = ustctl_send_channel_to_sessiond(sock, channel->uchan); + if (ret < 0) { + goto error; + } + + ret = ustctl_channel_close_wakeup_fd(channel->uchan); + if (ret < 0) { + goto error; + } + + /* The channel was sent successfully to the sessiond at this point. */ + cds_list_for_each_entry(stream, &channel->streams.head, send_node) { /* Send stream to session daemon. */ ret = send_sessiond_stream(sock, stream); if (ret < 0) { @@ -447,6 +459,9 @@ static int send_sessiond_channel(int sock, return 0; error: + if (ret_code != LTTNG_OK) { + ret = -1; + } return ret; } @@ -677,7 +692,7 @@ static int setup_metadata(struct lttng_consumer_local_data *ctx, uint64_t key) if (!metadata) { ERR("UST consumer push metadata %" PRIu64 " not found", key); ret = LTTNG_ERR_UST_CHAN_NOT_FOUND; - goto error; + goto error_find; } /* @@ -709,9 +724,17 @@ static int setup_metadata(struct lttng_consumer_local_data *ctx, uint64_t key) /* List MUST be empty after or else it could be reused. */ assert(cds_list_empty(&metadata->streams.head)); - ret = 0; + return 0; error: + /* + * Delete metadata channel on error. At this point, the metadata stream can + * NOT be monitored by the metadata thread thus having the guarantee that + * the stream is still in the local stream list of the channel. This call + * will make sure to clean that list. + */ + consumer_del_channel(metadata); +error_find: return ret; } @@ -1007,13 +1030,6 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx, goto end_msg_sessiond; } - /* Inform sessiond that we are about to send channel and streams. */ - ret = consumer_send_status_msg(sock, LTTNG_OK); - if (ret < 0) { - /* Somehow, the session daemon is not responding anymore. */ - goto error_fatal; - } - /* Send everything to sessiond. */ ret = send_sessiond_channel(sock, channel, ctx, &relayd_err); if (ret < 0) { @@ -1021,10 +1037,10 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx, /* * We were unable to send to the relayd the stream so avoid * sending back a fatal error to the thread since this is OK - * and the consumer can continue its work. + * and the consumer can continue its work. The above call + * has sent the error status message to the sessiond. */ - ret_code = LTTNG_ERR_RELAYD_CONNECT_FAIL; - goto end_msg_sessiond; + goto end_nosignal; } /* * The communicaton was broken hence there is a bad state between @@ -1544,7 +1560,13 @@ int lttng_ustconsumer_request_metadata(struct lttng_consumer_local_data *ctx, ret_code = lttng_ustconsumer_recv_metadata(ctx->consumer_metadata_socket, key, offset, len, channel); - (void) consumer_send_status_msg(ctx->consumer_metadata_socket, ret_code); + if (ret_code >= 0) { + /* + * Only send the status msg if the sessiond is alive meaning a positive + * ret code. + */ + (void) consumer_send_status_msg(ctx->consumer_metadata_socket, ret_code); + } ret = 0; end: