From 5c5373c3cbfebddb0068fe13600766bb381048da Mon Sep 17 00:00:00 2001 From: Jonathan Rajotte Date: Mon, 12 Apr 2021 16:38:16 -0400 Subject: [PATCH] trigger/action executor: move trigger registration state change to client thread MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Set the unregistered state of the sessiond side trigger object in the client thread since we want to minimize the possibility of the notification thread being stalled due to a long execution of an action in the action executor thread. Stalling the client thread is, comparatively, less harmful. Signed-off-by: Jonathan Rajotte Signed-off-by: Jérémie Galarneau Change-Id: I7de875996b430e49ec50896f8b26a75af7993c74 --- src/bin/lttng-sessiond/cmd.c | 24 +++++++++++++++++++ .../notification-thread-events.c | 3 --- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c index 73773bd13..c7745abf1 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -4549,6 +4549,7 @@ enum lttng_error_code cmd_unregister_trigger(const struct lttng_credentials *cmd const char *trigger_name; uid_t trigger_owner; enum lttng_trigger_status trigger_status; + struct lttng_trigger *sessiond_trigger = NULL; trigger_status = lttng_trigger_get_name(trigger, &trigger_name); trigger_name = trigger_status == LTTNG_TRIGGER_STATUS_OK ? trigger_name : "(unnamed)"; @@ -4576,6 +4577,28 @@ enum lttng_error_code cmd_unregister_trigger(const struct lttng_credentials *cmd } } + /* Fetch the sessiond side trigger object. */ + ret_code = notification_thread_command_get_trigger( + notification_thread, trigger, &sessiond_trigger); + if (ret_code != LTTNG_OK) { + DBG("Failed to get trigger from notification thread during unregister: trigger name = '%s', trigger owner uid = %d, error code = %d", + trigger_name, (int) trigger_owner, ret_code); + goto end; + } + + assert(sessiond_trigger); + + /* + * From this point on, no matter what, consider the trigger + * unregistered. + * + * We set the unregistered state of the sessiond side trigger object in + * the client thread since we want to minimize the possibility of the + * notification thread being stalled due to a long execution of an + * action that required the trigger lock. + */ + lttng_trigger_set_as_unregistered(sessiond_trigger); + ret_code = notification_thread_command_unregister_trigger(notification_thread, trigger); if (ret_code != LTTNG_OK) { @@ -4600,6 +4623,7 @@ enum lttng_error_code cmd_unregister_trigger(const struct lttng_credentials *cmd } end: + lttng_trigger_put(sessiond_trigger); return ret_code; } diff --git a/src/bin/lttng-sessiond/notification-thread-events.c b/src/bin/lttng-sessiond/notification-thread-events.c index 28e553f44..90fdadd61 100644 --- a/src/bin/lttng-sessiond/notification-thread-events.c +++ b/src/bin/lttng-sessiond/notification-thread-events.c @@ -3049,9 +3049,6 @@ int handle_notification_thread_command_unregister_trigger( trigger_ht_element = caa_container_of(triggers_ht_node, struct lttng_trigger_ht_element, node); - /* From this point, consider the trigger unregistered no matter what. */ - lttng_trigger_set_as_unregistered(trigger_ht_element->trigger); - /* Remove trigger from channel_triggers_ht. */ cds_lfht_for_each_entry(state->channel_triggers_ht, &iter, trigger_list, channel_triggers_ht_node) { -- 2.34.1