Implement health check for app notification thread
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 14 Jun 2013 11:51:50 +0000 (07:51 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Fri, 14 Jun 2013 13:09:46 +0000 (09:09 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
include/lttng/lttng.h
src/bin/lttng-sessiond/health.h
src/bin/lttng-sessiond/main.c
src/bin/lttng-sessiond/ust-thread.c

index bcccdb47733722420a6997c506df00d06913c60e..d2ce75fb14c75ad5d9ca79f60da4c93574d413d7 100644 (file)
@@ -140,6 +140,7 @@ enum lttng_health_component {
        LTTNG_HEALTH_KERNEL,
        LTTNG_HEALTH_CONSUMER,
        LTTNG_HEALTH_HT_CLEANUP,
+       LTTNG_HEALTH_APP_MANAGE_NOTIFY,
        LTTNG_HEALTH_ALL,
 };
 
index 0b5fb4644daf19c0c7dbc31c9c99122d77ea1c32..dc5b0b19958fc509ffe15a40d138a334ab76d4e9 100644 (file)
@@ -45,6 +45,7 @@ enum health_type {
        HEALTH_TYPE_KERNEL              = 3,
        HEALTH_TYPE_CONSUMER    = 4,
        HEALTH_TYPE_HT_CLEANUP          = 5,
+       HEALTH_TYPE_APP_MANAGE_NOTIFY   = 6,
 
        HEALTH_NUM_TYPE,
 };
index 4a2bc4fdd3ebd363c6a4fb35bd4a2de3039e8cb8..f1cd1b6407f4ee6f34cd18d976368825c3d5d7e3 100644 (file)
@@ -3229,6 +3229,9 @@ restart:
                case LTTNG_HEALTH_HT_CLEANUP:
                        reply.ret_code = health_check_state(HEALTH_TYPE_HT_CLEANUP);
                        break;
+               case LTTNG_HEALTH_APP_MANAGE_NOTIFY:
+                       reply.ret_code = health_check_state(HEALTH_TYPE_APP_MANAGE_NOTIFY);
+                       break;
                case LTTNG_HEALTH_ALL:
                        reply.ret_code =
                                health_check_state(HEALTH_TYPE_APP_MANAGE) &&
@@ -3236,7 +3239,8 @@ restart:
                                health_check_state(HEALTH_TYPE_CMD) &&
                                health_check_state(HEALTH_TYPE_KERNEL) &&
                                check_consumer_health() &&
-                               health_check_state(HEALTH_TYPE_HT_CLEANUP);
+                               health_check_state(HEALTH_TYPE_HT_CLEANUP) &&
+                               health_check_state(HEALTH_TYPE_APP_MANAGE_NOTIFY);
                        break;
                default:
                        reply.ret_code = LTTNG_ERR_UND;
index 552b7ddd8176a6a246fd90168189dce3dd691aba..67c2971d627ba36e8ec934bf6acf07bdd32a8e8b 100644 (file)
 #include "fd-limit.h"
 #include "lttng-sessiond.h"
 #include "ust-thread.h"
+#include "health.h"
 
 /*
  * This thread manage application notify communication.
  */
 void *ust_thread_manage_notify(void *data)
 {
-       int i, ret, pollfd;
+       int i, ret, pollfd, err = -1;
        uint32_t revents, nb_fd;
        struct lttng_poll_event events;
 
@@ -38,6 +39,10 @@ void *ust_thread_manage_notify(void *data)
        rcu_register_thread();
        rcu_thread_online();
 
+       health_register(HEALTH_TYPE_APP_MANAGE_NOTIFY);
+
+       health_code_update();
+
        ret = sessiond_set_thread_pollset(&events, 2);
        if (ret < 0) {
                goto error_poll_create;
@@ -49,13 +54,17 @@ void *ust_thread_manage_notify(void *data)
                goto error;
        }
 
+       health_code_update();
+
        while (1) {
                DBG3("[ust-thread] Manage notify polling on %d fds",
                                LTTNG_POLL_GETNB(&events));
 
                /* Inifinite blocking call, waiting for transmission */
 restart:
+               health_poll_entry();
                ret = lttng_poll_wait(&events, -1);
+               health_poll_exit();
                if (ret < 0) {
                        /*
                         * Restart interrupted system call.
@@ -69,6 +78,8 @@ restart:
                nb_fd = ret;
 
                for (i = 0; i < nb_fd; i++) {
+                       health_code_update();
+
                        /* Fetch once the poll data */
                        revents = LTTNG_POLL_GETEV(&events, i);
                        pollfd = LTTNG_POLL_GETFD(&events, i);
@@ -76,6 +87,7 @@ restart:
                        /* Thread quit pipe has been closed. Killing thread. */
                        ret = sessiond_check_thread_quit_pipe(pollfd, revents);
                        if (ret) {
+                               err = 0;
                                goto exit;
                        }
 
@@ -100,6 +112,7 @@ restart:
                                        PERROR("read apps notify pipe");
                                        goto error;
                                }
+                               health_code_update();
 
                                ret = lttng_poll_add(&events, sock,
                                                LPOLLIN | LPOLLERR | LPOLLHUP | LPOLLRDHUP);
@@ -147,6 +160,7 @@ restart:
                                        ERR("Unknown poll events %u for sock %d", revents, pollfd);
                                        continue;
                                }
+                               health_code_update();
                        }
                }
        }
@@ -158,6 +172,11 @@ error_poll_create:
        utils_close_pipe(apps_cmd_notify_pipe);
        apps_cmd_notify_pipe[0] = apps_cmd_notify_pipe[1] = -1;
        DBG("Application notify communication apps thread cleanup complete");
+       if (err) {
+               health_error();
+               ERR("Health error occurred in %s", __func__);
+       }
+       health_unregister();
        rcu_thread_offline();
        rcu_unregister_thread();
        return NULL;
This page took 0.028745 seconds and 4 git commands to generate.