From: Jonathan Rajotte Date: Mon, 12 Apr 2021 20:38:16 +0000 (-0400) Subject: trigger/action executor: move trigger registration state change to client thread X-Git-Tag: v2.13.0-rc1~82 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=5c5373c3cbfebddb0068fe13600766bb381048da trigger/action executor: move trigger registration state change to client thread 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 --- 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) {