sessiond: notification: introduce the notion of 'active' client
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Mon, 10 Feb 2020 23:35:27 +0000 (18:35 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 11 Aug 2020 20:55:12 +0000 (16:55 -0400)
Since notification_clients are now accessed from multiple threads, it
is possible for a thread to access a client while it is being
"cleaned-up" following an error.

The 'active' communication flag allows a check to be performed before
any communication is attempted with a client. The communication is
considered 'active' once the handshake has been performed. It is
considered 'inactive' if a fatal protocol error occurs.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: If16f83ef12fe9a6ef597ae464867011811389177

src/bin/lttng-sessiond/notification-thread-events.c

index 51b95ee6da2e85b2501eda2b839cd39629ff760c..a2fa8a1ca854933bdf505508002b3d113f609ce4 100644 (file)
@@ -151,6 +151,13 @@ struct notification_client {
        struct cds_lfht_node client_socket_ht_node;
        struct cds_lfht_node client_id_ht_node;
        struct {
+               /*
+                * If a client's communication is inactive, it means a fatal
+                * error (either a protocol error or the socket API returned
+                * a fatal error). No further communication should be attempted;
+                * the client is queued for clean-up.
+                */
+               bool active;
                struct {
                        /*
                         * During the reception of a message, the reception
@@ -2836,6 +2843,7 @@ int client_dispatch_message(struct notification_client *client,
                        goto end;
                }
                client->validated = true;
+               client->communication.active = true;
                break;
        }
        case LTTNG_NOTIFICATION_CHANNEL_MESSAGE_TYPE_SUBSCRIBE:
This page took 0.034568 seconds and 4 git commands to generate.