Backport: relayd: track relayd data connection sockets
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 28 Jun 2018 05:16:43 +0000 (01:16 -0400)
committerJonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Fri, 21 Sep 2018 04:00:52 +0000 (00:00 -0400)
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-relayd/main.c

index d6a8923e19aa1c56667838fe7710def869c57456..30eb5c7aee48a3a648686fd7c4745e82fe94954d 100644 (file)
@@ -862,6 +862,23 @@ static int close_sock(void *data, int *in_fd)
        return sock->ops->close(sock);
 }
 
+static int accept_sock(void *data, int *out_fd)
+{
+       int ret = 0;
+       /* Socks is an array of in_sock, out_sock. */
+       struct lttcomm_sock **socks = data;
+       struct lttcomm_sock *in_sock = socks[0];
+
+        socks[1] = in_sock->ops->accept(in_sock);
+       if (!socks[1]) {
+               ret = -1;
+               goto end;
+       }
+       *out_fd = socks[1]->fd;
+end:
+       return ret;
+}
+
 /*
  * Create and init socket from uri.
  */
@@ -919,6 +936,27 @@ error:
        return NULL;
 }
 
+static
+struct lttcomm_sock *accept_relayd_sock(struct lttcomm_sock *listening_sock,
+               const char *name)
+{
+       int out_fd, ret;
+       struct lttcomm_sock *socks[2] = { listening_sock, NULL };
+       struct lttcomm_sock *new_sock = NULL;
+
+        ret = fd_tracker_open_unsuspendable_fd(
+                       the_fd_tracker, &out_fd,
+                       (const char **) &name,
+                       1, accept_sock, &socks);
+       if (ret) {
+               goto end;
+       }
+       new_sock = socks[1];
+       DBG("%s accepted, socket %d", name, new_sock->fd);
+end:
+       return new_sock;
+}
+
 /*
  * This thread manages the listening for new connections on the network
  */
@@ -1025,14 +1063,13 @@ restart:
                                 */
                                int val = 1;
                                struct relay_connection *new_conn;
-                               struct lttcomm_sock *newsock;
+                               struct lttcomm_sock *newsock = NULL;
                                enum connection_type type;
 
                                if (pollfd == data_sock->fd) {
                                        type = RELAY_DATA;
-                                       newsock = data_sock->ops->accept(data_sock);
-                                       DBG("Relay data connection accepted, socket %d",
-                                                       newsock->fd);
+                                       newsock = accept_relayd_sock(data_sock,
+                                                       "Data socket to relayd");
                                } else {
                                        assert(pollfd == control_sock->fd);
                                        type = RELAY_CONTROL;
@@ -2924,7 +2961,8 @@ static void cleanup_connection_pollfd(struct lttng_poll_event *events, int pollf
 
        (void) lttng_poll_del(events, pollfd);
 
-       ret = close(pollfd);
+       ret = fd_tracker_close_unsuspendable_fd(the_fd_tracker, &pollfd, 1,
+                       fd_tracker_util_close_fd, NULL);
        if (ret < 0) {
                ERR("Closing pollfd %d", pollfd);
        }
This page took 0.029909 seconds and 5 git commands to generate.