From: Jérémie Galarneau Date: Tue, 26 Nov 2019 20:15:33 +0000 (-0500) Subject: relayd: initialize the global fd tracker from fd_cap option X-Git-Tag: v2.12.0-rc1~65 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=00e3b7f1faebd0595329a8532abbb9e77e5e2149;p=lttng-tools.git relayd: initialize the global fd tracker from fd_cap option Initialize the relay daemon's global fd tracker from the current fd-cap configuration. This is in preparation for follow-up patches which will introduce the tracking of the various file descriptor backed resources to the relay daemon. Signed-off-by: Jérémie Galarneau Change-Id: Iaabb80f1fb4d24345b750503c90388f94025159d --- diff --git a/src/bin/lttng-relayd/Makefile.am b/src/bin/lttng-relayd/Makefile.am index 8b903680a..4fc35dc0f 100644 --- a/src/bin/lttng-relayd/Makefile.am +++ b/src/bin/lttng-relayd/Makefile.am @@ -36,4 +36,5 @@ lttng_relayd_LDADD = -lurcu-common -lurcu \ $(top_builddir)/src/common/health/libhealth.la \ $(top_builddir)/src/common/config/libconfig.la \ $(top_builddir)/src/common/testpoint/libtestpoint.la \ + $(top_builddir)/src/common/fd-tracker/libfd-tracker.la \ $(top_builddir)/src/lib/lttng-ctl/liblttng-ctl.la diff --git a/src/bin/lttng-relayd/lttng-relayd.h b/src/bin/lttng-relayd/lttng-relayd.h index 748083ddf..fc68c513f 100644 --- a/src/bin/lttng-relayd/lttng-relayd.h +++ b/src/bin/lttng-relayd/lttng-relayd.h @@ -25,6 +25,7 @@ #include #include +#include struct sessiond_trace_chunk_registry; @@ -60,6 +61,8 @@ extern enum relay_group_output_by opt_group_output_by; extern int thread_quit_pipe[2]; +extern struct fd_tracker *the_fd_tracker; + void lttng_relay_notify_ready(void); int lttng_relay_stop_threads(void); diff --git a/src/bin/lttng-relayd/main.c b/src/bin/lttng-relayd/main.c index 07e7a0122..f1f03d1bd 100644 --- a/src/bin/lttng-relayd/main.c +++ b/src/bin/lttng-relayd/main.c @@ -63,6 +63,7 @@ #include #include #include +#include #include "backward-compatibility-group-by.h" #include "cmd.h" @@ -179,6 +180,9 @@ struct health_app *health_relayd; struct sessiond_trace_chunk_registry *sessiond_trace_chunk_registry; +/* Global fd tracker. */ +struct fd_tracker *the_fd_tracker; + static struct option long_options[] = { { "control-port", 1, 0, 'C', }, { "data-port", 1, 0, 'D', }, @@ -631,13 +635,9 @@ exit: static void print_global_objects(void) { - rcu_register_thread(); - print_viewer_streams(); print_relay_streams(); print_sessions(); - - rcu_unregister_thread(); } /* @@ -670,6 +670,9 @@ static void relayd_cleanup(void) sessiond_trace_chunk_registry_destroy( sessiond_trace_chunk_registry); } + if (the_fd_tracker) { + fd_tracker_destroy(the_fd_tracker); + } uri_free(control_uri); uri_free(data_uri); @@ -678,6 +681,7 @@ static void relayd_cleanup(void) if (tracing_group_name_override) { free((void *) tracing_group_name); } + fd_tracker_log(the_fd_tracker); } /* @@ -3977,6 +3981,7 @@ static int create_relay_conn_pipe(void) */ int main(int argc, char **argv) { + bool thread_is_rcu_registered = false; int ret = 0, retval = 0; void *status; @@ -4071,6 +4076,21 @@ int main(int argc, char **argv) goto exit_options; } + /* + * The RCU thread registration (and use, through the fd-tracker's + * creation) is done after the daemonization to allow us to not + * deal with liburcu's fork() management as the call RCU needs to + * be restored. + */ + rcu_register_thread(); + thread_is_rcu_registered = true; + + the_fd_tracker = fd_tracker_create(lttng_opt_fd_cap); + if (!the_fd_tracker) { + retval = -1; + goto exit_options; + } + /* Initialize thread health monitoring */ health_relayd = health_app_create(NR_HEALTH_RELAYD_TYPES); if (!health_relayd) { @@ -4225,6 +4245,10 @@ exit_options: /* Ensure all prior call_rcu are done. */ rcu_barrier(); + if (thread_is_rcu_registered) { + rcu_unregister_thread(); + } + if (!retval) { exit(EXIT_SUCCESS); } else {