X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Faction-executor.c;h=6c828c8f05221536e6a887337591a34e30dfe7ae;hb=2d57482cbac710612a36b7beae7b59c277006185;hp=40ca2bd12a6aa41dd72caf6ba4f2f7aca8c0dd68;hpb=d1ba29d290281cf72ca3ec7b0222b336c747e925;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/action-executor.c b/src/bin/lttng-sessiond/action-executor.c index 40ca2bd12..6c828c8f0 100644 --- a/src/bin/lttng-sessiond/action-executor.c +++ b/src/bin/lttng-sessiond/action-executor.c @@ -15,13 +15,16 @@ #include #include #include +#include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -54,31 +57,39 @@ struct action_executor { uint64_t next_work_item_id; }; +/* + * Only return non-zero on a fatal error that should shut down the action + * executor. + */ typedef int (*action_executor_handler)(struct action_executor *executor, const struct action_work_item *, - const struct lttng_action *action); + struct lttng_action *action); static int action_executor_notify_handler(struct action_executor *executor, const struct action_work_item *, - const struct lttng_action *); -static int action_executor_start_session_handler(struct action_executor *executor, + struct lttng_action *); +static int action_executor_start_session_handler( + struct action_executor *executor, const struct action_work_item *, - const struct lttng_action *); -static int action_executor_stop_session_handler(struct action_executor *executor, + struct lttng_action *); +static int action_executor_stop_session_handler( + struct action_executor *executor, const struct action_work_item *, - const struct lttng_action *); -static int action_executor_rotate_session_handler(struct action_executor *executor, + struct lttng_action *); +static int action_executor_rotate_session_handler( + struct action_executor *executor, const struct action_work_item *, - const struct lttng_action *); -static int action_executor_snapshot_session_handler(struct action_executor *executor, + struct lttng_action *); +static int action_executor_snapshot_session_handler( + struct action_executor *executor, const struct action_work_item *, - const struct lttng_action *); + struct lttng_action *); static int action_executor_group_handler(struct action_executor *executor, const struct action_work_item *, - const struct lttng_action *); + struct lttng_action *); static int action_executor_generic_handler(struct action_executor *executor, const struct action_work_item *, - const struct lttng_action *); + struct lttng_action *); static const action_executor_handler action_executors[] = { [LTTNG_ACTION_TYPE_NOTIFY] = action_executor_notify_handler, @@ -89,18 +100,50 @@ static const action_executor_handler action_executors[] = { [LTTNG_ACTION_TYPE_GROUP] = action_executor_group_handler, }; -static const char *action_type_names[] = { - [LTTNG_ACTION_TYPE_NOTIFY] = "Notify", - [LTTNG_ACTION_TYPE_START_SESSION] = "Start session", - [LTTNG_ACTION_TYPE_STOP_SESSION] = "Stop session", - [LTTNG_ACTION_TYPE_ROTATE_SESSION] = "Rotate session", - [LTTNG_ACTION_TYPE_SNAPSHOT_SESSION] = "Snapshot session", - [LTTNG_ACTION_TYPE_GROUP] = "Group", -}; - static const char *get_action_name(const struct lttng_action *action) { - return action_type_names[lttng_action_get_type_const(action)]; + const enum lttng_action_type action_type = lttng_action_get_type(action); + + assert(action_type != LTTNG_ACTION_TYPE_UNKNOWN); + + return lttng_action_type_string(action_type); +} + +/* Check if this trigger allowed to interect with a given session. */ +static bool is_trigger_allowed_for_session(const struct lttng_trigger *trigger, + struct ltt_session *session) +{ + bool is_allowed = false; + const struct lttng_credentials session_creds = { + .uid = LTTNG_OPTIONAL_INIT_VALUE(session->uid), + .gid = LTTNG_OPTIONAL_INIT_VALUE(session->gid), + }; + /* Can never be NULL. */ + const struct lttng_credentials *trigger_creds = + lttng_trigger_get_credentials(trigger); + + is_allowed = (lttng_credentials_is_equal_uid(trigger_creds, &session_creds)) || + (lttng_credentials_get_uid(trigger_creds) == 0); + if (!is_allowed) { + WARN("Trigger is not allowed to interact with session `%s`: session uid = %ld, session gid = %ld, trigger uid = %ld", + session->name, + (long int) session->uid, + (long int) session->gid, + (long int) lttng_credentials_get_uid(trigger_creds)); + } + + return is_allowed; +} + +static const char *get_trigger_name(const struct lttng_trigger *trigger) +{ + const char *trigger_name; + enum lttng_trigger_status trigger_status; + + trigger_status = lttng_trigger_get_name(trigger, &trigger_name); + assert(trigger_status == LTTNG_TRIGGER_STATUS_OK); + + return trigger_name; } static int client_handle_transmission_status( @@ -112,8 +155,6 @@ static int client_handle_transmission_status( struct action_executor *executor = user_data; bool update_communication = true; - ASSERT_LOCKED(client->lock); - switch (status) { case CLIENT_TRANSMISSION_STATUS_COMPLETE: DBG("Successfully sent full notification to client, client_id = %" PRIu64, @@ -127,12 +168,10 @@ static int client_handle_transmission_status( case CLIENT_TRANSMISSION_STATUS_FAIL: DBG("Communication error occurred while sending notification to client, client_id = %" PRIu64, client->id); - client->communication.active = false; break; default: ERR("Fatal error encoutered while sending notification to client, client_id = %" PRIu64, client->id); - client->communication.active = false; ret = -1; goto end; } @@ -141,6 +180,7 @@ static int client_handle_transmission_status( goto end; } + /* Safe to read client's id without locking as it is immutable. */ ret = notification_thread_client_communication_update( executor->notification_thread_handle, client->id, status); @@ -150,30 +190,32 @@ end: static int action_executor_notify_handler(struct action_executor *executor, const struct action_work_item *work_item, - const struct lttng_action *action) + struct lttng_action *action) { return notification_client_list_send_evaluation(work_item->client_list, - lttng_trigger_get_const_condition(work_item->trigger), + work_item->trigger, work_item->evaluation, - lttng_trigger_get_credentials(work_item->trigger), - LTTNG_OPTIONAL_GET_PTR(work_item->object_creds), - client_handle_transmission_status, - executor); + work_item->object_creds.is_set ? + &(work_item->object_creds.value) : + NULL, + client_handle_transmission_status, executor); } -static int action_executor_start_session_handler(struct action_executor *executor, +static int action_executor_start_session_handler( + struct action_executor *executor, const struct action_work_item *work_item, - const struct lttng_action *action) + struct lttng_action *action) { int ret = 0; const char *session_name; enum lttng_action_status action_status; struct ltt_session *session; + enum lttng_error_code cmd_ret; action_status = lttng_action_start_session_get_session_name( action, &session_name); if (action_status != LTTNG_ACTION_STATUS_OK) { - ERR("Failed to get session name from \"%s\" action", + ERR("Failed to get session name from `%s` action", get_action_name(action)); ret = -1; goto end; @@ -181,55 +223,60 @@ static int action_executor_start_session_handler(struct action_executor *executo session_lock_list(); session = session_find_by_name(session_name); - if (session) { - enum lttng_error_code cmd_ret; - - session_lock(session); - cmd_ret = cmd_start_trace(session); - session_unlock(session); - - switch (cmd_ret) { - case LTTNG_OK: - DBG("Successfully started session \"%s\" on behalf of trigger \"%p\"", - session_name, - work_item->trigger); - break; - case LTTNG_ERR_TRACE_ALREADY_STARTED: - DBG("Attempted to start session \"%s\" on behalf of trigger \"%p\" but it was already started", - session_name, - work_item->trigger); - break; - default: - WARN("Failed to start session \"%s\" on behalf of trigger \"%p\": %s", - session_name, - work_item->trigger, - lttng_strerror(-cmd_ret)); - break; - } - session_put(session); - } else { - DBG("Failed to find session \"%s\" by name while executing \"%s\" action of trigger \"%p\"", + if (!session) { + DBG("Failed to find session `%s` by name while executing `%s` action of trigger `%s`", session_name, get_action_name(action), - work_item->trigger); + get_trigger_name(work_item->trigger)); + goto error_unlock_list; + } + + session_lock(session); + if (!is_trigger_allowed_for_session(work_item->trigger, session)) { + goto error_dispose_session; + } + + cmd_ret = cmd_start_trace(session); + switch (cmd_ret) { + case LTTNG_OK: + DBG("Successfully started session `%s` on behalf of trigger `%s`", + session_name, get_trigger_name(work_item->trigger)); + break; + case LTTNG_ERR_TRACE_ALREADY_STARTED: + DBG("Attempted to start session `%s` on behalf of trigger `%s` but it was already started", + session_name, get_trigger_name(work_item->trigger)); + break; + default: + WARN("Failed to start session `%s` on behalf of trigger `%s`: %s", + session_name, get_trigger_name(work_item->trigger), + lttng_strerror(-cmd_ret)); + lttng_action_increase_execution_failure_count(action); + break; } + +error_dispose_session: + session_unlock(session); + session_put(session); +error_unlock_list: session_unlock_list(); end: return ret; } -static int action_executor_stop_session_handler(struct action_executor *executor, +static int action_executor_stop_session_handler( + struct action_executor *executor, const struct action_work_item *work_item, - const struct lttng_action *action) + struct lttng_action *action) { int ret = 0; const char *session_name; enum lttng_action_status action_status; struct ltt_session *session; + enum lttng_error_code cmd_ret; action_status = lttng_action_stop_session_get_session_name( action, &session_name); if (action_status != LTTNG_ACTION_STATUS_OK) { - ERR("Failed to get session name from \"%s\" action", + ERR("Failed to get session name from `%s` action", get_action_name(action)); ret = -1; goto end; @@ -237,55 +284,61 @@ static int action_executor_stop_session_handler(struct action_executor *executor session_lock_list(); session = session_find_by_name(session_name); - if (session) { - enum lttng_error_code cmd_ret; - - session_lock(session); - cmd_ret = cmd_stop_trace(session); - session_unlock(session); - - switch (cmd_ret) { - case LTTNG_OK: - DBG("Successfully stopped session \"%s\" on behalf of trigger \"%p\"", - session_name, - work_item->trigger); - break; - case LTTNG_ERR_TRACE_ALREADY_STOPPED: - DBG("Attempted to stop session \"%s\" on behalf of trigger \"%p\" but it was already stopped", - session_name, - work_item->trigger); - break; - default: - WARN("Failed to stop session \"%s\" on behalf of trigger \"%p\": %s", - session_name, - work_item->trigger, - lttng_strerror(-cmd_ret)); - break; - } - session_put(session); - } else { - DBG("Failed to find session \"%s\" by name while executing \"%s\" action of trigger \"%p\"", + if (!session) { + DBG("Failed to find session `%s` by name while executing `%s` action of trigger `%s`", session_name, get_action_name(action), - work_item->trigger); + get_trigger_name(work_item->trigger)); + lttng_action_increase_execution_failure_count(action); + goto error_unlock_list; + } + + session_lock(session); + if (!is_trigger_allowed_for_session(work_item->trigger, session)) { + goto error_dispose_session; } + + cmd_ret = cmd_stop_trace(session); + switch (cmd_ret) { + case LTTNG_OK: + DBG("Successfully stopped session `%s` on behalf of trigger `%s`", + session_name, get_trigger_name(work_item->trigger)); + break; + case LTTNG_ERR_TRACE_ALREADY_STOPPED: + DBG("Attempted to stop session `%s` on behalf of trigger `%s` but it was already stopped", + session_name, get_trigger_name(work_item->trigger)); + break; + default: + WARN("Failed to stop session `%s` on behalf of trigger `%s`: %s", + session_name, get_trigger_name(work_item->trigger), + lttng_strerror(-cmd_ret)); + lttng_action_increase_execution_failure_count(action); + break; + } + +error_dispose_session: + session_unlock(session); + session_put(session); +error_unlock_list: session_unlock_list(); end: return ret; } -static int action_executor_rotate_session_handler(struct action_executor *executor, +static int action_executor_rotate_session_handler( + struct action_executor *executor, const struct action_work_item *work_item, - const struct lttng_action *action) + struct lttng_action *action) { int ret = 0; const char *session_name; enum lttng_action_status action_status; struct ltt_session *session; + enum lttng_error_code cmd_ret; action_status = lttng_action_rotate_session_get_session_name( action, &session_name); if (action_status != LTTNG_ACTION_STATUS_OK) { - ERR("Failed to get session name from \"%s\" action", + ERR("Failed to get session name from `%s` action", get_action_name(action)); ret = -1; goto end; @@ -293,52 +346,57 @@ static int action_executor_rotate_session_handler(struct action_executor *execut session_lock_list(); session = session_find_by_name(session_name); - if (session) { - enum lttng_error_code cmd_ret; - - session_lock(session); - cmd_ret = cmd_rotate_session(session, NULL, false, - LTTNG_TRACE_CHUNK_COMMAND_TYPE_MOVE_TO_COMPLETED); - session_unlock(session); - - switch (cmd_ret) { - case LTTNG_OK: - DBG("Successfully started rotation of session \"%s\" on behalf of trigger \"%p\"", - session_name, - work_item->trigger); - break; - case LTTNG_ERR_ROTATION_PENDING: - DBG("Attempted to start a rotation of session \"%s\" on behalf of trigger \"%p\" but a rotation is already ongoing", - session_name, - work_item->trigger); - break; - case LTTNG_ERR_ROTATION_MULTIPLE_AFTER_STOP: - case LTTNG_ERR_ROTATION_AFTER_STOP_CLEAR: - DBG("Attempted to start a rotation of session \"%s\" on behalf of trigger \"%p\" but a rotation has already been completed since the last stop or clear", - session_name, - work_item->trigger); - break; - default: - WARN("Failed to start a rotation of session \"%s\" on behalf of trigger \"%p\": %s", - session_name, - work_item->trigger, - lttng_strerror(-cmd_ret)); - break; - } - session_put(session); - } else { - DBG("Failed to find session \"%s\" by name while executing \"%s\" action of trigger \"%p\"", + if (!session) { + DBG("Failed to find session `%s` by name while executing `%s` action of trigger `%s`", session_name, get_action_name(action), - work_item->trigger); + get_trigger_name(work_item->trigger)); + lttng_action_increase_execution_failure_count(action); + goto error_unlock_list; + } + + session_lock(session); + if (!is_trigger_allowed_for_session(work_item->trigger, session)) { + goto error_dispose_session; + } + + cmd_ret = cmd_rotate_session(session, NULL, false, + LTTNG_TRACE_CHUNK_COMMAND_TYPE_MOVE_TO_COMPLETED); + switch (cmd_ret) { + case LTTNG_OK: + DBG("Successfully started rotation of session `%s` on behalf of trigger `%s`", + session_name, get_trigger_name(work_item->trigger)); + break; + case LTTNG_ERR_ROTATION_PENDING: + DBG("Attempted to start a rotation of session `%s` on behalf of trigger `%s` but a rotation is already ongoing", + session_name, get_trigger_name(work_item->trigger)); + lttng_action_increase_execution_failure_count(action); + break; + case LTTNG_ERR_ROTATION_MULTIPLE_AFTER_STOP: + case LTTNG_ERR_ROTATION_AFTER_STOP_CLEAR: + DBG("Attempted to start a rotation of session `%s` on behalf of trigger `%s` but a rotation has already been completed since the last stop or clear", + session_name, get_trigger_name(work_item->trigger)); + break; + default: + WARN("Failed to start a rotation of session `%s` on behalf of trigger `%s`: %s", + session_name, get_trigger_name(work_item->trigger), + lttng_strerror(-cmd_ret)); + lttng_action_increase_execution_failure_count(action); + break; } + +error_dispose_session: + session_unlock(session); + session_put(session); +error_unlock_list: session_unlock_list(); end: return ret; } -static int action_executor_snapshot_session_handler(struct action_executor *executor, +static int action_executor_snapshot_session_handler( + struct action_executor *executor, const struct action_work_item *work_item, - const struct lttng_action *action) + struct lttng_action *action) { int ret = 0; const char *session_name; @@ -349,11 +407,12 @@ static int action_executor_snapshot_session_handler(struct action_executor *exec }; const struct lttng_snapshot_output *snapshot_output = &default_snapshot_output; + enum lttng_error_code cmd_ret; action_status = lttng_action_snapshot_session_get_session_name( action, &session_name); if (action_status != LTTNG_ACTION_STATUS_OK) { - ERR("Failed to get session name from \"%s\" action", + ERR("Failed to get session name from `%s` action", get_action_name(action)); ret = -1; goto end; @@ -363,7 +422,7 @@ static int action_executor_snapshot_session_handler(struct action_executor *exec action, &snapshot_output); if (action_status != LTTNG_ACTION_STATUS_OK && action_status != LTTNG_ACTION_STATUS_UNSET) { - ERR("Failed to get output from \"%s\" action", + ERR("Failed to get output from `%s` action", get_action_name(action)); ret = -1; goto end; @@ -371,32 +430,38 @@ static int action_executor_snapshot_session_handler(struct action_executor *exec session_lock_list(); session = session_find_by_name(session_name); - if (session) { - enum lttng_error_code cmd_ret; - - session_lock(session); - cmd_ret = cmd_snapshot_record(session, snapshot_output, 0); - session_unlock(session); - - switch (cmd_ret) { - case LTTNG_OK: - DBG("Successfully recorded snapshot of session \"%s\" on behalf of trigger \"%p\"", - session_name, - work_item->trigger); - break; - default: - WARN("Failed to record snapshot of session \"%s\" on behalf of trigger \"%p\": %s", - session_name, - work_item->trigger, - lttng_strerror(-cmd_ret)); - break; - } - session_put(session); - } else { - DBG("Failed to find session \"%s\" by name while executing \"%s\" action of trigger \"%p\"", + if (!session) { + DBG("Failed to find session `%s` by name while executing `%s` action of trigger `%s`", session_name, get_action_name(action), - work_item->trigger); + get_trigger_name(work_item->trigger)); + lttng_action_increase_execution_failure_count(action); + goto error_unlock_list; + } + + + session_lock(session); + if (!is_trigger_allowed_for_session(work_item->trigger, session)) { + goto error_dispose_session; + } + + cmd_ret = cmd_snapshot_record(session, snapshot_output, 0); + switch (cmd_ret) { + case LTTNG_OK: + DBG("Successfully recorded snapshot of session `%s` on behalf of trigger `%s`", + session_name, get_trigger_name(work_item->trigger)); + break; + default: + WARN("Failed to record snapshot of session `%s` on behalf of trigger `%s`: %s", + session_name, get_trigger_name(work_item->trigger), + lttng_strerror(-cmd_ret)); + lttng_action_increase_execution_failure_count(action); + break; } + +error_dispose_session: + session_unlock(session); + session_put(session); +error_unlock_list: session_unlock_list(); end: return ret; @@ -404,7 +469,7 @@ end: static int action_executor_group_handler(struct action_executor *executor, const struct action_work_item *work_item, - const struct lttng_action *action_group) + struct lttng_action *action_group) { int ret = 0; unsigned int i, count; @@ -420,15 +485,15 @@ static int action_executor_group_handler(struct action_executor *executor, DBG("Action group has %u action%s", count, count != 1 ? "s" : ""); for (i = 0; i < count; i++) { - const struct lttng_action *action = - lttng_action_group_get_at_index( + struct lttng_action *action = + lttng_action_group_borrow_mutable_at_index( action_group, i); ret = action_executor_generic_handler( executor, work_item, action); if (ret) { - ERR("Stopping the execution of the action group of trigger \"%p\" following a fatal error", - work_item->trigger); + ERR("Stopping the execution of the action group of trigger `%s` following a fatal error", + get_trigger_name(work_item->trigger)); goto end; } } @@ -438,29 +503,45 @@ end: static int action_executor_generic_handler(struct action_executor *executor, const struct action_work_item *work_item, - const struct lttng_action *action) + struct lttng_action *action) { - DBG("Executing action \"%s\" of trigger \"%p\" action work item %" PRIu64, + int ret; + const enum lttng_action_type action_type = lttng_action_get_type(action); + + assert(action_type != LTTNG_ACTION_TYPE_UNKNOWN); + + lttng_action_increase_execution_request_count(action); + if (!lttng_action_should_execute(action)) { + DBG("Policy prevented execution of action `%s` of trigger `%s` action work item %" PRIu64, + get_action_name(action), + get_trigger_name(work_item->trigger), + work_item->id); + ret = 0; + goto end; + } + + lttng_action_increase_execution_count(action); + DBG("Executing action `%s` of trigger `%s` action work item %" PRIu64, get_action_name(action), - work_item->trigger, + get_trigger_name(work_item->trigger), work_item->id); - - return action_executors[lttng_action_get_type_const(action)]( - executor, work_item, action); + ret = action_executors[action_type](executor, work_item, action); +end: + return ret; } static int action_work_item_execute(struct action_executor *executor, struct action_work_item *work_item) { int ret; - const struct lttng_action *action = - lttng_trigger_get_const_action(work_item->trigger); + struct lttng_action *action = + lttng_trigger_get_action(work_item->trigger); - DBG("Starting execution of action work item %" PRIu64 " of trigger \"%p\"", - work_item->id, work_item->trigger); + DBG("Starting execution of action work item %" PRIu64 " of trigger `%s`", + work_item->id, get_trigger_name(work_item->trigger)); ret = action_executor_generic_handler(executor, work_item, action); - DBG("Completed execution of action work item %" PRIu64 " of trigger \"%p\"", - work_item->id, work_item->trigger); + DBG("Completed execution of action work item %" PRIu64 " of trigger `%s`", + work_item->id, get_trigger_name(work_item->trigger)); return ret; } @@ -478,7 +559,8 @@ static void *action_executor_thread(void *_data) assert(executor); - health_register(health_sessiond, HEALTH_SESSIOND_TYPE_ACTION_EXECUTOR); + health_register(the_health_sessiond, + HEALTH_SESSIOND_TYPE_ACTION_EXECUTOR); rcu_register_thread(); rcu_thread_online(); @@ -500,7 +582,7 @@ static void *action_executor_thread(void *_data) continue; } - /* Pop item from front of the listwith work lock held. */ + /* Pop item from front of the list with work lock held. */ work_item = cds_list_first_entry(&executor->work.list, struct action_work_item, list_node); cds_list_del(&work_item->list_node); @@ -522,14 +604,16 @@ static void *action_executor_thread(void *_data) pthread_mutex_lock(&executor->work.lock); } - pthread_mutex_unlock(&executor->work.lock); + if (executor->should_quit) { + pthread_mutex_unlock(&executor->work.lock); + } DBG("Left work execution loop"); health_code_update(); rcu_thread_offline(); rcu_unregister_thread(); - health_unregister(health_sessiond); + health_unregister(the_health_sessiond); return NULL; } @@ -538,8 +622,10 @@ static bool shutdown_action_executor_thread(void *_data) { struct action_executor *executor = _data; + pthread_mutex_lock(&executor->work.lock); executor->should_quit = true; pthread_cond_signal(&executor->work.cond); + pthread_mutex_unlock(&executor->work.lock); return true; } @@ -593,8 +679,8 @@ void action_executor_destroy(struct action_executor *executor) cds_list_for_each_entry_safe ( work_item, tmp, &executor->work.list, list_node) { WARN("Discarding action work item %" PRIu64 - " associated to trigger \"%p\"", - work_item->id, work_item->trigger); + " associated to trigger `%s`", + work_item->id, get_trigger_name(work_item->trigger)); cds_list_del(&work_item->list_node); action_work_item_destroy(work_item); } @@ -619,17 +705,16 @@ enum action_executor_status action_executor_enqueue( /* Check for queue overflow. */ if (executor->work.pending_count >= MAX_QUEUED_WORK_COUNT) { /* Most likely spammy, remove if it is the case. */ - DBG("Refusing to enqueue action for trigger \"%p\" as work item %" PRIu64 - " (overflow)", - trigger, work_item_id); + DBG("Refusing to enqueue action for trigger `%s` as work item %" PRIu64 + " (overflow)", get_trigger_name(trigger), work_item_id); executor_status = ACTION_EXECUTOR_STATUS_OVERFLOW; goto error_unlock; } work_item = zmalloc(sizeof(*work_item)); if (!work_item) { - PERROR("Failed to allocate action executor work item on behalf of trigger \"%p\"", - trigger); + PERROR("Failed to allocate action executor work item on behalf of trigger `%s`", + get_trigger_name(trigger)); executor_status = ACTION_EXECUTOR_STATUS_ERROR; goto error_unlock; } @@ -659,15 +744,15 @@ enum action_executor_status action_executor_enqueue( evaluation = NULL; cds_list_add_tail(&work_item->list_node, &executor->work.list); executor->work.pending_count++; - DBG("Enqueued action for trigger \"%p\" as work item %" PRIu64, - trigger, work_item_id); + DBG("Enqueued action for trigger `%s` as work item #%" PRIu64, + get_trigger_name(trigger), work_item_id); signal = true; error_unlock: - pthread_mutex_unlock(&executor->work.lock); if (signal) { pthread_cond_signal(&executor->work.cond); } + pthread_mutex_unlock(&executor->work.lock); lttng_evaluation_destroy(evaluation); return executor_status;