sessiond: add support for anonymous triggers
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 20 Apr 2021 04:43:22 +0000 (00:43 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 22 Apr 2021 05:56:06 +0000 (01:56 -0400)
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: I5b7fb29700af7ac7b633e5d73fb29f99f55ebfe8

18 files changed:
src/bin/lttng-sessiond/action-executor.c
src/bin/lttng-sessiond/client.c
src/bin/lttng-sessiond/cmd.c
src/bin/lttng-sessiond/cmd.h
src/bin/lttng-sessiond/event-notifier-error-accounting.c
src/bin/lttng-sessiond/event.c
src/bin/lttng-sessiond/main.c
src/bin/lttng-sessiond/notification-thread-commands.c
src/bin/lttng-sessiond/notification-thread-commands.h
src/bin/lttng-sessiond/notification-thread-events.c
src/bin/lttng-sessiond/rotate.c
src/bin/lttng-sessiond/trigger-error-query.c
src/bin/lttng/commands/list_triggers.c
src/bin/lttng/commands/remove_trigger.c
src/common/sessiond-comm/sessiond-comm.h
src/common/trigger.c
tests/regression/tools/notification/notification.c
tests/regression/tools/trigger/utils/notification-client.c

index aa55782e2ded7b8fb68e4eec7e9395e7fab8baa8..9a89865a930c142e395f134d6fb23303b3d3508d 100644 (file)
@@ -206,7 +206,16 @@ static const char *get_trigger_name(const struct lttng_trigger *trigger)
        enum lttng_trigger_status trigger_status;
 
        trigger_status = lttng_trigger_get_name(trigger, &trigger_name);
-       assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
+       switch (trigger_status) {
+       case LTTNG_TRIGGER_STATUS_OK:
+               break;
+       case LTTNG_TRIGGER_STATUS_UNSET:
+               trigger_name = "(anonymous)";
+               break;
+       default:
+               trigger_name = "(failed to get name)";
+               break;
+       }
 
        return trigger_name;
 }
@@ -772,17 +781,7 @@ static void *action_executor_thread(void *_data)
                        uid_t trigger_owner_uid;
                        enum lttng_trigger_status trigger_status;
 
-                       trigger_status = lttng_trigger_get_name(
-                                       work_item->trigger, &trigger_name);
-                       switch (trigger_status) {
-                       case LTTNG_TRIGGER_STATUS_OK:
-                               break;
-                       case LTTNG_TRIGGER_STATUS_UNSET:
-                               trigger_name = "(unset)";
-                               break;
-                       default:
-                               abort();
-                       }
+                       trigger_name = get_trigger_name(work_item->trigger);
 
                        trigger_status = lttng_trigger_get_owner_uid(
                                        work_item->trigger, &trigger_owner_uid);
