<html><body><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000"><div>We should not have to send any error back to the consumer because the</div><div>app disappearing will eventually close all file descriptors related to the</div><div>communication and notification pipes (sessiond vs apps), as well as all</div><div>stream file descriptors (consumerd vs apps). So the consumerd will</div><div>eventually be notified that the application disappeared, and will therefore</div><div>close the associated streams (in per-pid buffers) in due time.<br data-mce-bogus="1"></div><div><br></div><div>Thanks,<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>Mathieu<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><span id="zwchr" data-marker="__DIVIDER__">----- On Jul 6, 2015, at 12:42 PM, HT, Aravind <aravind.ht@gmail.com> wrote:<br></span><div data-marker="__QUOTED_TEXT__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><div dir="ltr">In case of -EPIPE, im thinking if we can send <span style="color:rgb(0,0,0);white-space:pre-wrap">LTTNG_ERR_UND or some other error back to the consumer for it to do any relevant clean up.</span></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 6, 2015 at 9:51 PM, Mathieu Desnoyers <span dir="ltr"><<a href="mailto:mathieu.desnoyers@efficios.com" target="_blank">mathieu.desnoyers@efficios.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This return value can be caused by application terminating concurrently<br>
(when using per-PID buffers), so it should not make the consumer<br>
management thread exit.<br>
<br>
CC: Aravind HT <<a href="mailto:aravind.ht@gmail.com" target="_blank">aravind.ht@gmail.com</a>><br>
Signed-off-by: Mathieu Desnoyers <<a href="mailto:mathieu.desnoyers@efficios.com" target="_blank">mathieu.desnoyers@efficios.com</a>><br>
---<br>
 src/bin/lttng-sessiond/ust-app.c      | 13 ++++++++++---<br>
 src/bin/lttng-sessiond/ust-consumer.c |  7 +++++--<br>
 2 files changed, 15 insertions(+), 5 deletions(-)<br>
<br>
diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c<br>
index c30792c..6f032da 100644<br>
--- a/src/bin/lttng-sessiond/ust-app.c<br>
+++ b/src/bin/lttng-sessiond/ust-app.c<br>
@@ -431,6 +431,9 @@ void delete_ust_app_channel(int sock, struct ust_app_channel *ua_chan,<br>
  * Must be called with the registry lock held.<br>
  *<br>
  * On success, return the len of metadata pushed or else a negative value.<br>
+ * Returning a -EPIPE return value means we could not send the metadata,<br>
+ * but it can be caused by recoverable errors (e.g. the application has<br>
+ * terminated concurrently).<br>
  */<br>
 ssize_t ust_app_push_metadata(struct ust_registry_session *registry,<br>
                struct consumer_socket *socket, int send_zero_data)<br>
@@ -454,9 +457,10 @@ ssize_t ust_app_push_metadata(struct ust_registry_session *registry,<br>
        /*<br>
         * On a push metadata error either the consumer is dead or the<br>
         * metadata channel has been destroyed because its endpoint<br>
-        * might have died (e.g: relayd). If so, the metadata closed<br>
-        * flag is set to 1 so we deny pushing metadata again which is<br>
-        * not valid anymore on the consumer side.<br>
+        * might have died (e.g: relayd), or because the application has<br>
+        * exited. If so, the metadata closed flag is set to 1 so we<br>
+        * deny pushing metadata again which is not valid anymore on the<br>
+        * consumer side.<br>
         */<br>
        if (registry->metadata_closed) {<br>
                return -EPIPE;<br>
@@ -547,6 +551,9 @@ error_push:<br>
  * of socket throughout this function.<br>
  *<br>
  * Return 0 on success else a negative error.<br>
+ * Returning a -EPIPE return value means we could not send the metadata,<br>
+ * but it can be caused by recoverable errors (e.g. the application has<br>
+ * terminated concurrently).<br>
  */<br>
 static int push_metadata(struct ust_registry_session *registry,<br>
                struct consumer_output *consumer)<br>
diff --git a/src/bin/lttng-sessiond/ust-consumer.c b/src/bin/lttng-sessiond/ust-consumer.c<br>
index 78e50df..ad076e3 100644<br>
--- a/src/bin/lttng-sessiond/ust-consumer.c<br>
+++ b/src/bin/lttng-sessiond/ust-consumer.c<br>
@@ -511,12 +511,15 @@ int ust_consumer_metadata_request(struct consumer_socket *socket)<br>
        pthread_mutex_lock(&ust_reg->lock);<br>
        ret_push = ust_app_push_metadata(ust_reg, socket, 1);<br>
        pthread_mutex_unlock(&ust_reg->lock);<br>
-       if (ret_push < 0) {<br>
+       if (ret_push == -EPIPE) {<br>
+               DBG("Application or relay closed while pushing metadata");<br>
+       } else if (ret_push < 0) {<br>
                ERR("Pushing metadata");<br>
                ret = -1;<br>
                goto end;<br>
+       } else {<br>
+               DBG("UST Consumer metadata pushed successfully");<br>
        }<br>
-       DBG("UST Consumer metadata pushed successfully");<br>
        ret = 0;<br>
<br>
 end:<br>
<span class="HOEnZb"><span style="color: #888888;" data-mce-style="color: #888888;" color="#888888">--<br>
2.1.4<br>
<br>
</span></span></blockquote></div></div><br></blockquote></div><br><div data-marker="__SIG_POST__">-- <br></div><div>Mathieu Desnoyers<br>EfficiOS Inc.<br>http://www.efficios.com</div></div></body></html>