X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fnotification-thread-events.c;h=414e5dd8aec0afd90a685eb1a23a53f315b2e554;hb=5a6306f7bf0d3cca6ec732230d114a9df309cde2;hp=23614b0db65d0a776161bf821e0880677e092333;hpb=b006f85d9d07af970f24cfa5ab077bfe599d75c9;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 23614b0db..414e5dd8a 100644 --- a/src/bin/lttng-sessiond/notification-thread-events.c +++ b/src/bin/lttng-sessiond/notification-thread-events.c @@ -21,14 +21,14 @@ #include #include #include -#include +#include #include #include #include #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; } @@ -471,7 +482,7 @@ enum lttng_object_type get_condition_binding_object( case LTTNG_CONDITION_TYPE_SESSION_ROTATION_ONGOING: case LTTNG_CONDITION_TYPE_SESSION_ROTATION_COMPLETED: return LTTNG_OBJECT_TYPE_SESSION; - case LTTNG_CONDITION_TYPE_ON_EVENT: + case LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES: return LTTNG_OBJECT_TYPE_NONE; default: return LTTNG_OBJECT_TYPE_UNKNOWN; @@ -1123,9 +1134,11 @@ int notification_thread_client_subscribe(struct notification_client *client, */ CDS_INIT_LIST_HEAD(&condition_list_element->node); condition_list_element->condition = condition; + condition = NULL; cds_list_add(&condition_list_element->node, &client->condition_list); - client_list = get_client_list_from_condition(state, condition); + client_list = get_client_list_from_condition( + state, condition_list_element->condition); if (!client_list) { /* * No notification-emiting trigger registered with this @@ -1149,7 +1162,7 @@ int notification_thread_client_subscribe(struct notification_client *client, pthread_mutex_lock(&client_list->lock); cds_list_for_each_entry(trigger_ht_element, &client_list->triggers_list, client_list_trigger_node) { - if (evaluate_condition_for_client(trigger_ht_element->trigger, condition, + if (evaluate_condition_for_client(trigger_ht_element->trigger, condition_list_element->condition, client, state)) { WARN("[notification-thread] Evaluation of a condition on client subscription failed, aborting."); ret = -1; @@ -1178,10 +1191,12 @@ end: if (client_list) { notification_client_list_put(client_list); } + lttng_condition_destroy(condition); return ret; error: free(condition_list_element); free(client_list_element); + lttng_condition_destroy(condition); return ret; } @@ -2253,7 +2268,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 +2309,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; @@ -2336,12 +2351,12 @@ bool condition_is_supported(struct lttng_condition *condition) is_supported = kernel_supports_ring_buffer_snapshot_sample_positions() == 1; break; } - case LTTNG_CONDITION_TYPE_ON_EVENT: + case LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES: { const struct lttng_event_rule *event_rule; enum lttng_domain_type domain; const enum lttng_condition_status status = - lttng_condition_on_event_get_rule( + lttng_condition_event_rule_matches_get_rule( condition, &event_rule); assert(status == LTTNG_CONDITION_STATUS_OK); @@ -2476,16 +2491,16 @@ bool is_trigger_action_notify(const struct lttng_trigger *trigger) if (action_type == LTTNG_ACTION_TYPE_NOTIFY) { is_notify = true; goto end; - } else if (action_type != LTTNG_ACTION_TYPE_GROUP) { + } else if (action_type != LTTNG_ACTION_TYPE_LIST) { 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); @@ -2592,7 +2607,7 @@ enum lttng_error_code setup_tracer_notifier( trigger, &error_counter_index); if (error_accounting_status != EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK) { if (error_accounting_status == EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_NO_INDEX_AVAILABLE) { - DBG("Trigger group error accounting counter full."); + DBG("Trigger list error accounting counter full."); ret = LTTNG_ERR_EVENT_NOTIFIER_ERROR_ACCOUNTING_FULL; } else { ERR("Error registering trigger for error accounting"); @@ -2602,7 +2617,7 @@ enum lttng_error_code setup_tracer_notifier( goto error_remove_ht_element; } - lttng_condition_on_event_set_error_counter_index( + lttng_condition_event_rule_matches_set_error_counter_index( condition, error_counter_index); ret = LTTNG_OK; @@ -2635,6 +2650,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 +2673,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 +2733,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 +3111,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: @@ -3845,6 +3866,7 @@ int client_handle_message_subscription( goto end; } + /* Ownership of condition is always transferred. */ if (msg_type == LTTNG_NOTIFICATION_CHANNEL_MESSAGE_TYPE_SUBSCRIBE) { ret = notification_thread_client_subscribe( client, condition, state, &status); @@ -4537,11 +4559,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,10 +4586,7 @@ 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_on_event_get_capture_descriptor_count( + if (lttng_condition_event_rule_matches_get_capture_descriptor_count( lttng_trigger_get_const_condition(element->trigger), &capture_count) != LTTNG_CONDITION_STATUS_OK) { ERR("Failed to get capture count"); @@ -4583,10 +4600,10 @@ int dispatch_one_event_notifier_notification(struct notification_thread_state *s goto end; } - evaluation = lttng_evaluation_on_event_create( + evaluation = lttng_evaluation_event_rule_matches_create( container_of(lttng_trigger_get_const_condition( element->trigger), - struct lttng_condition_on_event, + struct lttng_condition_event_rule_matches, parent), notification->capture_buffer, notification->capture_buf_size, false);