index 6943a776e56a91fe5ecf8cd35f10f8ae786257fb..c10b9bc87030f6183382d9c859a57d381cdfc0e0 100644 (file)
@@ -2247,6 +2247,7 @@ error_add_context:
                original_reply_payload_size = cmd_ctx->reply_payload.buffer.size;
 
                ret = cmd_register_trigger(&cmd_creds, payload_trigger,
+                               cmd_ctx->lsm.u.trigger.is_trigger_anonymous,
                                the_notification_thread_handle,
                                &return_trigger);
                if (ret != LTTNG_OK) {
index 45bf3b78f7fe011d40aa738528b34f79f90a4686..f0d5c571da18aa3e7752ef2307dfdf0afd12e3a5 100644 (file)
@@ -4320,8 +4320,7 @@ enum lttng_error_code synchronize_tracer_notifier_register(
 
        trigger_status = lttng_trigger_get_name(trigger, &trigger_name);
        trigger_name = trigger_status == LTTNG_TRIGGER_STATUS_OK ?
-                       trigger_name :
-                       "(unnamed)";
+                       trigger_name : "(anonymous)";
 
        session_lock_list();
        switch (trigger_domain) {
@@ -4386,6 +4385,7 @@ end_unlock_session_list:
 
 enum lttng_error_code cmd_register_trigger(const struct lttng_credentials *cmd_creds,
                struct lttng_trigger *trigger,
+               bool is_trigger_anonymous,
                struct notification_thread_handle *notification_thread,
                struct lttng_trigger **return_trigger)
 {
@@ -4396,7 +4396,7 @@ enum lttng_error_code cmd_register_trigger(const struct lttng_credentials *cmd_c
 
        trigger_status = lttng_trigger_get_name(trigger, &trigger_name);
        trigger_name = trigger_status == LTTNG_TRIGGER_STATUS_OK ?
-                       trigger_name : "(unnamed)";
+                       trigger_name : "(anonymous)";
 
        trigger_status = lttng_trigger_get_owner_uid(
                trigger, &trigger_owner);
@@ -4444,8 +4444,8 @@ enum lttng_error_code cmd_register_trigger(const struct lttng_credentials *cmd_c
         * it is safe to use without any locking as its properties are
         * immutable.
         */
-       ret_code = notification_thread_command_register_trigger(notification_thread,
-                       trigger);
+       ret_code = notification_thread_command_register_trigger(
+                       notification_thread, trigger, is_trigger_anonymous);
        if (ret_code != LTTNG_OK) {
                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);
@@ -4454,7 +4454,7 @@ enum lttng_error_code cmd_register_trigger(const struct lttng_credentials *cmd_c
 
        trigger_status = lttng_trigger_get_name(trigger, &trigger_name);
        trigger_name = trigger_status == LTTNG_TRIGGER_STATUS_OK ?
-                       trigger_name : "(unnamed)";
+                       trigger_name : "(anonymous)";
 
        /*
         * Synchronize tracers if the trigger adds an event notifier.
@@ -4556,7 +4556,7 @@ enum lttng_error_code cmd_unregister_trigger(const struct lttng_credentials *cmd
        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)";
+       trigger_name = trigger_status == LTTNG_TRIGGER_STATUS_OK ? trigger_name : "(anonymous)";
        trigger_status = lttng_trigger_get_owner_uid(trigger, &trigger_owner);
        assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
 
@@ -4702,7 +4702,7 @@ enum lttng_error_code cmd_execute_error_query(const struct lttng_credentials *cm
 
        trigger_status = lttng_trigger_get_name(matching_trigger, &trigger_name);
        trigger_name = trigger_status == LTTNG_TRIGGER_STATUS_OK ?
-                       trigger_name : "(unnamed)";
+                       trigger_name : "(anonymous)";
        trigger_status = lttng_trigger_get_owner_uid(matching_trigger,
                        &trigger_owner);
        assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
index 9aa13ff2220eb751c8455960ca55dafdc6a3f871..33cac66ffb09d17ace1b75e3e9dbdfadc4e4db0b 100644 (file)
@@ -144,6 +144,7 @@ int cmd_regenerate_statedump(struct ltt_session *session);
 enum lttng_error_code cmd_register_trigger(
                const struct lttng_credentials *cmd_creds,
                struct lttng_trigger *trigger,
+               bool is_anonymous_trigger,
                struct notification_thread_handle *notification_thread_handle,
                struct lttng_trigger **return_trigger);
 enum lttng_error_code cmd_unregister_trigger(
index 61ba6981e7806426a50cb5d287c4cdc4a9d6f208..aac6854679f2cc49dbfbc8dd4b9c10877ed5a235 100644 (file)
@@ -78,7 +78,7 @@ static inline void get_trigger_info_for_log(const struct lttng_trigger *trigger,
        case LTTNG_TRIGGER_STATUS_OK:
                break;
        case LTTNG_TRIGGER_STATUS_UNSET:
-               *trigger_name = "(unset)";
+               *trigger_name = "(anonymous)";
                break;
        default:
                abort();
index 50d8fd028f695f81d86aecf11c4807c5043261bd..60aa2cde85e9817492b54e3d559d36c73b709277 100644 (file)
@@ -592,7 +592,7 @@ int trigger_agent_enable(const struct lttng_trigger *trigger, struct agent *agt)
 
        t_status = lttng_trigger_get_name(trigger, &trigger_name);
        if (t_status != LTTNG_TRIGGER_STATUS_OK) {
-               trigger_name = "(unnamed)";
+               trigger_name = "(anonymous)";
        }
 
        t_status = lttng_trigger_get_owner_uid(trigger, &trigger_owner_uid);
index 05566d5f86fdb6494e8069bdafc7c03cbc05733a..02e18a22c62942e5a8cb494b8cfbb218ae2e6503 100644 (file)
@@ -1363,7 +1363,8 @@ static void unregister_all_triggers(void)
                assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
 
                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 : "(anonymous)";
 
                DBG("Unregistering trigger: trigger owner uid = %d, trigger name = '%s'",
                                (int) trigger_owner, trigger_name);
index 7f031e7427688e903df292ff0a7da7a1176dc023..89eb37bb1ae82beba6be84eb765b996b171e2609 100644 (file)
@@ -111,7 +111,8 @@ error:
 
 enum lttng_error_code notification_thread_command_register_trigger(
                struct notification_thread_handle *handle,
-               struct lttng_trigger *trigger)
+               struct lttng_trigger *trigger,
+               bool is_trigger_anonymous)
 {
        int ret;
        enum lttng_error_code ret_code;
@@ -123,6 +124,8 @@ enum lttng_error_code notification_thread_command_register_trigger(
        cmd.type = NOTIFICATION_COMMAND_TYPE_REGISTER_TRIGGER;
        lttng_trigger_get(trigger);
        cmd.parameters.register_trigger.trigger = trigger;
+       cmd.parameters.register_trigger.is_trigger_anonymous =
+                       is_trigger_anonymous;
 
        ret = run_command_wait(handle, &cmd);
        if (ret) {
index 882959a29d0cc2c571e70e49d78552997ae71531..0aa7a80c3f94cc3a8a1e519f620ac625d2b5d7b6 100644 (file)
@@ -43,6 +43,7 @@ struct notification_thread_command {
                /* Register trigger. */
                struct {
                        struct lttng_trigger *trigger;
+                       bool is_trigger_anonymous;
                } register_trigger;
                /* Unregister trigger. */
                struct {
@@ -112,7 +113,8 @@ struct notification_thread_command {
 
 enum lttng_error_code notification_thread_command_register_trigger(
                struct notification_thread_handle *handle,
-               struct lttng_trigger *trigger);
+               struct lttng_trigger *trigger,
+               bool is_anonymous_trigger);
 
 enum lttng_error_code notification_thread_command_unregister_trigger(
                struct notification_thread_handle *handle,
index 9e4ad7cb82b44295a212ab89abc4daf001a64b61..178b80fa2b59bbcc715ad23245924b7b0d48657a 100644 (file)
@@ -373,7 +373,7 @@ int match_trigger_by_name_uid(struct cds_lfht_node *node,
                const void *key)
 {
        bool match = false;
-       const char *name;
+       const char *element_trigger_name;
        const char *key_name;
        enum lttng_trigger_status status;
        const struct lttng_credentials *key_creds;
@@ -385,14 +385,25 @@ int match_trigger_by_name_uid(struct cds_lfht_node *node,
                                struct lttng_trigger_ht_element,
                                node_by_name_uid);
 
-       status = lttng_trigger_get_name(trigger_ht_element->trigger, &name);
-       assert(status == LTTNG_TRIGGER_STATUS_OK);
+       status = lttng_trigger_get_name(trigger_ht_element->trigger,
+                       &element_trigger_name);
+       element_trigger_name = status == LTTNG_TRIGGER_STATUS_OK ?
+                       element_trigger_name : NULL;
 
        status = lttng_trigger_get_name(trigger_key, &key_name);
-       assert(status == LTTNG_TRIGGER_STATUS_OK);
+       key_name = status == LTTNG_TRIGGER_STATUS_OK ? key_name : NULL;
 
-       /* Compare the names. */
-       if (strcmp(name, key_name) != 0) {
+       /*
+        * Compare the names.
+        * Consider null names as not equal. This is to maintain backwards
+        * compatibility with pre-2.13 anonymous triggers. Multiples anonymous
+        * triggers are allowed for a given user.
+        */
+       if (!element_trigger_name || !key_name) {
+               goto end;
+       }
+
+       if (strcmp(element_trigger_name, key_name) != 0) {
                goto end;
        }
 
@@ -2253,7 +2264,7 @@ static inline void get_trigger_info_for_log(const struct lttng_trigger *trigger,
        case LTTNG_TRIGGER_STATUS_OK:
                break;
        case LTTNG_TRIGGER_STATUS_UNSET:
-               *trigger_name = "(unset)";
+               *trigger_name = "(anonymous)";
                break;
        default:
                abort();
@@ -2635,6 +2646,7 @@ static
 int handle_notification_thread_command_register_trigger(
                struct notification_thread_state *state,
                struct lttng_trigger *trigger,
+               bool is_trigger_anonymous,
                enum lttng_error_code *cmd_result)
 {
        int ret = 0;
@@ -2657,22 +2669,27 @@ int handle_notification_thread_command_register_trigger(
        /* Set the trigger's tracer token. */
        lttng_trigger_set_tracer_token(trigger, trigger_tracer_token);
 
-       if (lttng_trigger_get_name(trigger, &trigger_name) ==
-                       LTTNG_TRIGGER_STATUS_UNSET) {
-               const enum lttng_error_code ret_code = generate_trigger_name(
-                               state, trigger, &trigger_name);
+       if (!is_trigger_anonymous) {
+               if (lttng_trigger_get_name(trigger, &trigger_name) ==
+                               LTTNG_TRIGGER_STATUS_UNSET) {
+                       const enum lttng_error_code ret_code =
+                                       generate_trigger_name(state, trigger,
+                                                       &trigger_name);
 
-               if (ret_code != LTTNG_OK) {
-                       /* Fatal error. */
-                       ret = -1;
-                       *cmd_result = ret_code;
+                       if (ret_code != LTTNG_OK) {
+                               /* Fatal error. */
+                               ret = -1;
+                               *cmd_result = ret_code;
+                               goto error;
+                       }
+               } else if (trigger_name_taken(state, trigger)) {
+                       /* Not a fatal error. */
+                       *cmd_result = LTTNG_ERR_TRIGGER_EXISTS;
+                       ret = 0;
                        goto error;
                }
-       } else if (trigger_name_taken(state, trigger)) {
-               /* Not a fatal error. */
-               *cmd_result = LTTNG_ERR_TRIGGER_EXISTS;
-               ret = 0;
-               goto error;
+       } else {
+               trigger_name = "(anonymous)";
        }
 
        condition = lttng_trigger_get_condition(trigger);
@@ -3091,6 +3108,7 @@ int handle_notification_thread_command(
        case NOTIFICATION_COMMAND_TYPE_REGISTER_TRIGGER:
                ret = handle_notification_thread_command_register_trigger(state,
                                cmd->parameters.register_trigger.trigger,
+                               cmd->parameters.register_trigger.is_trigger_anonymous,
                                &cmd->reply_code);
                break;
        case NOTIFICATION_COMMAND_TYPE_UNREGISTER_TRIGGER:
@@ -4537,11 +4555,9 @@ int dispatch_one_event_notifier_notification(struct notification_thread_state *s
        struct cds_lfht_node *node;
        struct cds_lfht_iter iter;
        struct notification_trigger_tokens_ht_element *element;
-       enum lttng_trigger_status trigger_status;
        struct lttng_evaluation *evaluation = NULL;
        enum action_executor_status executor_status;
        struct notification_client_list *client_list = NULL;
-       const char *trigger_name;
        int ret;
        unsigned int capture_count = 0;
 
@@ -4566,9 +4582,6 @@ int dispatch_one_event_notifier_notification(struct notification_thread_state *s
                        struct notification_trigger_tokens_ht_element,
                        node);
 
-       trigger_status = lttng_trigger_get_name(element->trigger, &trigger_name);
-       assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
-
        if (lttng_condition_event_rule_matches_get_capture_descriptor_count(
                            lttng_trigger_get_const_condition(element->trigger),
                            &capture_count) != LTTNG_CONDITION_STATUS_OK) {
index 097da860a1e2f40013cc80f325615e19017954f5..ec0aa666837d6b6346e14047d11800584f5bc25a 100644 (file)
@@ -104,7 +104,8 @@ int subscribe_session_consumed_size_rotation(struct ltt_session *session, uint64
        }
 
        ret = notification_thread_command_register_trigger(
-                       notification_thread_handle, session->rotate_trigger);
+                       notification_thread_handle, session->rotate_trigger,
+                       true);
        if (ret < 0 && ret != -LTTNG_ERR_TRIGGER_EXISTS) {
                ERR("Register trigger, %s", lttng_strerror(ret));
                ret = -1;
index 54aeb414959ae9d12cba8e47bf5ed955e4cb797a..4c464004d52f49fffcc1769fc8a338926ff0ed62 100644 (file)
@@ -24,7 +24,7 @@ enum lttng_trigger_status lttng_trigger_add_error_results(
 
        status = lttng_trigger_get_name(trigger, &trigger_name);
        trigger_name = status == LTTNG_TRIGGER_STATUS_OK ?
-                       trigger_name : "(unnamed)";
+                       trigger_name : "(anonymous)";
        status = lttng_trigger_get_owner_uid(trigger,
                        &trigger_owner);
        assert(status == LTTNG_TRIGGER_STATUS_OK);
@@ -80,7 +80,7 @@ enum lttng_trigger_status lttng_trigger_add_action_error_query_results(
 
        status = lttng_trigger_get_name(trigger, &trigger_name);
        trigger_name = status == LTTNG_TRIGGER_STATUS_OK ?
-                       trigger_name : "(unnamed)";
+                       trigger_name : "(anonymous)";
        status = lttng_trigger_get_owner_uid(trigger,
                        &trigger_owner);
        assert(status == LTTNG_TRIGGER_STATUS_OK);
index b497d4f4d82bcafeeb25d68395ecbb5b8778fc82..bb90e7b6e196f44d822b52d808b792d64c2b9006 100644 (file)
@@ -556,6 +556,9 @@ void print_action_errors(const struct lttng_trigger *trigger,
        assert(query);
 
        trigger_status = lttng_trigger_get_name(trigger, &trigger_name);
+       /*
+        * Anonymous triggers are not listed; this would be an internal error.
+        */
        assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
 
        trigger_status = lttng_trigger_get_owner_uid(trigger, &trigger_uid);
@@ -812,7 +815,9 @@ void print_trigger_errors(const struct lttng_trigger *trigger)
                        lttng_error_query_trigger_create(trigger);
 
        assert(query);
-
+       /*
+        * Anonymous triggers are not listed; this would be an internal error.
+        */
        trigger_status = lttng_trigger_get_name(trigger, &trigger_name);
        assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
 
@@ -893,7 +898,15 @@ void print_one_trigger(const struct lttng_trigger *trigger)
        const char *name;
        uid_t trigger_uid;
 
+       /*
+        * Anonymous triggers are not listed since they can't be specified nor
+        * referenced through the CLI.
+        */
        trigger_status = lttng_trigger_get_name(trigger, &name);
+       if (trigger_status == LTTNG_TRIGGER_STATUS_UNSET) {
+               goto end;
+       }
+
        assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
 
        trigger_status = lttng_trigger_get_owner_uid(trigger, &trigger_uid);
@@ -949,6 +962,8 @@ void print_one_trigger(const struct lttng_trigger *trigger)
        }
 
        print_trigger_errors(trigger);
+end:
+       return;
 }
 
 static
@@ -959,6 +974,7 @@ int compare_triggers_by_name(const void *a, const void *b)
        const char *name_a, *name_b;
        enum lttng_trigger_status trigger_status;
 
+       /* Anonymous triggers are not reachable here. */
        trigger_status = lttng_trigger_get_name(trigger_a, &name_a);
        assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
 
@@ -1032,9 +1048,24 @@ int cmd_list_triggers(int argc, const char **argv)
        }
 
        for (i = 0; i < num_triggers; i++) {
-               const int add_ret = lttng_dynamic_pointer_array_add_pointer(
-                               &sorted_triggers,
-                               (void *) lttng_triggers_get_at_index(triggers, i));
+               int add_ret;
+               const char *unused_name;
+               const struct lttng_trigger *trigger =
+                               lttng_triggers_get_at_index(triggers, i);
+
+               trigger_status = lttng_trigger_get_name(trigger, &unused_name);
+               switch (trigger_status) {
+               case LTTNG_TRIGGER_STATUS_OK:
+                       break;
+               case LTTNG_TRIGGER_STATUS_UNSET:
+                       /* Don't list anonymous triggers. */
+                       continue;
+               default:
+                       abort();
+               }
+
+               add_ret = lttng_dynamic_pointer_array_add_pointer(
+                               &sorted_triggers, (void *) trigger);
 
                if (add_ret) {
                        ERR("Failed to allocate array of struct lttng_trigger *.");
index 401b597420dcb82407a3203433a9cc8ebc49eb57..f923cdd4bf62994220acd259076d9b0e798e028b 100644 (file)
@@ -151,7 +151,15 @@ int cmd_remove_trigger(int argc, const char **argv)
 
                trigger = lttng_triggers_get_at_index(triggers, i);
                trigger_status = lttng_trigger_get_name(trigger, &trigger_name);
-               assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
+               switch (trigger_status) {
+               case LTTNG_TRIGGER_STATUS_OK:
+                       break;
+               case LTTNG_TRIGGER_STATUS_UNSET:
+                       /* Don't compare against anonymous triggers. */
+                       continue;
+               default:
+                       abort();
+               }
 
                trigger_status = lttng_trigger_get_owner_uid(
                                trigger, &trigger_uid);
index d24d2f58001dee8b011b094ef849b5a6fa714a6e..7b3e0f509ac945b0af26bc7bbe31b7b304ef2b41 100644 (file)
@@ -486,6 +486,7 @@ struct lttcomm_session_msg {
                } LTTNG_PACKED process_attr_tracker_set_tracking_policy;
                struct {
                        uint32_t length;
+                       uint8_t is_trigger_anonymous;
                } LTTNG_PACKED trigger;
                struct {
                        uint32_t length;
index a86295069a85c12d1b17ee8bbaa3ade4643fa29c..5c48609ea5f12659c11b2eb50e01d28f5225b34f 100644 (file)
@@ -346,7 +346,12 @@ LTTNG_HIDDEN
 bool lttng_trigger_is_equal(
                const struct lttng_trigger *a, const struct lttng_trigger *b)
 {
-       if (strcmp(a->name, b->name) != 0) {
+       if (!!a->name != !!b->name) {
+               /* Both must be either anonymous or named. */
+               return false;
+       }
+
+       if (a->name && strcmp(a->name, b->name) != 0) {
                return false;
        }
 
index ce6f5633275bd05f78df5a05d680919d18ee6276..c097c102698d88871a3c089a8d5558324a9be2b3 100644 (file)
@@ -590,7 +590,13 @@ static const char *get_notification_trigger_name(
        }
 
        trigger_status = lttng_trigger_get_name(trigger, &trigger_name);
-       if (trigger_status != LTTNG_TRIGGER_STATUS_OK) {
+       switch (trigger_status) {
+       case LTTNG_TRIGGER_STATUS_OK:
+               break;
+       case LTTNG_TRIGGER_STATUS_UNSET:
+               trigger_name = "(anonymous)";
+               break;
+       default:
                fail("Failed to get name from notification's trigger");
                goto end;
        }
index ac572bfc6d870233570adafeb267de0978f43c97..98c00d6f7a77303f269c00cf9bed98601021b1c6 100644 (file)
@@ -62,6 +62,7 @@ static bool action_list_contains_notify(
        return false;
 }
 
+/* Only expects named triggers. */
 static bool is_trigger_name(const char *expected_trigger_name,
                struct lttng_notification *notification)
 {
This page took 0.036452 seconds and 4 git commands to generate.