Fix handling of sessiond respawn after a SIGKILL
[lttng-tools.git] / ltt-sessiond / main.c
index 98bdb6a4d6912c8a97117a59c114a6d54ee065ae..1e2a0831dc80187b4b581e72ef97a037762a3fa4 100644 (file)
@@ -60,6 +60,7 @@ const char default_global_apps_pipe[] = DEFAULT_GLOBAL_APPS_PIPE;
 
 /* Variables */
 int opt_verbose;    /* Not static for lttngerr.h */
+int opt_verbose_kconsumerd;    /* Not static for lttngerr.h */
 int opt_quiet;      /* Not static for lttngerr.h */
 
 const char *progname;
@@ -900,7 +901,7 @@ static pid_t spawn_kconsumerd(void)
                /*
                 * Exec kconsumerd.
                 */
-               if (opt_verbose > 1) {
+               if (opt_verbose > 1 || opt_verbose_kconsumerd) {
                        verbosity = "--verbose";
                } else {
                        verbosity = "--quiet";
@@ -2280,6 +2281,7 @@ static void usage(void)
        fprintf(stderr, "  -S, --sig-parent                   Send SIGCHLD to parent pid to notify readiness.\n");
        fprintf(stderr, "  -q, --quiet                        No output at all.\n");
        fprintf(stderr, "  -v, --verbose                      Verbose mode. Activate DBG() macro.\n");
+       fprintf(stderr, "      --verbose-kconsumerd           Verbose mode for kconsumerd. Activate DBG() macro.\n");
 }
 
 /*
@@ -2301,12 +2303,13 @@ static int parse_args(int argc, char **argv)
                { "version", 0, 0, 'V' },
                { "quiet", 0, 0, 'q' },
                { "verbose", 0, 0, 'v' },
+               { "verbose-kconsumerd", 0, 0, 'Z' },
                { NULL, 0, 0, 0 }
        };
 
        while (1) {
                int option_index = 0;
-               c = getopt_long(argc, argv, "dhqvVS" "a:c:g:s:E:C:", long_options, &option_index);
+               c = getopt_long(argc, argv, "dhqvVS" "a:c:g:s:E:C:Z", long_options, &option_index);
                if (c == -1) {
                        break;
                }
@@ -2352,6 +2355,9 @@ static int parse_args(int argc, char **argv)
                        /* Verbose level can increase using multiple -v */
                        opt_verbose += 1;
                        break;
+               case 'Z':
+                       opt_verbose_kconsumerd += 1;
+                       break;
                default:
                        /* Unknown option or other error.
                         * Error is printed by getopt, just return */
@@ -2412,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;
 }
 
 /*
@@ -2708,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.025362 seconds and 4 git commands to generate.