sessiond: agent: enable events matching event notifiers
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index 5c8efb40ee2c658e4959716836de214dc4bdc5a2..d8b0637534aec9d4f99dab23a6742b2cdb1a2c93 100644 (file)
@@ -488,7 +488,7 @@ static int list_lttng_agent_events(struct agent *agt,
        cds_lfht_for_each_entry (
                        agt->events->ht, &iter.iter, agent_event, node.node) {
                struct lttng_event event = {
-                       .enabled = agent_event->enabled,
+                       .enabled = AGENT_EVENT_IS_ENABLED(agent_event),
                        .loglevel = agent_event->loglevel_value,
                        .loglevel_type = agent_event->loglevel_type,
                };
@@ -4323,7 +4323,9 @@ enum lttng_error_code cmd_register_trigger(const struct lttng_credentials *cmd_c
        enum lttng_trigger_status trigger_status;
 
        trigger_status = lttng_trigger_get_name(trigger, &trigger_name);
-       assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
+       trigger_name = trigger_status == LTTNG_TRIGGER_STATUS_OK ?
+                       trigger_name : "(unnamed)";
+
        trigger_status = lttng_trigger_get_owner_uid(
                trigger, &trigger_owner);
        assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
@@ -4373,25 +4375,32 @@ enum lttng_error_code cmd_register_trigger(const struct lttng_credentials *cmd_c
        ret_code = notification_thread_command_register_trigger(notification_thread,
                        trigger);
        if (ret_code != LTTNG_OK) {
-               ERR("Failed to register trigger to notification thread: trigger name = '%s', trigger owner uid = %d, error code = %d",
+               DBG("Failed to register trigger to notification thread: trigger name = '%s', trigger owner uid = %d, error code = %d",
                                trigger_name, (int) trigger_owner, ret_code);
-               goto end_notification_thread;
+               goto end;
        }
 
+       trigger_status = lttng_trigger_get_name(trigger, &trigger_name);
+       trigger_name = trigger_status == LTTNG_TRIGGER_STATUS_OK ?
+                       trigger_name : "(unnamed)";
+
        ret_code = trigger_modifies_event_notifier(trigger, &must_update_event_notifier);
        if (ret_code != LTTNG_OK) {
                ERR("Failed to determine if event modifies event notifiers: trigger name = '%s', trigger owner uid = %d, error code = %d",
                                trigger_name, (int) trigger_owner, ret_code);
-               goto end_notification_thread;
+               goto end;
        }
 
        /*
         * Synchronize tracers if the trigger adds an event notifier.
         */
        if (must_update_event_notifier) {
-               if (lttng_trigger_get_underlying_domain_type_restriction(
-                                   trigger) == LTTNG_DOMAIN_KERNEL) {
+               const enum lttng_domain_type trigger_domain =
+                               lttng_trigger_get_underlying_domain_type_restriction(trigger);
 
+               switch (trigger_domain) {
+               case LTTNG_DOMAIN_KERNEL:
+               {
                        ret_code = kernel_register_event_notifier(
                                        trigger, cmd_creds);
                        if (ret_code != LTTNG_OK) {
@@ -4407,11 +4416,36 @@ enum lttng_error_code cmd_register_trigger(const struct lttng_credentials *cmd_c
                                                        (int) trigger_owner,
                                                        ret_code);
                                }
+                       }
+                       break;
+               }
+               case LTTNG_DOMAIN_UST:
+                       ust_app_global_update_all_event_notifier_rules();
+                       break;
+               case LTTNG_DOMAIN_NONE:
+                       abort();
+               default:
+               {
+                       /* Agent domains. */
+                       struct agent *agt = agent_find_by_event_notifier_domain(
+                                       trigger_domain);
+
+                       if (!agt) {
+                               agt = agent_create(trigger_domain);
+                               if (!agt) {
+                                       ret_code = LTTNG_ERR_NOMEM;
+                                       goto end;
+                               }
+                               agent_add(agt, trigger_agents_ht_by_domain);
+                       }
 
+                       ret_code = trigger_agent_enable(trigger, agt);
+                       if (ret_code != LTTNG_OK) {
                                goto end;
                        }
-               } else {
-                       ust_app_global_update_all_event_notifier_rules();
+
+                       break;
+               }
                }
        }
 
@@ -4424,9 +4458,7 @@ enum lttng_error_code cmd_register_trigger(const struct lttng_credentials *cmd_c
         */
        lttng_trigger_get(trigger);
        *return_trigger = trigger;
-
-end_notification_thread:
-       /* Ownership of trigger was transferred. */
+       /* Ownership of trigger was transferred to caller. */
        trigger = NULL;
 end:
        return ret_code;
@@ -4443,7 +4475,7 @@ enum lttng_error_code cmd_unregister_trigger(const struct lttng_credentials *cmd
        enum lttng_trigger_status trigger_status;
 
        trigger_status = lttng_trigger_get_name(trigger, &trigger_name);
-       assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
+       trigger_name = trigger_status == LTTNG_TRIGGER_STATUS_OK ? trigger_name : "(unnamed)";
        trigger_status = lttng_trigger_get_owner_uid(
                trigger, &trigger_owner);
        assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
@@ -4479,21 +4511,55 @@ enum lttng_error_code cmd_unregister_trigger(const struct lttng_credentials *cmd
        ret_code = notification_thread_command_unregister_trigger(notification_thread,
                                                                  trigger);
        if (ret_code != LTTNG_OK) {
-               ERR("Failed to unregister trigger from notification thread: trigger name = '%s', trigger owner uid = %d, error code = %d",
+               DBG("Failed to unregister trigger from notification thread: trigger name = '%s', trigger owner uid = %d, error code = %d",
                                trigger_name, (int) trigger_owner, ret_code);
        }
 
        /*
         * Synchronize tracers if the trigger removes an event notifier.
+        * Do this even if the trigger unregistration failed to at least stop
+        * the tracers from producing notifications associated with this
+        * event notifier.
         */
        if (must_update_event_notifier) {
-               if (lttng_trigger_get_underlying_domain_type_restriction(
-                                   trigger) == LTTNG_DOMAIN_KERNEL) {
+               const enum lttng_domain_type trigger_domain =
+                               lttng_trigger_get_underlying_domain_type_restriction(
+                                               trigger);
 
+               switch (trigger_domain) {
+               case LTTNG_DOMAIN_KERNEL:
+               {
                        ret_code = kernel_unregister_event_notifier(
                                        trigger);
-               } else {
+                       break;
+               }
+               case LTTNG_DOMAIN_UST:
                        ust_app_global_update_all_event_notifier_rules();
+                       break;
+               case LTTNG_DOMAIN_NONE:
+                       abort();
+               default:
+               {
+                       /* Agent domains. */
+                       struct agent *agt = agent_find_by_event_notifier_domain(
+                                       trigger_domain);
+
+                       if (!agt) {
+                               agt = agent_create(trigger_domain);
+                               if (!agt) {
+                                       ret_code = LTTNG_ERR_NOMEM;
+                                       goto end;
+                               }
+                               agent_add(agt, trigger_agents_ht_by_domain);
+                       }
+
+                       ret_code = trigger_agent_disable(trigger, agt);
+                       if (ret_code != LTTNG_OK) {
+                               goto end;
+                       }
+
+                       break;
+               }
                }
        }
 
This page took 0.026531 seconds and 4 git commands to generate.