Fix kconsumerd multiple spawn bug
[lttng-tools.git] / ltt-sessiond / main.c
index 5327804c33b3ec62fcfb6905f572bda798e97242..97db535d142b16f802e9e80c77a19ef094097d5a 100644 (file)
@@ -332,6 +332,7 @@ static void *thread_manage_kconsumerd(void *data)
                goto error;
        }
 
+       /* Getting status code from kconsumerd */
        ret = lttcomm_recv_unix_sock(sock, &code, sizeof(enum lttcomm_return_code));
        if (ret <= 0) {
                goto error;
@@ -340,6 +341,7 @@ static void *thread_manage_kconsumerd(void *data)
        if (code == KCONSUMERD_COMMAND_SOCK_READY) {
                kconsumerd_cmd_sock = lttcomm_connect_unix_sock(kconsumerd_cmd_unix_sock_path);
                if (kconsumerd_cmd_sock < 0) {
+                       sem_post(&kconsumerd_sem);
                        perror("kconsumerd connect");
                        goto error;
                }
@@ -352,20 +354,15 @@ static void *thread_manage_kconsumerd(void *data)
                goto error;
        }
 
-       while (1) {
-               /* Wait for any kconsumerd error */
-               ret = lttcomm_recv_unix_sock(sock, &code, sizeof(enum lttcomm_return_code));
-               if (ret <= 0) {
-                       ERR("Kconsumerd closed the command socket");
-                       goto error;
-               }
-
-               ERR("Kconsumerd return code : %s", lttcomm_get_readable_code(-code));
-               if (code != KCONSUMERD_POLL_HUP) {
-                       goto error;
-               }
+       /* Wait for any kconsumerd error */
+       ret = lttcomm_recv_unix_sock(sock, &code, sizeof(enum lttcomm_return_code));
+       if (ret <= 0) {
+               ERR("Kconsumerd closed the command socket");
+               goto error;
        }
 
+       ERR("Kconsumerd return code : %s", lttcomm_get_readable_code(-code));
+
 error:
        kconsumerd_pid = 0;
        DBG("Kconsumerd thread dying");
@@ -461,9 +458,15 @@ static int spawn_kconsumerd_thread(void)
        /* Wait for the kconsumerd thread to be ready */
        sem_wait(&kconsumerd_sem);
 
+       if (kconsumerd_pid == 0) {
+               ERR("Kconsumerd did not start");
+               goto error;
+       }
+
        return 0;
 
 error:
+       ret = LTTCOMM_KERN_CONSUMER_FAIL;
        return ret;
 }
 
@@ -483,12 +486,14 @@ static pid_t spawn_kconsumerd(void)
        int ret;
        pid_t pid;
 
+       DBG("Spawning kconsumerd");
+
        pid = fork();
        if (pid == 0) {
                /*
                 * Exec kconsumerd.
                 */
-               execlp("kconsumerd", "kconsumerd", "--daemonize", NULL);
+               execlp("kconsumerd", "kconsumerd", "--quiet", NULL);
                if (errno != 0) {
                        perror("kernel start consumer exec");
                }
@@ -515,34 +520,34 @@ static int start_kconsumerd(void)
 {
        int ret;
 
-       DBG("Spawning kconsumerd");
-
        pthread_mutex_lock(&kconsumerd_pid_mutex);
-       if (kconsumerd_pid == 0) {
-               ret = spawn_kconsumerd();
-               if (ret < 0) {
-                       ERR("Spawning kconsumerd failed");
-                       ret = LTTCOMM_KERN_CONSUMER_FAIL;
-                       pthread_mutex_unlock(&kconsumerd_pid_mutex);
-                       goto error;
-               }
+       if (kconsumerd_pid != 0) {
+               goto end;
+       }
 
-               /* Setting up the global kconsumerd_pid */
-               kconsumerd_pid = ret;
+       ret = spawn_kconsumerd();
+       if (ret < 0) {
+               ERR("Spawning kconsumerd failed");
+               ret = LTTCOMM_KERN_CONSUMER_FAIL;
+               pthread_mutex_unlock(&kconsumerd_pid_mutex);
+               goto error;
        }
+
+       /* Setting up the global kconsumerd_pid */
+       kconsumerd_pid = ret;
        pthread_mutex_unlock(&kconsumerd_pid_mutex);
 
        DBG("Kconsumerd pid %d", ret);
 
        DBG("Spawning kconsumerd thread");
-
        ret = spawn_kconsumerd_thread();
        if (ret < 0) {
                ERR("Fatal error spawning kconsumerd thread");
-               ret = LTTCOMM_FATAL;
                goto error;
        }
 
+end:
+       pthread_mutex_unlock(&kconsumerd_pid_mutex);
        return 0;
 
 error:
@@ -657,6 +662,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
        switch (cmd_ctx->lsm->cmd_type) {
        case LTTNG_CREATE_SESSION:
        case LTTNG_LIST_SESSIONS:
+       case KERNEL_LIST_EVENTS:
        case UST_LIST_APPS:
                break;
        default:
@@ -675,6 +681,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
        case KERNEL_CREATE_STREAM:
        case KERNEL_DISABLE_EVENT:
        case KERNEL_ENABLE_EVENT:
+       case KERNEL_LIST_EVENTS:
        case KERNEL_OPEN_METADATA:
        case KERNEL_START_TRACE:
        case KERNEL_STOP_TRACE:
@@ -760,6 +767,34 @@ static int process_client_msg(struct command_ctx *cmd_ctx)
                ret = LTTCOMM_OK;
                break;
        }
+       case KERNEL_LIST_EVENTS:
+       {
+               char *event_list;
+               ssize_t size;
+
+               size = kernel_list_events(kernel_tracer_fd, &event_list);
+               if (size < 0) {
+                       ret = LTTCOMM_KERN_LIST_FAIL;
+                       goto error;
+               }
+
+               /*
+                * Setup lttng message with payload size set to the event list size in
+                * bytes and then copy list into the llm payload.
+                */
+               ret = setup_lttng_msg(cmd_ctx, size);
+               if (ret < 0) {
+                       goto setup_error;
+               }
+
+               /* Copy event list into message payload */
+               memcpy(cmd_ctx->llm->payload, event_list, size);
+
+               free(event_list);
+
+               ret = LTTCOMM_OK;
+               break;
+       }
        case KERNEL_OPEN_METADATA:
        {
                /* Setup lttng message with no payload */
@@ -1380,8 +1415,12 @@ static int create_lttng_rundir(void)
 
        ret = mkdir(LTTNG_RUNDIR, S_IRWXU | S_IRWXG );
        if (ret < 0) {
-               ERR("Unable to create " LTTNG_RUNDIR);
-               goto error;
+               if (errno != EEXIST) {
+                       ERR("Unable to create " LTTNG_RUNDIR);
+                       goto error;
+               } else {
+                       ret = 0;
+               }
        }
 
 error:
This page took 0.025326 seconds and 4 git commands to generate.