diff options
Diffstat (limited to '')
-rw-r--r-- | include/crm/common/scheduler.h | 207 |
1 files changed, 133 insertions, 74 deletions
diff --git a/include/crm/common/scheduler.h b/include/crm/common/scheduler.h index 96f9a62..f75d808 100644 --- a/include/crm/common/scheduler.h +++ b/include/crm/common/scheduler.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2023 the Pacemaker project contributors + * Copyright 2004-2024 the Pacemaker project contributors * * The version control history for this file may have further details. * @@ -8,7 +8,7 @@ */ #ifndef PCMK__CRM_COMMON_SCHEDULER__H -# define PCMK__CRM_COMMON_SCHEDULER__H +#define PCMK__CRM_COMMON_SCHEDULER__H #include <sys/types.h> // time_t #include <libxml/tree.h> // xmlNode @@ -20,6 +20,7 @@ #include <crm/common/nodes.h> #include <crm/common/resources.h> #include <crm/common/roles.h> +#include <crm/common/rules.h> #include <crm/common/scheduler_types.h> #include <crm/common/tags.h> #include <crm/common/tickets.h> @@ -34,6 +35,7 @@ extern "C" { * \ingroup core */ +// NOTE: sbd (as of at least 1.5.2) uses this enum //! Possible responses to loss of quorum enum pe_quorum_policy { pcmk_no_quorum_freeze, //<! Do not recover resources from outside partition @@ -43,193 +45,250 @@ enum pe_quorum_policy { pcmk_no_quorum_demote, //<! Demote promotable resources and stop all others #if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) + // NOTE: sbd (as of at least 1.5.2) uses this value //! \deprecated Use pcmk_no_quorum_freeze instead no_quorum_freeze = pcmk_no_quorum_freeze, + // NOTE: sbd (as of at least 1.5.2) uses this value //! \deprecated Use pcmk_no_quorum_stop instead no_quorum_stop = pcmk_no_quorum_stop, + // NOTE: sbd (as of at least 1.5.2) uses this value //! \deprecated Use pcmk_no_quorum_ignore instead no_quorum_ignore = pcmk_no_quorum_ignore, //! \deprecated Use pcmk_no_quorum_fence instead no_quorum_suicide = pcmk_no_quorum_fence, + // NOTE: sbd (as of at least 1.5.2) uses this value //! \deprecated Use pcmk_no_quorum_demote instead no_quorum_demote = pcmk_no_quorum_demote, #endif }; -//! Scheduling options and conditions +// Scheduling options and conditions +//!@{ +//! \deprecated Do not use enum pcmk_scheduler_flags { - //! No scheduler flags set (compare with equality rather than bit set) + // No scheduler flags set (compare with equality rather than bit set) pcmk_sched_none = 0ULL, - // These flags are dynamically determined conditions + /* These flags are dynamically determined conditions */ - //! Whether partition has quorum (via have-quorum property) + // Whether partition has quorum (via \c PCMK_XA_HAVE_QUORUM attribute) + //! \deprecated Call pcmk_has_quorum() to check quorum instead pcmk_sched_quorate = (1ULL << 0), - //! Whether cluster is symmetric (via symmetric-cluster property) + // Whether cluster is symmetric (via symmetric-cluster property) pcmk_sched_symmetric_cluster = (1ULL << 1), - //! Whether cluster is in maintenance mode (via maintenance-mode property) + // Whether cluster is in maintenance mode (via maintenance-mode property) pcmk_sched_in_maintenance = (1ULL << 3), - //! Whether fencing is enabled (via stonith-enabled property) + // Whether fencing is enabled (via stonith-enabled property) pcmk_sched_fencing_enabled = (1ULL << 4), - //! Whether cluster has a fencing resource (via CIB resources) + // Whether cluster has a fencing resource (via CIB resources) + /*! \deprecated To indicate the cluster has a fencing resource, add either a + * fencing resource configuration or the have-watchdog cluster option to the + * input CIB + */ pcmk_sched_have_fencing = (1ULL << 5), - //! Whether any resource provides or requires unfencing (via CIB resources) + // Whether any resource provides or requires unfencing (via CIB resources) pcmk_sched_enable_unfencing = (1ULL << 6), - //! Whether concurrent fencing is allowed (via concurrent-fencing property) + // Whether concurrent fencing is allowed (via concurrent-fencing property) pcmk_sched_concurrent_fencing = (1ULL << 7), - /*! + /* * Whether resources removed from the configuration should be stopped (via * stop-orphan-resources property) */ pcmk_sched_stop_removed_resources = (1ULL << 8), - /*! + /* * Whether recurring actions removed from the configuration should be * cancelled (via stop-orphan-actions property) */ pcmk_sched_cancel_removed_actions = (1ULL << 9), - //! Whether to stop all resources (via stop-all-resources property) + // Whether to stop all resources (via stop-all-resources property) pcmk_sched_stop_all = (1ULL << 10), - /*! - * Whether start failure should be treated as if migration-threshold is 1 - * (via start-failure-is-fatal property) + /* + * Whether start failure should be treated as if + * \c PCMK_META_MIGRATION_THRESHOLD is 1 (via + * \c PCMK_OPT_START_FAILURE_IS_FATAL property) */ pcmk_sched_start_failure_fatal = (1ULL << 12), - //! \deprecated Do not use + // Unused pcmk_sched_remove_after_stop = (1ULL << 13), - //! Whether unseen nodes should be fenced (via startup-fencing property) + // Whether unseen nodes should be fenced (via startup-fencing property) pcmk_sched_startup_fencing = (1ULL << 14), - /*! + /* * Whether resources should be left stopped when their node shuts down * cleanly (via shutdown-lock property) */ pcmk_sched_shutdown_lock = (1ULL << 15), - /*! + /* * Whether resources' current state should be probed (when unknown) before * scheduling any other actions (via the enable-startup-probes property) */ pcmk_sched_probe_resources = (1ULL << 16), - //! Whether the CIB status section has been parsed yet + // Whether the CIB status section has been parsed yet pcmk_sched_have_status = (1ULL << 17), - //! Whether the cluster includes any Pacemaker Remote nodes (via CIB) + // Whether the cluster includes any Pacemaker Remote nodes (via CIB) pcmk_sched_have_remote_nodes = (1ULL << 18), - // The remaining flags are scheduling options that must be set explicitly - /*! + /* The remaining flags are scheduling options that must be set explicitly */ + + /* * Whether to skip unpacking the CIB status section and stop the scheduling * sequence after applying node-specific location criteria (skipping * assignment, ordering, actions, etc.). */ pcmk_sched_location_only = (1ULL << 20), - //! Whether sensitive resource attributes have been masked + // Whether sensitive resource attributes have been masked pcmk_sched_sanitized = (1ULL << 21), - //! Skip counting of total, disabled, and blocked resource instances + // Skip counting of total, disabled, and blocked resource instances pcmk_sched_no_counts = (1ULL << 23), - /*! + /* * Skip deprecated code kept solely for backward API compatibility * (internal code should always set this) */ pcmk_sched_no_compat = (1ULL << 24), - //! Whether node scores should be output instead of logged + // Whether node scores should be output instead of logged pcmk_sched_output_scores = (1ULL << 25), - //! Whether to show node and resource utilization (in log or output) + // Whether to show node and resource utilization (in log or output) pcmk_sched_show_utilization = (1ULL << 26), - /*! + /* * Whether to stop the scheduling sequence after unpacking the CIB, * calculating cluster status, and applying node health (skipping * applying node-specific location criteria, assignment, etc.) */ pcmk_sched_validate_only = (1ULL << 27), }; +//!@} -//! Implementation of pcmk_scheduler_t +// Implementation of pcmk_scheduler_t +// @COMPAT Make contents internal when we can break API backward compatibility +//!@{ +//! \deprecated Do not use (public access will be removed in a future release) struct pe_working_set_s { // Be careful about when each piece of information is available and final - xmlNode *input; //!< CIB XML - crm_time_t *now; //!< Current time for evaluation purposes - char *dc_uuid; //!< Node ID of designated controller - pcmk_node_t *dc_node; //!< Node object for DC - const char *stonith_action; //!< Default fencing action - const char *placement_strategy; //!< Value of placement-strategy property + // NOTE: sbd (as of at least 1.5.2) uses this + //! \deprecated To set scheduler iput, use pcmk_set_scheduler_cib() instead + xmlNode *input; // CIB XML + + crm_time_t *now; // Current time for evaluation purposes + char *dc_uuid; // Node ID of designated controller + + // NOTE: sbd (as of at least 1.5.2) uses this + //! \deprecated Call pcmk_get_dc() instead + pcmk_node_t *dc_node; // Node object for DC + const char *stonith_action; // Default fencing action + const char *placement_strategy; // Value of placement-strategy property + + // NOTE: sbd (as of at least 1.5.2) uses this // @COMPAT Change to uint64_t at a compatibility break - unsigned long long flags; //!< Group of enum pcmk_scheduler_flags + //! \deprecated Call pcmk_has_quorum() to check quorum + unsigned long long flags; // Group of enum pcmk_scheduler_flags + + int stonith_timeout; // Value of stonith-timeout property + + // NOTE: sbd (as of at least 1.5.2) uses this + //! \deprecated Call pcmk_get_no_quorum_policy() to get no-quorum policy + enum pe_quorum_policy no_quorum_policy; // Response to loss of quorum - int stonith_timeout; //!< Value of stonith-timeout property - enum pe_quorum_policy no_quorum_policy; //!< Response to loss of quorum - GHashTable *config_hash; //!< Cluster properties + GHashTable *config_hash; // Cluster properties - //!< Ticket constraints unpacked from ticket state + // Ticket constraints unpacked from ticket state GHashTable *tickets; - //! Actions for which there can be only one (such as "fence node X") + // Actions for which there can be only one (such as "fence node X") GHashTable *singletons; - GList *nodes; //!< Nodes in cluster - GList *resources; //!< Resources in cluster - GList *placement_constraints; //!< Location constraints - GList *ordering_constraints; //!< Ordering constraints - GList *colocation_constraints; //!< Colocation constraints + // NOTE: sbd (as of at least 1.5.2) uses this + //! \deprecated Call pcmk_find_node() to find a node instead + GList *nodes; // Nodes in cluster - //!< Ticket constraints unpacked by libpacemaker + GList *resources; // Resources in cluster + GList *placement_constraints; // Location constraints + GList *ordering_constraints; // Ordering constraints + GList *colocation_constraints; // Colocation constraints + + // Ticket constraints unpacked by libpacemaker GList *ticket_constraints; - GList *actions; //!< Scheduled actions - xmlNode *failed; //!< History entries of failed actions - xmlNode *op_defaults; //!< Configured operation defaults - xmlNode *rsc_defaults; //!< Configured resource defaults - int num_synapse; //!< Number of transition graph synapses - int max_valid_nodes; //!< \deprecated Do not use - int order_id; //!< ID to use for next created ordering - int action_id; //!< ID to use for next created action - xmlNode *graph; //!< Transition graph - GHashTable *template_rsc_sets; //!< Mappings of template ID to resource ID + GList *actions; // Scheduled actions + xmlNode *failed; // History entries of failed actions + xmlNode *op_defaults; // Configured operation defaults + xmlNode *rsc_defaults; // Configured resource defaults + int num_synapse; // Number of transition graph synapses + int max_valid_nodes; // \deprecated Do not use + int order_id; // ID to use for next created ordering + int action_id; // ID to use for next created action + xmlNode *graph; // Transition graph + GHashTable *template_rsc_sets; // Mappings of template ID to resource ID // @COMPAT Replace this with a fencer variable (only place it's used) - const char *localhost; //!< \deprecated Do not use - - GHashTable *tags; //!< Configuration tags (ID -> pcmk_tag_t *) - int blocked_resources; //!< Number of blocked resources in cluster - int disabled_resources; //!< Number of disabled resources in cluster - GList *param_check; //!< History entries that need to be checked - GList *stop_needed; //!< Containers that need stop actions - time_t recheck_by; //!< Hint to controller when to reschedule - int ninstances; //!< Total number of resource instances - guint shutdown_lock; //!< How long to lock resources (seconds) - int priority_fencing_delay; //!< Priority fencing delay + const char *localhost; // \deprecated Do not use + + GHashTable *tags; // Configuration tags (ID -> pcmk_tag_t *) + int blocked_resources; // Number of blocked resources in cluster + int disabled_resources; // Number of disabled resources in cluster + GList *param_check; // History entries that need to be checked + GList *stop_needed; // Containers that need stop actions + time_t recheck_by; // Hint to controller when to reschedule + int ninstances; // Total number of resource instances + guint shutdown_lock; // How long to lock resources (seconds) + int priority_fencing_delay; // Priority fencing delay // pcmk__output_t * - void *priv; //!< For Pacemaker use only + void *priv; // For Pacemaker use only - guint node_pending_timeout; //!< Pending join times out after this (ms) + guint node_pending_timeout; // Pending join times out after this (ms) }; +//!@} + +/* Whether the scheduler input currently being processed has warnings or errors + * + * @COMPAT When we can break API compatibility, we should make these + * internal-only. Ideally they would be converted to pcmk_scheduler_flags + * values, but everywhere they're needed doesn't currently have access to the + * scheduler data. + */ +//!@{ +//! \deprecated Do not use +extern gboolean was_processing_error; +extern gboolean was_processing_warning; +//!@} + +pcmk_node_t *pcmk_get_dc(const pcmk_scheduler_t *scheduler); +enum pe_quorum_policy pcmk_get_no_quorum_policy(const pcmk_scheduler_t + *scheduler); + +int pcmk_set_scheduler_cib(pcmk_scheduler_t *scheduler, xmlNode *cib); + +bool pcmk_has_quorum(const pcmk_scheduler_t *scheduler); +pcmk_node_t *pcmk_find_node(const pcmk_scheduler_t *scheduler, + const char *node_name); #ifdef __cplusplus } |