X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fnotification-thread.c;h=56f1124fbfbfbde93c7a1ba9959182221e58095d;hp=1ba724337b67ee69a1856087a5c8b65c45a32cd8;hb=412d7227e69ec845e44c49082a417f9454d9b55d;hpb=940786035bcaf18b6b19a6a98f928ad4f52375f4 diff --git a/src/bin/lttng-sessiond/notification-thread.c b/src/bin/lttng-sessiond/notification-thread.c index 1ba724337..56f1124fb 100644 --- a/src/bin/lttng-sessiond/notification-thread.c +++ b/src/bin/lttng-sessiond/notification-thread.c @@ -27,6 +27,7 @@ #include "lttng-sessiond.h" #include "health-sessiond.h" #include "thread.h" +#include "testpoint.h" #include "kernel.h" #include @@ -35,6 +36,8 @@ #include #include + +int notifier_consumption_paused; /* * Destroy the thread data previously created by the init function. */ @@ -235,8 +238,8 @@ int notification_channel_socket_create(void) if (getuid() == 0) { gid_t gid; - ret = utils_get_group_id(config.tracing_group_name.value, true, - &gid); + ret = utils_get_group_id(the_config.tracing_group_name.value, + true, &gid); if (ret) { /* Default to root group. */ gid = 0; @@ -510,6 +513,9 @@ int init_thread_state(struct notification_thread_handle *handle, if (!state->executor) { goto error; } + + state->restart_poll = false; + mark_thread_as_ready(handle); end: return 0; @@ -571,6 +577,17 @@ static int handle_event_notification_pipe(int event_source_fd, goto end; } + if (testpoint(sessiond_handle_notifier_event_pipe)) { + ret = 0; + goto end; + } + + if (caa_unlikely(notifier_consumption_paused)) { + DBG("Event notifier notification consumption paused, sleeping..."); + sleep(1); + goto end; + } + ret = handle_notification_thread_event_notification( state, event_source_fd, domain); if (ret) { @@ -579,6 +596,7 @@ static int handle_event_notification_pipe(int event_source_fd, ret = -1; goto end; } + end: return ret; } @@ -621,7 +639,7 @@ void *thread_notification(void *data) DBG("[notification-thread] Started notification thread"); - health_register(health_sessiond, HEALTH_SESSIOND_TYPE_NOTIFICATION); + health_register(the_health_sessiond, HEALTH_SESSIOND_TYPE_NOTIFICATION); rcu_register_thread(); rcu_thread_online(); @@ -637,6 +655,10 @@ void *thread_notification(void *data) goto end; } + if (testpoint(sessiond_thread_notification)) { + goto end; + } + while (true) { int fd_count, i; @@ -656,6 +678,12 @@ void *thread_notification(void *data) goto error; } + /* + * Reset restart_poll flag so that calls below might turn it + * on. + */ + state.restart_poll = false; + fd_count = ret; for (i = 0; i < fd_count; i++) { int fd = LTTNG_POLL_GETFD(&state.events, i); @@ -733,6 +761,15 @@ void *thread_notification(void *data) } } } + + /* + * Calls above might have changed the state of the + * FDs in `state.events`. Call _poll_wait() again to + * ensure we have a consistent state. + */ + if (state.restart_poll) { + break; + } } } exit: @@ -741,7 +778,7 @@ error: end: rcu_thread_offline(); rcu_unregister_thread(); - health_unregister(health_sessiond); + health_unregister(the_health_sessiond); return NULL; }