Fix handling of sessiond respawn after a SIGKILL
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 8 Aug 2011 05:22:00 +0000 (01:22 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 8 Aug 2011 05:22:00 +0000 (01:22 -0400)
Checking if the sessiond responds to connect() lets lttng / ltt-sessiond
check correctly if the socket files are stale files or actively used.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
liblttngctl/liblttngctl.c
liblttsessiondcomm/liblttsessiondcomm.c
ltt-sessiond/Makefile.am
ltt-sessiond/main.c

index 4faf8414f7cf5d7deb31f2658ee0a7a850a1fe00..2464bce3b2d1eb30ab0252a2fc4f224a5a85b0c0 100644 (file)
@@ -608,13 +608,22 @@ int lttng_session_daemon_alive(void)
                return ret;
        }
 
-       /* If socket exist, we consider the daemon started */
+       /* If socket exist, we check if the daemon listens to connect. */
        ret = access(sessiond_sock_path, F_OK);
        if (ret < 0) {
                /* Not alive */
                return 0;
        }
 
+       ret = lttcomm_connect_unix_sock(sessiond_sock_path);
+       if (ret < 0) {
+               /* Not alive */
+               return 0;
+       }
+       ret = lttcomm_close_unix_sock(ret);
+       if (ret < 0)
+               perror("lttcomm_close_unix_sock");
+
        /* Is alive */
        return 1;
 }
index 9313a34c5d57eba26190e0b07075dea2d7c1ab1b..e7e4204339d61dc0b1daa97cdadd3b1c6fd8033c 100644 (file)
@@ -186,6 +186,8 @@ int lttcomm_create_unix_sock(const char *pathname)
        sun.sun_family = AF_UNIX;
        strncpy(sun.sun_path, pathname, strlen(pathname));
 
+       /* Unlink the old file if present */
+       (void) unlink(pathname);
        ret = bind(fd, (struct sockaddr *) &sun, sizeof(sun));
        if (ret < 0) {
                perror("bind");
index 0480840958ae35ebdf564e8a0706c7e68babe456..26861735030c6c2706ac48bf857b19c853769820 100644 (file)
@@ -11,7 +11,9 @@ ltt_sessiond_SOURCES = utils.c trace.c session.c traceable-app.c ust-ctl.c \
                        utils.h trace.h session.h traceable-app.h ust-ctl.h \
                        context.h kernel-ctl.h ltt-sessiond.h
 
+# link on liblttngctl for check if sessiond is already alive.
 ltt_sessiond_LDADD = \
                 $(top_builddir)/liblttsessiondcomm/liblttsessiondcomm.la \
                 $(top_builddir)/libkernelctl/libkernelctl.la \
-                $(top_builddir)/libustctl/libustctl.la
+                $(top_builddir)/libustctl/libustctl.la \
+                $(top_builddir)/liblttngctl/liblttngctl.la
index 1139df8b94fd26e256d10be10b6dda15965616b0..1e2a0831dc80187b4b581e72ef97a037762a3fa4 100644 (file)
@@ -2418,18 +2418,21 @@ end:
 }
 
 /*
- * Check if the global socket is available.  If yes, error is returned.
+ * Check if the global socket is available, and if a daemon is answering
+ * at the other side. If yes, error is returned.
  */
 static int check_existing_daemon(void)
 {
        int ret;
 
-       ret = access(client_unix_sock_path, F_OK);
-       if (ret == 0) {
-               ret = access(apps_unix_sock_path, F_OK);
-       }
-
-       return ret;
+       if (access(client_unix_sock_path, F_OK) < 0 &&
+           access(apps_unix_sock_path, F_OK) < 0)
+               return 0;
+       /* Is there anybody out there ? */
+       if (lttng_session_daemon_alive())
+               return -EEXIST;
+       else
+               return 0;
 }
 
 /*
@@ -2714,11 +2717,9 @@ int main(int argc, char **argv)
        DBG("Application socket path %s", apps_unix_sock_path);
 
        /*
-        * See if daemon already exist. If any of the two socket needed by the
-        * daemon are present, this test fails. However, if the daemon is killed
-        * with a SIGKILL, those unix socket must be unlinked by hand.
+        * See if daemon already exist.
         */
-       if ((ret = check_existing_daemon()) == 0) {
+       if ((ret = check_existing_daemon()) < 0) {
                ERR("Already running daemon.\n");
                /*
                 * We do not goto exit because we must not cleanup()
This page took 0.030365 seconds and 4 git commands to generate.