X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fnotification-thread-events.c;h=c9c21bc7225df72ee21ad8a74d33f101dd878aca;hb=75e540c60661f7e384e35289fd13a72bc4e015e7;hp=45e356796d5b4693f86daa6313afa4e30c57a565;hpb=8dbb86b8a981917165030d3a7fbbc2cb932888ed;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/notification-thread-events.c b/src/bin/lttng-sessiond/notification-thread-events.c index 45e356796..c9c21bc72 100644 --- a/src/bin/lttng-sessiond/notification-thread-events.c +++ b/src/bin/lttng-sessiond/notification-thread-events.c @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include #include @@ -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(); @@ -2294,7 +2305,7 @@ static int handle_notification_thread_command_get_trigger( /* Not a fatal error if the trigger is not found. */ get_trigger_info_for_log(trigger, &trigger_name, &trigger_owner_uid); - ERR("Failed to retrieve registered version of trigger: trigger name = '%s', trigger owner uid = %d", + DBG("Failed to retrieve registered version of trigger: trigger name = '%s', trigger owner uid = %d", trigger_name, (int) trigger_owner_uid); ret = 0; @@ -2480,12 +2491,12 @@ bool is_trigger_action_notify(const struct lttng_trigger *trigger) goto end; } - action_status = lttng_action_group_get_count(action, &count); + action_status = lttng_action_list_get_count(action, &count); assert(action_status == LTTNG_ACTION_STATUS_OK); for (i = 0; i < count; i++) { const struct lttng_action *inner_action = - lttng_action_group_get_at_index( + lttng_action_list_get_at_index( action, i); action_type = lttng_action_get_type(inner_action); @@ -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); @@ -2712,9 +2729,8 @@ int handle_notification_thread_command_register_trigger( trigger, &trigger_ht_element->node_by_name_uid); if (node != &trigger_ht_element->node_by_name_uid) { - /* Not a fatal error, simply report it to the client. */ - cds_lfht_del(state->triggers_ht, &trigger_ht_element->node); - *cmd_result = LTTNG_ERR_TRIGGER_EXISTS; + /* Internal error: add to triggers_ht should have failed. */ + ret = -1; goto error_free_ht_element; } @@ -3091,6 +3107,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 +4554,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 +4581,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) {