relayd: track the health thread's poll fd with fd-tracker
[lttng-tools.git] / src / bin / lttng-relayd / health-relayd.c
index 8b2febe05c7e55a53f942d2a4e2a22a917acc2c0..2e8eb8e483687fc0e677e7953307a8ce973ef721 100644 (file)
@@ -47,6 +47,7 @@
 #include <common/sessiond-comm/sessiond-comm.h>
 #include <common/utils.h>
 #include <common/compat/getenv.h>
+#include <common/fd-tracker/utils.h>
 
 #include "lttng-relayd.h"
 #include "health-relayd.h"
@@ -232,6 +233,23 @@ end:
        return ret;
 }
 
+static
+int accept_unix_socket(void *data, int *out_fd)
+{
+       int ret;
+       int accepting_sock = *((int *) data);
+
+       ret = lttcomm_accept_unix_sock(accepting_sock);
+       if (ret < 0) {
+               goto end;
+       }
+
+       *out_fd = ret;
+       ret = 0;
+end:
+       return ret;
+}
+
 /*
  * Thread managing health check socket.
  */
@@ -301,8 +319,10 @@ void *thread_manage_health(void *data)
                goto error;
        }
 
-       /* Size is set to 1 for the consumer_channel pipe */
-       ret = lttng_poll_create(&events, 2, LTTNG_CLOEXEC);
+       /* Size is set to 2 for the unix socket and quit pipe. */
+       ret = fd_tracker_util_poll_create(the_fd_tracker,
+                       "Health management thread epoll", &events, 2,
+                       LTTNG_CLOEXEC);
        if (ret < 0) {
                ERR("Poll set creation failed");
                goto error;
@@ -322,6 +342,8 @@ void *thread_manage_health(void *data)
        lttng_relay_notify_ready();
 
        while (1) {
+               char *accepted_socket_name;
+
                DBG("Health check ready");
 
                /* Inifinite blocking call, waiting for transmission */
@@ -365,8 +387,18 @@ restart:
                        }
                }
 
-               new_sock = lttcomm_accept_unix_sock(sock);
-               if (new_sock < 0) {
+               ret = asprintf(&accepted_socket_name, "Socket accepted from unix socket @ %s",
+                               health_unix_sock_path);
+               if (ret == -1) {
+                       PERROR("Failed to allocate name of accepted socket from unix socket @ %s",
+                                       health_unix_sock_path);
+                       goto error;
+               }
+               ret = fd_tracker_open_unsuspendable_fd(the_fd_tracker, &new_sock,
+                               (const char **) &accepted_socket_name, 1,
+                               accept_unix_socket, &sock);
+               free(accepted_socket_name);
+               if (ret < 0) {
                        goto error;
                }
 
@@ -380,7 +412,9 @@ restart:
                ret = lttcomm_recv_unix_sock(new_sock, (void *)&msg, sizeof(msg));
                if (ret <= 0) {
                        DBG("Nothing recv() from client... continuing");
-                       ret = close(new_sock);
+                       ret = fd_tracker_close_unsuspendable_fd(the_fd_tracker,
+                                       &new_sock, 1, fd_tracker_util_close_fd,
+                                       NULL);
                        if (ret) {
                                PERROR("close");
                        }
@@ -411,7 +445,9 @@ restart:
                }
 
                /* End of transmission */
-               ret = close(new_sock);
+               ret = fd_tracker_close_unsuspendable_fd(the_fd_tracker,
+                               &new_sock, 1, fd_tracker_util_close_fd,
+                               NULL);
                if (ret) {
                        PERROR("close");
                }
@@ -438,7 +474,7 @@ exit:
         * other processes using them.
         */
 
-       lttng_poll_clean(&events);
+       (void) fd_tracker_util_poll_clean(the_fd_tracker, &events);
 
        rcu_unregister_thread();
        return NULL;
This page took 0.023906 seconds and 4 git commands to generate.