X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcmd.c;h=c7745abf1485d37f2e651ec8d37490adbb6b85a9;hp=90a011fd9ad72a0f44efe2418d1706842e796dff;hb=b99a0cb3edd93f55e712096a352d64b79d4716bb;hpb=566190c494083c9a460fbcb9052b5143a14a6e56 diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c index 90a011fd9..c7745abf1 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -4360,7 +4360,7 @@ enum lttng_error_code synchronize_tracer_notifier_register( goto end_unlock_session_list; } - agent_add(agt, trigger_agents_ht_by_domain); + agent_add(agt, the_trigger_agents_ht_by_domain); } ret_code = trigger_agent_enable(trigger, agt); @@ -4501,6 +4501,10 @@ enum lttng_error_code synchronize_tracer_notifier_unregister( switch (trigger_domain) { case LTTNG_DOMAIN_KERNEL: ret_code = kernel_unregister_event_notifier(trigger); + if (ret_code != LTTNG_OK) { + goto end_unlock_session_list; + } + break; case LTTNG_DOMAIN_UST: ust_app_global_update_all_event_notifier_rules(); @@ -4545,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)"; @@ -4572,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) { @@ -4596,6 +4623,7 @@ enum lttng_error_code cmd_unregister_trigger(const struct lttng_credentials *cmd } end: + lttng_trigger_put(sessiond_trigger); return ret_code; } @@ -5316,8 +5344,8 @@ int cmd_rotate_session(struct ltt_session *session, chunk_being_archived = NULL; if (!quiet_rotation) { ret = notification_thread_command_session_rotation_ongoing( - notification_thread_handle, - session->name, session->uid, session->gid, + the_notification_thread_handle, session->name, + session->uid, session->gid, ongoing_rotation_chunk_id); if (ret != LTTNG_OK) { ERR("Failed to notify notification thread that a session rotation is ongoing for session %s",