46 const char *reason = NULL;
54 reason =
"action definition changed";
61 switch (digest_data->
rc) {
63 crm_trace(
"Resource %s history entry %s on %s has "
64 "no digest to compare",
65 rsc->
id, pcmk__xe_id(rsc_op), node->
priv->
id);
70 reason =
"resource parameters have changed";
91failcount_clear_action_exists(
const pcmk_node_t *node,
112check_failure_threshold(gpointer
data, gpointer user_data)
119 g_list_foreach(rsc->
priv->
children, check_failure_threshold,
124 if (!failcount_clear_action_exists(node, rsc)) {
158apply_exclusive_discovery(gpointer
data, gpointer user_data)
172 g_list_foreach(rsc->
priv->
children, apply_exclusive_discovery,
192apply_stickiness(gpointer
data, gpointer user_data)
199 g_list_foreach(rsc->
priv->
children, apply_stickiness, NULL);
222 node->
priv->
id) == NULL)) {
224 "Ignoring %s stickiness because the cluster is "
225 "asymmetric and %s is not explicitly allowed",
226 rsc->
id, pcmk__node_name(node));
249 iter != NULL; iter = iter->next) {
268 crm_trace(
"Applying node-specific scheduling criteria");
274 node_iter = node_iter->next) {
277 rsc_iter != NULL; rsc_iter = rsc_iter->next) {
279 check_failure_threshold(rsc_iter->data, node_iter->data);
280 apply_exclusive_discovery(rsc_iter->data, node_iter->data);
296 crm_trace(
"Assigning resources to nodes");
310 iter != NULL; iter = iter->next) {
345clear_failcounts_if_orphaned(gpointer
data, gpointer user_data)
352 crm_trace(
"Clear fail counts for orphaned resource %s", rsc->
id);
359 iter != NULL; iter = iter->next) {
405 crm_trace(
"Scheduling resource actions");
407 iter != NULL; iter = iter->next) {
430 iter != NULL; iter = iter->next) {
451 iter != NULL; iter = iter->next) {
469needs_fencing(
const pcmk_node_t *node,
bool have_managed)
486 if (pcmk__is_pacemaker_remote_node(node)) {
518 return g_list_prepend(list,
action);
534 pcmk__node_name(node));
549 bool integrity_lost =
false;
550 bool have_managed = any_managed_resources(
scheduler);
551 GList *fencing_ops = NULL;
552 GList *shutdown_ops = NULL;
554 crm_trace(
"Scheduling fencing and shutdowns as needed");
556 crm_notice(
"No fencing will be done until there are resources "
561 for (GList *iter =
scheduler->
nodes; iter != NULL; iter = iter->next) {
569 if (pcmk__is_guest_or_bundle_node(node)) {
577 if (needs_fencing(node, have_managed)) {
578 fencing = schedule_fencing(node);
584 fencing_ops = add_nondc_fencing(fencing_ops, fencing,
588 }
else if (needs_shutdown(node)) {
595 shutdown_ops = g_list_prepend(shutdown_ops, down_op);
600 integrity_lost =
true;
602 pcmk__node_name(node));
606 if (integrity_lost) {
609 "cannot be guaranteed (configure, enable, "
610 "and test fencing to correct this)");
613 crm_notice(
"Unclean nodes will not be fenced until quorum is "
619 if (dc_down != NULL) {
639 }
else if (fencing_ops != NULL) {
649 g_list_free(fencing_ops);
650 g_list_free(shutdown_ops);
663 all = g_list_prepend(all, (gpointer)
"*");
666 item != NULL; item = item->next) {
721 crm_trace(
"Required but unrunnable actions:");
723 iter != NULL; iter = iter->next) {
771 schedule_fencing_and_shutdowns(
scheduler);
810 if (new_scheduler == NULL) {
821 if (new_scheduler->
input == NULL) {
822 out->
err(out,
"Failed to copy input XML");
@ pcmk__ar_ordered
Actions are ordered (optionally, if no other flags are set)
#define PCMK_ACTION_CLEAR_FAILCOUNT
#define PCMK_ACTION_DO_SHUTDOWN
int cib__signon_query(pcmk__output_t *out, cib_t **cib, xmlNode **cib_object)
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
crm_time_t * pcmk_copy_time(const crm_time_t *source)
struct crm_time_s crm_time_t
G_GNUC_INTERNAL void pcmk__order_vs_fence(pcmk_action_t *stonith_op, pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__new_ordering(pcmk_resource_t *first_rsc, char *first_task, pcmk_action_t *first_action, pcmk_resource_t *then_rsc, char *then_task, pcmk_action_t *then_action, uint32_t flags, pcmk_scheduler_t *sched)
G_GNUC_INTERNAL void pcmk__log_action(const char *pre_text, const pcmk_action_t *action, bool details)
G_GNUC_INTERNAL pcmk_action_t * pcmk__new_shutdown_action(pcmk_node_t *node)
G_GNUC_INTERNAL void pcmk__show_node_capacities(const char *desc, pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__schedule_probes(pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__set_assignment_methods(pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__handle_rsc_config_changes(pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__fence_guest(pcmk_node_t *node)
G_GNUC_INTERNAL void pcmk__order_remote_connection_actions(pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL bool pcmk__threshold_reached(pcmk_resource_t *rsc, const pcmk_node_t *node, pcmk_resource_t **failed)
G_GNUC_INTERNAL void pcmk__apply_node_health(pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__sort_resources(pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__apply_orderings(pcmk_scheduler_t *sched)
G_GNUC_INTERNAL bool pcmk__check_action_config(pcmk_resource_t *rsc, pcmk_node_t *node, const xmlNode *xml_op)
G_GNUC_INTERNAL void pcmk__order_after_each(pcmk_action_t *after, GList *list)
G_GNUC_INTERNAL void pcmk__create_graph(pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__apply_locations(pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__create_internal_constraints(pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__output_actions(pcmk_scheduler_t *scheduler)
#define CRM_TRACE_INIT_DATA(name)
unsigned int get_crm_log_level(void)
#define crm_notice(fmt, args...)
#define crm_trace(fmt, args...)
#define pcmk__config_warn(fmt...)
pcmk_scheduler_t * scheduler
@ pcmk__node_remote_reset
#define PCMK_OPT_NO_QUORUM_POLICY
#define PCMK_VALUE_IGNORE
#define PCMK_VALUE_DEFAULT
void pcmk__output_set_log_level(pcmk__output_t *out, uint8_t log_level)
void pcmk__output_free(pcmk__output_t *out)
int pcmk__log_output_new(pcmk__output_t **out)
int pcmk__init_scheduler(pcmk__output_t *out, xmlNodePtr input, const crm_time_t *date, pcmk_scheduler_t **scheduler)
void pcmk__schedule_actions(pcmk_scheduler_t *scheduler)
void pcmk__register_lib_messages(pcmk__output_t *out)
void pcmk__unpack_constraints(pcmk_scheduler_t *scheduler)
bool pe_can_fence(const pcmk_scheduler_t *scheduler, const pcmk_node_t *node)
pcmk_action_t * pe__clear_failcount(pcmk_resource_t *rsc, const pcmk_node_t *node, const char *reason, pcmk_scheduler_t *scheduler)
Schedule a controller operation to clear a fail count.
GList * pe__resource_actions(const pcmk_resource_t *rsc, const pcmk_node_t *node, const char *task, bool require_node)
Find all actions of given type for a resource.
const pcmk_resource_t * pe__const_top_resource(const pcmk_resource_t *rsc, bool include_bundle)
pcmk__op_digest_t * rsc_action_digest_cmp(pcmk_resource_t *rsc, const xmlNode *xml_op, pcmk_node_t *node, pcmk_scheduler_t *scheduler)
void resource_location(pcmk_resource_t *rsc, const pcmk_node_t *node, int score, const char *tag, pcmk_scheduler_t *scheduler)
gboolean order_actions(pcmk_action_t *first, pcmk_action_t *then, uint32_t flags)
int pe_get_failcount(const pcmk_node_t *node, pcmk_resource_t *rsc, time_t *last_failure, uint32_t flags, const xmlNode *xml_op)
void pe__register_messages(pcmk__output_t *out)
pcmk_action_t * pe_fence_op(pcmk_node_t *node, const char *op, bool optional, const char *reason, bool priority_delay, pcmk_scheduler_t *scheduler)
@ pcmk__rsc_exclusive_probes
@ pcmk__rsc_is_remote_connection
@ pcmk_role_stopped
Stopped.
void pcmk_free_scheduler(pcmk_scheduler_t *scheduler)
Free scheduler data.
pcmk_scheduler_t * pcmk_new_scheduler(void)
Create a new object to hold scheduler data.
#define pcmk__rsc_trace(rsc, fmt, args...)
@ pcmk__check_last_failure
void pcmk__free_param_checks(pcmk_scheduler_t *scheduler)
#define pcmk__rsc_debug(rsc, fmt, args...)
#define pcmk__sched_warn(scheduler, fmt...)
void pcmk__foreach_param_check(pcmk_scheduler_t *scheduler, void(*cb)(pcmk_resource_t *, pcmk_node_t *, const xmlNode *, enum pcmk__check_parameters))
#define pcmk__set_scheduler_flags(scheduler, flags_to_set)
@ pcmk__sched_stop_removed_resources
@ pcmk__sched_shutdown_lock
@ pcmk__sched_fencing_enabled
@ pcmk__sched_symmetric_cluster
@ pcmk__sched_have_remote_nodes
@ pcmk__sched_concurrent_fencing
@ pcmk__sched_validate_only
@ pcmk__sched_probe_resources
@ pcmk__sched_location_only
#define PCMK_SCORE_INFINITY
Integer score to use to represent "infinity".
Cluster status and scheduling.
gboolean cluster_status(pcmk_scheduler_t *scheduler)
pcmk_node_t *(* assign)(pcmk_resource_t *rsc, const pcmk_node_t *prefer, bool stop_if_fail)
void(* create_actions)(pcmk_resource_t *rsc)
void(* shutdown_lock)(pcmk_resource_t *rsc)
enum pcmk__probe_mode probe_mode
pcmk_scheduler_t * scheduler
enum pcmk__digest_result rc
This structure contains everything that makes up a single output formatter.
void(* end_list)(pcmk__output_t *out)
int(* message)(pcmk__output_t *out, const char *message_id,...)
int int void(* err)(pcmk__output_t *out, const char *format,...) G_GNUC_PRINTF(2
void(* finish)(pcmk__output_t *out, crm_exit_t exit_status, bool print, void **copy_dest)
void(* begin_list)(pcmk__output_t *out, const char *singular_noun, const char *plural_noun, const char *format,...) G_GNUC_PRINTF(4
pcmk_node_t * partial_migration_target
pcmk_scheduler_t * scheduler
enum rsc_role_e orig_role
const pcmk__assignment_methods_t * cmds
GHashTable * allowed_nodes
pcmk__resource_private_t * priv
const char * placement_strategy
pcmk__scheduler_private_t * priv
pcmk__node_private_t * priv
struct pcmk__node_details * details
struct pcmk__node_assignment * assign
Wrappers for and extensions to libxml2.
xmlNode * pcmk__xml_copy(xmlNode *parent, xmlNode *src)