root/include/crm/common/scheduler.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2  * Copyright 2004-2023 the Pacemaker project contributors
   3  *
   4  * The version control history for this file may have further details.
   5  *
   6  * This source code is licensed under the GNU Lesser General Public License
   7  * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
   8  */
   9 
  10 #ifndef PCMK__CRM_COMMON_SCHEDULER__H
  11 #  define PCMK__CRM_COMMON_SCHEDULER__H
  12 
  13 #include <sys/types.h>                  // time_t
  14 #include <libxml/tree.h>                // xmlNode
  15 #include <glib.h>                       // guint, GList, GHashTable
  16 
  17 #include <crm/common/iso8601.h>         // crm_time_t
  18 
  19 #include <crm/common/actions.h>
  20 #include <crm/common/nodes.h>
  21 #include <crm/common/resources.h>
  22 #include <crm/common/roles.h>
  23 #include <crm/common/scheduler_types.h>
  24 #include <crm/common/tags.h>
  25 #include <crm/common/tickets.h>
  26 
  27 #ifdef __cplusplus
  28 extern "C" {
  29 #endif
  30 
  31 /*!
  32  * \file
  33  * \brief Scheduler API
  34  * \ingroup core
  35  */
  36 
  37 //! Possible responses to loss of quorum
  38 enum pe_quorum_policy {
  39     pcmk_no_quorum_freeze,  //<! Do not recover resources from outside partition
  40     pcmk_no_quorum_stop,    //<! Stop all resources in partition
  41     pcmk_no_quorum_ignore,  //<! Act as if partition still holds quorum
  42     pcmk_no_quorum_fence,   //<! Fence all nodes in partition
  43     pcmk_no_quorum_demote,  //<! Demote promotable resources and stop all others
  44 
  45 #if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1)
  46     //! \deprecated Use pcmk_no_quorum_freeze instead
  47     no_quorum_freeze    = pcmk_no_quorum_freeze,
  48 
  49     //! \deprecated Use pcmk_no_quorum_stop instead
  50     no_quorum_stop      = pcmk_no_quorum_stop,
  51 
  52     //! \deprecated Use pcmk_no_quorum_ignore instead
  53     no_quorum_ignore    = pcmk_no_quorum_ignore,
  54 
  55     //! \deprecated Use pcmk_no_quorum_fence instead
  56     no_quorum_suicide   = pcmk_no_quorum_fence,
  57 
  58     //! \deprecated Use pcmk_no_quorum_demote instead
  59     no_quorum_demote    = pcmk_no_quorum_demote,
  60 #endif
  61 };
  62 
  63 //! Scheduling options and conditions
  64 enum pcmk_scheduler_flags {
  65     //! No scheduler flags set (compare with equality rather than bit set)
  66     pcmk_sched_none                     = 0ULL,
  67 
  68     // These flags are dynamically determined conditions
  69 
  70     //! Whether partition has quorum (via have-quorum property)
  71     pcmk_sched_quorate                  = (1ULL << 0),
  72 
  73     //! Whether cluster is symmetric (via symmetric-cluster property)
  74     pcmk_sched_symmetric_cluster        = (1ULL << 1),
  75 
  76     //! Whether cluster is in maintenance mode (via maintenance-mode property)
  77     pcmk_sched_in_maintenance           = (1ULL << 3),
  78 
  79     //! Whether fencing is enabled (via stonith-enabled property)
  80     pcmk_sched_fencing_enabled          = (1ULL << 4),
  81 
  82     //! Whether cluster has a fencing resource (via CIB resources)
  83     pcmk_sched_have_fencing             = (1ULL << 5),
  84 
  85     //! Whether any resource provides or requires unfencing (via CIB resources)
  86     pcmk_sched_enable_unfencing         = (1ULL << 6),
  87 
  88     //! Whether concurrent fencing is allowed (via concurrent-fencing property)
  89     pcmk_sched_concurrent_fencing       = (1ULL << 7),
  90 
  91     /*!
  92      * Whether resources removed from the configuration should be stopped (via
  93      * stop-orphan-resources property)
  94      */
  95     pcmk_sched_stop_removed_resources   = (1ULL << 8),
  96 
  97     /*!
  98      * Whether recurring actions removed from the configuration should be
  99      * cancelled (via stop-orphan-actions property)
 100      */
 101     pcmk_sched_cancel_removed_actions   = (1ULL << 9),
 102 
 103     //! Whether to stop all resources (via stop-all-resources property)
 104     pcmk_sched_stop_all                 = (1ULL << 10),
 105 
 106     /*!
 107      * Whether start failure should be treated as if migration-threshold is 1
 108      * (via start-failure-is-fatal property)
 109      */
 110     pcmk_sched_start_failure_fatal      = (1ULL << 12),
 111 
 112     //! \deprecated Do not use
 113     pcmk_sched_remove_after_stop        = (1ULL << 13),
 114 
 115     //! Whether unseen nodes should be fenced (via startup-fencing property)
 116     pcmk_sched_startup_fencing          = (1ULL << 14),
 117 
 118     /*!
 119      * Whether resources should be left stopped when their node shuts down
 120      * cleanly (via shutdown-lock property)
 121      */
 122     pcmk_sched_shutdown_lock            = (1ULL << 15),
 123 
 124     /*!
 125      * Whether resources' current state should be probed (when unknown) before
 126      * scheduling any other actions (via the enable-startup-probes property)
 127      */
 128     pcmk_sched_probe_resources          = (1ULL << 16),
 129 
 130     //! Whether the CIB status section has been parsed yet
 131     pcmk_sched_have_status              = (1ULL << 17),
 132 
 133     //! Whether the cluster includes any Pacemaker Remote nodes (via CIB)
 134     pcmk_sched_have_remote_nodes        = (1ULL << 18),
 135 
 136     // The remaining flags are scheduling options that must be set explicitly
 137 
 138     /*!
 139      * Whether to skip unpacking the CIB status section and stop the scheduling
 140      * sequence after applying node-specific location criteria (skipping
 141      * assignment, ordering, actions, etc.).
 142      */
 143     pcmk_sched_location_only            = (1ULL << 20),
 144 
 145     //! Whether sensitive resource attributes have been masked
 146     pcmk_sched_sanitized                = (1ULL << 21),
 147 
 148     //! Skip counting of total, disabled, and blocked resource instances
 149     pcmk_sched_no_counts                = (1ULL << 23),
 150 
 151     /*!
 152      * Skip deprecated code kept solely for backward API compatibility
 153      * (internal code should always set this)
 154      */
 155     pcmk_sched_no_compat                = (1ULL << 24),
 156 
 157     //! Whether node scores should be output instead of logged
 158     pcmk_sched_output_scores            = (1ULL << 25),
 159 
 160     //! Whether to show node and resource utilization (in log or output)
 161     pcmk_sched_show_utilization         = (1ULL << 26),
 162 
 163     /*!
 164      * Whether to stop the scheduling sequence after unpacking the CIB,
 165      * calculating cluster status, and applying node health (skipping
 166      * applying node-specific location criteria, assignment, etc.)
 167      */
 168     pcmk_sched_validate_only            = (1ULL << 27),
 169 };
 170 
 171 //! Implementation of pcmk_scheduler_t
 172 struct pe_working_set_s {
 173     // Be careful about when each piece of information is available and final
 174 
 175     xmlNode *input;                 //!< CIB XML
 176     crm_time_t *now;                //!< Current time for evaluation purposes
 177     char *dc_uuid;                  //!< Node ID of designated controller
 178     pcmk_node_t *dc_node;           //!< Node object for DC
 179     const char *stonith_action;     //!< Default fencing action
 180     const char *placement_strategy; //!< Value of placement-strategy property
 181 
 182     // @COMPAT Change to uint64_t at a compatibility break
 183     unsigned long long flags;       //!< Group of enum pcmk_scheduler_flags
 184 
 185     int stonith_timeout;            //!< Value of stonith-timeout property
 186     enum pe_quorum_policy no_quorum_policy; //!< Response to loss of quorum
 187     GHashTable *config_hash;        //!< Cluster properties
 188 
 189     //!< Ticket constraints unpacked from ticket state
 190     GHashTable *tickets;
 191 
 192     //! Actions for which there can be only one (such as "fence node X")
 193     GHashTable *singletons;
 194 
 195     GList *nodes;                   //!< Nodes in cluster
 196     GList *resources;               //!< Resources in cluster
 197     GList *placement_constraints;   //!< Location constraints
 198     GList *ordering_constraints;    //!< Ordering constraints
 199     GList *colocation_constraints;  //!< Colocation constraints
 200 
 201     //!< Ticket constraints unpacked by libpacemaker
 202     GList *ticket_constraints;
 203 
 204     GList *actions;                 //!< Scheduled actions
 205     xmlNode *failed;                //!< History entries of failed actions
 206     xmlNode *op_defaults;           //!< Configured operation defaults
 207     xmlNode *rsc_defaults;          //!< Configured resource defaults
 208     int num_synapse;                //!< Number of transition graph synapses
 209     int max_valid_nodes;            //!< \deprecated Do not use
 210     int order_id;                   //!< ID to use for next created ordering
 211     int action_id;                  //!< ID to use for next created action
 212     xmlNode *graph;                 //!< Transition graph
 213     GHashTable *template_rsc_sets;  //!< Mappings of template ID to resource ID
 214 
 215     // @COMPAT Replace this with a fencer variable (only place it's used)
 216     const char *localhost;          //!< \deprecated Do not use
 217 
 218     GHashTable *tags;               //!< Configuration tags (ID -> pcmk_tag_t *)
 219     int blocked_resources;          //!< Number of blocked resources in cluster
 220     int disabled_resources;         //!< Number of disabled resources in cluster
 221     GList *param_check;             //!< History entries that need to be checked
 222     GList *stop_needed;             //!< Containers that need stop actions
 223     time_t recheck_by;              //!< Hint to controller when to reschedule
 224     int ninstances;                 //!< Total number of resource instances
 225     guint shutdown_lock;            //!< How long to lock resources (seconds)
 226     int priority_fencing_delay;     //!< Priority fencing delay
 227 
 228     // pcmk__output_t *
 229     void *priv;                     //!< For Pacemaker use only
 230 
 231     guint node_pending_timeout;     //!< Pending join times out after this (ms)
 232 };
 233 
 234 #ifdef __cplusplus
 235 }
 236 #endif
 237 
 238 #endif // PCMK__CRM_COMMON_SCHEDULER__H

/* [previous][next][first][last][top][bottom][index][help] */