summaryrefslogtreecommitdiffstats
path: root/include/crm/common/scheduler.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/crm/common/scheduler.h')
-rw-r--r--include/crm/common/scheduler.h238
1 files changed, 238 insertions, 0 deletions
diff --git a/include/crm/common/scheduler.h b/include/crm/common/scheduler.h
new file mode 100644
index 0000000..96f9a62
--- /dev/null
+++ b/include/crm/common/scheduler.h
@@ -0,0 +1,238 @@
+/*
+ * Copyright 2004-2023 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_SCHEDULER__H
+# define PCMK__CRM_COMMON_SCHEDULER__H
+
+#include <sys/types.h> // time_t
+#include <libxml/tree.h> // xmlNode
+#include <glib.h> // guint, GList, GHashTable
+
+#include <crm/common/iso8601.h> // crm_time_t
+
+#include <crm/common/actions.h>
+#include <crm/common/nodes.h>
+#include <crm/common/resources.h>
+#include <crm/common/roles.h>
+#include <crm/common/scheduler_types.h>
+#include <crm/common/tags.h>
+#include <crm/common/tickets.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*!
+ * \file
+ * \brief Scheduler API
+ * \ingroup core
+ */
+
+//! Possible responses to loss of quorum
+enum pe_quorum_policy {
+ pcmk_no_quorum_freeze, //<! Do not recover resources from outside partition
+ pcmk_no_quorum_stop, //<! Stop all resources in partition
+ pcmk_no_quorum_ignore, //<! Act as if partition still holds quorum
+ pcmk_no_quorum_fence, //<! Fence all nodes in partition
+ pcmk_no_quorum_demote, //<! Demote promotable resources and stop all others
+
+#if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1)
+ //! \deprecated Use pcmk_no_quorum_freeze instead
+ no_quorum_freeze = pcmk_no_quorum_freeze,
+
+ //! \deprecated Use pcmk_no_quorum_stop instead
+ no_quorum_stop = pcmk_no_quorum_stop,
+
+ //! \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,
+
+ //! \deprecated Use pcmk_no_quorum_demote instead
+ no_quorum_demote = pcmk_no_quorum_demote,
+#endif
+};
+
+//! Scheduling options and conditions
+enum pcmk_scheduler_flags {
+ //! No scheduler flags set (compare with equality rather than bit set)
+ pcmk_sched_none = 0ULL,
+
+ // These flags are dynamically determined conditions
+
+ //! Whether partition has quorum (via have-quorum property)
+ pcmk_sched_quorate = (1ULL << 0),
+
+ //! Whether cluster is symmetric (via symmetric-cluster property)
+ pcmk_sched_symmetric_cluster = (1ULL << 1),
+
+ //! Whether cluster is in maintenance mode (via maintenance-mode property)
+ pcmk_sched_in_maintenance = (1ULL << 3),
+
+ //! Whether fencing is enabled (via stonith-enabled property)
+ pcmk_sched_fencing_enabled = (1ULL << 4),
+
+ //! Whether cluster has a fencing resource (via CIB resources)
+ pcmk_sched_have_fencing = (1ULL << 5),
+
+ //! 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)
+ 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)
+ pcmk_sched_stop_all = (1ULL << 10),
+
+ /*!
+ * Whether start failure should be treated as if migration-threshold is 1
+ * (via start-failure-is-fatal property)
+ */
+ pcmk_sched_start_failure_fatal = (1ULL << 12),
+
+ //! \deprecated Do not use
+ pcmk_sched_remove_after_stop = (1ULL << 13),
+
+ //! 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
+ pcmk_sched_have_status = (1ULL << 17),
+
+ //! 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
+
+ /*!
+ * 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
+ pcmk_sched_sanitized = (1ULL << 21),
+
+ //! 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
+ pcmk_sched_output_scores = (1ULL << 25),
+
+ //! 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
+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
+
+ // @COMPAT Change to uint64_t at a compatibility break
+ unsigned long long flags; //!< Group of enum pcmk_scheduler_flags
+
+ 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
+
+ //!< Ticket constraints unpacked from ticket state
+ GHashTable *tickets;
+
+ //! 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
+
+ //!< 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
+
+ // @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
+
+ // pcmk__output_t *
+ void *priv; //!< For Pacemaker use only
+
+ guint node_pending_timeout; //!< Pending join times out after this (ms)
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // PCMK__CRM_COMMON_SCHEDULER__H