SoW-2020-0002: Trace Hit Counters: trigger error reporting integration
[lttng-tools.git] / src / bin / lttng-sessiond / main.c
index 4bdac5217978d28dd2af6c036d66f0650615a9bf..efb2117cb4bfa9d6ce5b6940c07bc6c303c0547e 100644 (file)
@@ -51,7 +51,6 @@
 #include "event.h"
 #include "kernel.h"
 #include "kernel-consumer.h"
-#include "shm.h"
 #include "lttng-ust-ctl.h"
 #include "ust-consumer.h"
 #include "utils.h"
@@ -74,6 +73,7 @@
 #include "register.h"
 #include "manage-apps.h"
 #include "manage-kernel.h"
+#include "trigger-error-accounting.h"
 
 static const char *help_msg =
 #ifdef LTTNG_EMBED_HELP
@@ -83,6 +83,8 @@ NULL
 #endif
 ;
 
+#define TRIGGER_ERROR_COUNTER_NUMBER_OF_BUCKET_MAX 65535
+
 const char *progname;
 static int lockfile_fd = -1;
 static int opt_print_version;
@@ -120,6 +122,7 @@ static const struct option long_options[] = {
        { "load", required_argument, 0, 'l' },
        { "kmod-probes", required_argument, 0, '\0' },
        { "extra-kmod-probes", required_argument, 0, '\0' },
+       { "trigger-error-number-of-bucket", required_argument, 0, '\0' },
        { NULL, 0, 0, 0 }
 };
 
@@ -314,6 +317,9 @@ static void sessiond_cleanup(void)
 
        pthread_mutex_destroy(&session_list->lock);
 
+       DBG("Cleaning up all trigger agents");
+       trigger_agent_ht_clean();
+
        DBG("Cleaning up all agent apps");
        agent_app_ht_clean();
        DBG("Closing all UST sockets");
@@ -694,6 +700,23 @@ static int set_option(int opt, const char *arg, const char *optname)
                                ret = -ENOMEM;
                        }
                }
+       } else if (string_match(optname, "trigger-error-number-of-bucket")) {
+               unsigned long v;
+
+               errno = 0;
+               v = strtoul(arg, NULL, 0);
+               if (errno != 0 || !isdigit(arg[0])) {
+                       ERR("Wrong value in --trigger-error-number-of-bucket parameter: %s", arg);
+                       return -1;
+               }
+               if (v == 0 || v >= TRIGGER_ERROR_COUNTER_NUMBER_OF_BUCKET_MAX) {
+                       ERR("Value out of range for --trigger-error-number-of-bucket parameter: %s", arg);
+                       return -1;
+               }
+               config.trigger_error_counter_bucket = (int) v;
+               DBG3("Number of error counter set to non default: %i",
+                               config.trigger_error_counter_bucket);
+               goto end;
        } else if (string_match(optname, "config") || opt == 'f') {
                /* This is handled in set_options() thus silent skip. */
                goto end;
@@ -1529,6 +1552,8 @@ int main(int argc, char **argv)
                goto stop_threads;
        }
 
+       trigger_error_accounting_init(config.trigger_error_counter_bucket);
+
        /*
         * Initialize agent app hash table. We allocate the hash table here
         * since cleanup() can get called after this point.
@@ -1539,6 +1564,11 @@ int main(int argc, char **argv)
                goto stop_threads;
        }
 
+       if (trigger_agent_ht_alloc()) {
+               ERR("Failed to allocate trigger agent hash table");
+               retval = -1;
+               goto stop_threads;
+       }
        /*
         * These actions must be executed as root. We do that *after* setting up
         * the sockets path because we MUST make the check for another daemon using
@@ -1636,7 +1666,8 @@ int main(int argc, char **argv)
        notification_thread_handle = notification_thread_handle_create(
                        ust32_channel_monitor_pipe,
                        ust64_channel_monitor_pipe,
-                       kernel_channel_monitor_pipe);
+                       kernel_channel_monitor_pipe,
+                       kernel_get_notification_fd());
        if (!notification_thread_handle) {
                retval = -1;
                ERR("Failed to create notification thread shared data");
@@ -1726,6 +1757,16 @@ int main(int argc, char **argv)
                        retval = -1;
                        goto stop_threads;
                }
+
+               if (kernel_get_notification_fd() > -1) {
+                       ret = notification_thread_command_add_application(
+                                       notification_thread_handle, kernel_get_notification_fd(), LTTNG_DOMAIN_KERNEL);
+                       if (ret != LTTNG_OK) {
+                               ERR("Failed to add kernel trigger event source to notification thread");
+                               retval = -1;
+                               goto stop_threads;
+                       }
+               }
        }
 
        /* Load sessions. */
@@ -1749,6 +1790,8 @@ int main(int argc, char **argv)
        sessiond_wait_for_quit_pipe(-1);
 
 stop_threads:
+
+       trigger_error_accounting_fini();
        /*
         * Ensure that the client thread is no longer accepting new commands,
         * which could cause new sessions to be created.
This page took 0.035029 seconds and 5 git commands to generate.