diff --git a/include/crm/common/actions_internal.h b/include/crm/common/actions_internal.h index ccecdff863..286829b44b 100644 --- a/include/crm/common/actions_internal.h +++ b/include/crm/common/actions_internal.h @@ -1,302 +1,300 @@ /* - * Copyright 2004-2024 the Pacemaker project contributors + * Copyright 2004-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * * This source code is licensed under the GNU Lesser General Public License * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. */ #ifndef PCMK__CRM_COMMON_ACTIONS_INTERNAL__H #define PCMK__CRM_COMMON_ACTIONS_INTERNAL__H #include // bool #include // uint32_t, UINT32_C() #include // guint, GList, GHashTable #include // xmlNode #include // PCMK_ACTION_MONITOR #include // enum rsc_role_e #include // pcmk_resource_t, pcmk_node_t #include // pcmk__str_eq() -#include // pcmk__str_any_of() - #ifdef __cplusplus extern "C" { #endif //! printf-style format to create operation key from resource, action, interval #define PCMK__OP_FMT "%s_%s_%u" /*! * \internal * \brief Set action flags for an action * * \param[in,out] action Action to set flags for * \param[in] flags_to_set Group of enum pcmk__action_flags to set */ #define pcmk__set_action_flags(action, flags_to_set) do { \ (action)->flags = pcmk__set_flags_as(__func__, __LINE__, \ LOG_TRACE, \ "Action", (action)->uuid, \ (action)->flags, \ (flags_to_set), \ #flags_to_set); \ } while (0) /*! * \internal * \brief Clear action flags for an action * * \param[in,out] action Action to clear flags for * \param[in] flags_to_clear Group of enum pcmk__action_flags to clear */ #define pcmk__clear_action_flags(action, flags_to_clear) do { \ (action)->flags = pcmk__clear_flags_as(__func__, __LINE__, \ LOG_TRACE, \ "Action", (action)->uuid, \ (action)->flags, \ (flags_to_clear), \ #flags_to_clear); \ } while (0) /*! * \internal * \brief Set action flags for a flag group * * \param[in,out] action_flags Flag group to set flags for * \param[in] action_name Name of action being modified (for logging) * \param[in] to_set Group of enum pcmk__action_flags to set */ #define pcmk__set_raw_action_flags(action_flags, action_name, to_set) do { \ action_flags = pcmk__set_flags_as(__func__, __LINE__, \ LOG_TRACE, "Action", action_name, \ (action_flags), \ (to_set), #to_set); \ } while (0) /*! * \internal * \brief Clear action flags for a flag group * * \param[in,out] action_flags Flag group to clear flags for * \param[in] action_name Name of action being modified (for logging) * \param[in] to_clear Group of enum pcmk__action_flags to clear */ #define pcmk__clear_raw_action_flags(action_flags, action_name, to_clear) \ do { \ action_flags = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \ "Action", action_name, \ (action_flags), \ (to_clear), #to_clear); \ } while (0) // Possible actions (including some pseudo-actions) enum pcmk__action_type { pcmk__action_unspecified = 0, // Unspecified or unknown action pcmk__action_monitor, // Monitor // Each "completed" action must be the regular action plus 1 pcmk__action_stop, // Stop pcmk__action_stopped, // Stop completed pcmk__action_start, // Start pcmk__action_started, // Start completed pcmk__action_notify, // Notify pcmk__action_notified, // Notify completed pcmk__action_promote, // Promote pcmk__action_promoted, // Promoted pcmk__action_demote, // Demote pcmk__action_demoted, // Demoted pcmk__action_shutdown, // Shut down node pcmk__action_fence, // Fence node }; // Action scheduling flags enum pcmk__action_flags { // No action flags set (compare with equality rather than bit set) pcmk__no_action_flags = 0, // Whether action does not require invoking an agent pcmk__action_pseudo = (UINT32_C(1) << 0), // Whether action is runnable pcmk__action_runnable = (UINT32_C(1) << 1), // Whether action should not be executed pcmk__action_optional = (UINT32_C(1) << 2), // Whether action should be added to transition graph even if optional pcmk__action_always_in_graph = (UINT32_C(1) << 3), // Whether operation-specific instance attributes have been unpacked yet pcmk__action_attrs_evaluated = (UINT32_C(1) << 4), // Whether action is allowed to be part of a live migration pcmk__action_migratable = (UINT32_C(1) << 7), // Whether action has been added to transition graph pcmk__action_added_to_graph = (UINT32_C(1) << 8), // Whether action is a stop to abort a dangling migration pcmk__action_migration_abort = (UINT32_C(1) << 11), // Whether action is recurring monitor that must be rescheduled if active pcmk__action_reschedule = (UINT32_C(1) << 13), // Whether action has already been processed by a recursive procedure pcmk__action_detect_loop = (UINT32_C(1) << 14), // Whether action's inputs have been de-duplicated yet pcmk__action_inputs_deduplicated = (UINT32_C(1) << 15), // Whether action can be executed on DC rather than own node pcmk__action_on_dc = (UINT32_C(1) << 16), }; /* Possible responses to a resource action failure * * The order is significant; the values are in order of increasing severity so * that they can be compared with less than and greater than. */ enum pcmk__on_fail { pcmk__on_fail_ignore, // Act as if failure didn't happen pcmk__on_fail_demote, // Demote if promotable, else stop pcmk__on_fail_restart, // Restart resource /* Fence the remote node created by the resource if fencing is enabled, * otherwise attempt to restart the resource (used internally for some * remote connection failures). */ pcmk__on_fail_reset_remote, pcmk__on_fail_restart_container, // Restart resource's container pcmk__on_fail_ban, // Ban resource from current node pcmk__on_fail_block, // Treat resource as unmanaged pcmk__on_fail_stop, // Stop resource and leave stopped pcmk__on_fail_standby_node, // Put resource's node in standby pcmk__on_fail_fence_node, // Fence resource's node }; // What resource needs before it can be recovered from a failed node enum pcmk__requires { pcmk__requires_nothing = 0, // Resource can be recovered immediately pcmk__requires_quorum = 1, // Resource can be recovered if quorate pcmk__requires_fencing = 2, // Resource can be recovered after fencing }; // Implementation of pcmk_action_t struct pcmk__action { int id; // Counter to identify action /* * When the controller aborts a transition graph, it sets an abort priority. * If this priority is higher, the action will still be executed anyway. * Pseudo-actions are always allowed, so this is irrelevant for them. */ int priority; pcmk_resource_t *rsc; // Resource to apply action to, if any pcmk_node_t *node; // Copy of node to execute action on, if any xmlNode *op_entry; // Action XML configuration, if any char *task; // Action name char *uuid; // Action key char *cancel_task; // If task is "cancel", the action being cancelled char *reason; // Readable description of why action is needed uint32_t flags; // Group of enum pcmk__action_flags enum pcmk__requires needs; // Prerequisite for recovery enum pcmk__on_fail on_fail; // Response to failure enum rsc_role_e fail_role; // Resource role if action fails GHashTable *meta; // Meta-attributes relevant to action GHashTable *extra; // Action-specific instance attributes pcmk_scheduler_t *scheduler; // Scheduler data this action is part of /* Current count of runnable instance actions for "first" action in an * ordering dependency with pcmk__ar_min_runnable set. */ int runnable_before; /* * Number of instance actions for "first" action in an ordering dependency * with pcmk__ar_min_runnable set that must be runnable before this action * can be runnable. */ int required_runnable_before; // Actions in a relation with this one (as pcmk__related_action_t *) GList *actions_before; GList *actions_after; }; void pcmk__free_action(gpointer user_data); char *pcmk__op_key(const char *rsc_id, const char *op_type, guint interval_ms); char *pcmk__notify_key(const char *rsc_id, const char *notify_type, const char *op_type); char *pcmk__transition_key(int transition_id, int action_id, int target_rc, const char *node); void pcmk__filter_op_for_digest(xmlNode *param_set); bool pcmk__is_fencing_action(const char *action); enum pcmk__action_type pcmk__parse_action(const char *action_name); const char *pcmk__action_text(enum pcmk__action_type action); const char *pcmk__on_fail_text(enum pcmk__on_fail on_fail); /*! * \internal * \brief Get a human-friendly action name * * \param[in] action_name Actual action name * \param[in] interval_ms Action interval (in milliseconds) * * \return Action name suitable for display */ static inline const char * pcmk__readable_action(const char *action_name, guint interval_ms) { if ((interval_ms == 0) && pcmk__str_eq(action_name, PCMK_ACTION_MONITOR, pcmk__str_none)) { return "probe"; } return action_name; } /*! * \internal * \brief Check whether an action raises a resource's role * * \param[in] action Action to check * * \return \c true if \p action is "start", "promote", or "migrate_from" */ static inline bool pcmk__is_up_action(const char *action) { return pcmk__str_any_of(action, PCMK_ACTION_START, PCMK_ACTION_PROMOTE, PCMK_ACTION_MIGRATE_FROM, NULL); } /*! * \internal * \brief Check whether an action lowers a resource's role * * \param[in] action Action to check * * \return \c true if \p action is "stop", "demote", or "migrate_to" */ static inline bool pcmk__is_down_action(const char *action) { return pcmk__str_any_of(action, PCMK_ACTION_STOP, PCMK_ACTION_DEMOTE, PCMK_ACTION_MIGRATE_TO, NULL); } #ifdef __cplusplus } #endif #endif // PCMK__CRM_COMMON_ACTIONS_INTERNAL__H diff --git a/include/crm_internal.h b/include/crm_internal.h index 337d309b99..8577d1ca81 100644 --- a/include/crm_internal.h +++ b/include/crm_internal.h @@ -1,100 +1,130 @@ /* * Copyright 2006-2025 the Pacemaker project contributors * * The version control history for this file may have further details. * * This source code is licensed under the GNU Lesser General Public License * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. */ #ifndef PCMK__CRM_INTERNAL__H #define PCMK__CRM_INTERNAL__H #ifndef PCMK__CONFIG_H #define PCMK__CONFIG_H #include #endif #include /* Our minimum glib dependency is 2.42. Define that as both the minimum and * maximum glib APIs that are allowed (i.e. APIs that were already deprecated * in 2.42, and APIs introduced after 2.42, cannot be used by Pacemaker code). */ #define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_42 #define GLIB_VERSION_MAX_ALLOWED GLIB_VERSION_2_42 #define G_LOG_DOMAIN "Pacemaker" #include #include #include /* Public API headers can guard including deprecated API headers with this * symbol, thus preventing internal code (which includes this header) from using * deprecated APIs, while still allowing external code to use them by default. */ #define PCMK_ALLOW_DEPRECATED 0 #include #include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include #include #include +#include +#include +#include +#include +#include +#include #include #include +#include #include +#include +#include +#include +#include #include -#include #include #include #ifdef __cplusplus extern "C" { #endif #define N_(String) (String) #ifdef ENABLE_NLS #define _(String) gettext(String) #else #define _(String) (String) #endif /* * IPC service names that are only used internally */ #define PCMK__SERVER_BASED_RO "cib_ro" #define PCMK__SERVER_BASED_RW "cib_rw" #define PCMK__SERVER_BASED_SHM "cib_shm" /* * IPC commands that can be sent to Pacemaker daemons */ #define PCMK__ATTRD_CMD_PEER_REMOVE "peer-remove" #define PCMK__ATTRD_CMD_UPDATE "update" #define PCMK__ATTRD_CMD_UPDATE_BOTH "update-both" #define PCMK__ATTRD_CMD_UPDATE_DELAY "update-delay" #define PCMK__ATTRD_CMD_QUERY "query" #define PCMK__ATTRD_CMD_REFRESH "refresh" #define PCMK__ATTRD_CMD_SYNC_RESPONSE "sync-response" #define PCMK__ATTRD_CMD_CLEAR_FAILURE "clear-failure" #define PCMK__ATTRD_CMD_CONFIRM "confirm" #define PCMK__CONTROLD_CMD_NODES "list-nodes" #define ST__LEVEL_MIN 1 #define ST__LEVEL_MAX 9 #ifdef __cplusplus } #endif #endif // CRM_INTERNAL__H