From: Mathieu Desnoyers Date: Mon, 6 Jul 2015 16:21:06 +0000 (-0400) Subject: Fix: metadata push -EPIPE should be recoverable X-Git-Tag: v2.7.0-rc1~11 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=2c57e06ddcdb92e863755595000f162729130845 Fix: metadata push -EPIPE should be recoverable This return value can be caused by application terminating concurrently (when using per-PID buffers), so it should not make the consumer management thread exit. CC: Aravind HT Signed-off-by: Mathieu Desnoyers Signed-off-by: Jérémie Galarneau --- diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c index c30792c3c..6f032da11 100644 --- a/src/bin/lttng-sessiond/ust-app.c +++ b/src/bin/lttng-sessiond/ust-app.c @@ -431,6 +431,9 @@ void delete_ust_app_channel(int sock, struct ust_app_channel *ua_chan, * Must be called with the registry lock held. * * On success, return the len of metadata pushed or else a negative value. + * Returning a -EPIPE return value means we could not send the metadata, + * but it can be caused by recoverable errors (e.g. the application has + * terminated concurrently). */ ssize_t ust_app_push_metadata(struct ust_registry_session *registry, struct consumer_socket *socket, int send_zero_data) @@ -454,9 +457,10 @@ ssize_t ust_app_push_metadata(struct ust_registry_session *registry, /* * On a push metadata error either the consumer is dead or the * metadata channel has been destroyed because its endpoint - * might have died (e.g: relayd). If so, the metadata closed - * flag is set to 1 so we deny pushing metadata again which is - * not valid anymore on the consumer side. + * might have died (e.g: relayd), or because the application has + * exited. If so, the metadata closed flag is set to 1 so we + * deny pushing metadata again which is not valid anymore on the + * consumer side. */ if (registry->metadata_closed) { return -EPIPE; @@ -547,6 +551,9 @@ error_push: * of socket throughout this function. * * Return 0 on success else a negative error. + * Returning a -EPIPE return value means we could not send the metadata, + * but it can be caused by recoverable errors (e.g. the application has + * terminated concurrently). */ static int push_metadata(struct ust_registry_session *registry, struct consumer_output *consumer) diff --git a/src/bin/lttng-sessiond/ust-consumer.c b/src/bin/lttng-sessiond/ust-consumer.c index 78e50df43..ad076e3c3 100644 --- a/src/bin/lttng-sessiond/ust-consumer.c +++ b/src/bin/lttng-sessiond/ust-consumer.c @@ -511,12 +511,15 @@ int ust_consumer_metadata_request(struct consumer_socket *socket) pthread_mutex_lock(&ust_reg->lock); ret_push = ust_app_push_metadata(ust_reg, socket, 1); pthread_mutex_unlock(&ust_reg->lock); - if (ret_push < 0) { + if (ret_push == -EPIPE) { + DBG("Application or relay closed while pushing metadata"); + } else if (ret_push < 0) { ERR("Pushing metadata"); ret = -1; goto end; + } else { + DBG("UST Consumer metadata pushed successfully"); } - DBG("UST Consumer metadata pushed successfully"); ret = 0; end: