Fix: notification thread not notified of channel creation on app error
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 5 Dec 2017 20:25:28 +0000 (15:25 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 5 Dec 2017 20:45:40 +0000 (15:45 -0500)
The multi-app notification test is failing (more often on ARM64)
since the notification thread appears to not be notified of a
channel's creation under some circumstances.

Investigating this failure pointed to create_channel_per_uid()
which provides the "hook" the notification system needs to
be informed of a channel's creation.

The first time this function is invoked for a given channel, the
lookup in the buffer registry will fail, prompting the lazy creation
of the channel. Then, that channel is sent to the application
being registered.

The error in the current code is that the channel's creation
is not communicated to the notification subsystem whenever the
session daemon fails to communicate with the application.

Failing to communicate with the application is not a channel
creation error (in per-uid mode). In this specific case, the
test is launching many short-lived applications and it is
expected for the session daemon to encounter closing or dead
applications as it handles their registration.

Note that the diff of this commit is misleading. The important part
is that notification_thread_command_add_channel() has to be
performed regardless of the result of send_channel_uid_to_ust().

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/ust-app.c

index e79455b01fb055588c7473a913f583ae9e567ad3..54479e23c03416b2a6d44b6bf7c780b949141d01 100644 (file)
@@ -2917,15 +2917,6 @@ static int create_channel_per_uid(struct ust_app *app,
                created = true;
        }
 
-       /* Send buffers to the application. */
-       ret = send_channel_uid_to_ust(reg_chan, app, ua_sess, ua_chan);
-       if (ret < 0) {
-               if (ret != -ENOTCONN) {
-                       ERR("Error sending channel to application");
-               }
-               goto error;
-       }
-
        if (created) {
                enum lttng_error_code cmd_ret;
                struct ltt_session *session;
@@ -2961,6 +2952,15 @@ static int create_channel_per_uid(struct ust_app *app,
                }
        }
 
+       /* Send buffers to the application. */
+       ret = send_channel_uid_to_ust(reg_chan, app, ua_sess, ua_chan);
+       if (ret < 0) {
+               if (ret != -ENOTCONN) {
+                       ERR("Error sending channel to application");
+               }
+               goto error;
+       }
+
 error:
        return ret;
 }
This page took 0.028938 seconds and 4 git commands to generate.