X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fmain.c;h=efb2117cb4bfa9d6ce5b6940c07bc6c303c0547e;hp=38ff2fd26b3d389d093fa458b897cf2dfe43b9f6;hb=2463b7879c00298daa79744cdaae82ac061a4ed8;hpb=75018ab6aaa9b49e6248b002d9795319a0e5bb9a diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c index 38ff2fd26..efb2117cb 100644 --- a/src/bin/lttng-sessiond/main.c +++ b/src/bin/lttng-sessiond/main.c @@ -1,20 +1,10 @@ /* - * Copyright (C) 2011 - David Goulet - * Mathieu Desnoyers - * 2013 - Jérémie Galarneau + * Copyright (C) 2011 David Goulet + * Copyright (C) 2011 Mathieu Desnoyers + * Copyright (C) 2013 Jérémie Galarneau * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License, version 2 only, - * as published by the Free Software Foundation. + * SPDX-License-Identifier: GPL-2.0-only * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define _LGPL_SOURCE @@ -61,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" @@ -84,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 @@ -93,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; @@ -130,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 } }; @@ -324,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"); @@ -667,7 +663,7 @@ static int set_option(int opt, const char *arg, const char *optname) WARN("Getting '%s' argument from setuid/setgid binary refused for security reasons.", "-l, --load"); } else { - config_string_set(&config.load_session_path, strdup(arg)); + config_string_set(&config.load_session_path, strdup(arg)); if (!config.load_session_path.value) { PERROR("strdup"); ret = -ENOMEM; @@ -704,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; @@ -879,7 +892,7 @@ end: */ static int create_lockfile(void) { - return utils_create_lock_file(config.lock_file_path.value); + return utils_create_lock_file(config.lock_file_path.value); } /* @@ -1193,7 +1206,7 @@ static void set_ulimit(void) static int write_pidfile(void) { - return utils_create_pid_file(getpid(), config.pid_file_path.value); + return utils_create_pid_file(getpid(), config.pid_file_path.value); } static int set_clock_plugin_env(void) @@ -1205,7 +1218,7 @@ static int set_clock_plugin_env(void) goto end; } - ret = asprintf(&env_value, "LTTNG_UST_CLOCK_PLUGIN=%s", + ret = asprintf(&env_value, "LTTNG_UST_CLOCK_PLUGIN=%s", config.lttng_ust_clock_plugin.value); if (ret < 0) { PERROR("asprintf"); @@ -1286,7 +1299,7 @@ static int launch_run_as_worker(const char *procname) static void sessiond_uuid_log(void) { - char uuid_str[UUID_STR_LEN]; + char uuid_str[LTTNG_UUID_STR_LEN]; lttng_uuid_to_str(sessiond_uuid, uuid_str); DBG("Starting lttng-sessiond {%s}", uuid_str); @@ -1312,6 +1325,7 @@ int main(int argc, char **argv) struct lttng_thread *notification_thread = NULL; struct lttng_thread *register_apps_thread = NULL; + logger_set_thread_name("Main", false); init_kernel_workarounds(); rcu_register_thread(); @@ -1538,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. @@ -1548,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 @@ -1645,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"); @@ -1735,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. */ @@ -1758,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.