37 if (pcmk__is_guest_or_bundle_node(node)) {
65 }
else if (node == NULL) {
73 if (pcmk__is_pacemaker_remote_node(node)
93 while (g_hash_table_iter_next(&iter, NULL, (
void **) &n)) {
103 crm_notice(
"We can fence %s without quorum because they're in our membership",
104 pcmk__node_name(node));
108 crm_trace(
"Cannot fence %s", pcmk__node_name(node));
154 GHashTable *
result = NULL;
157 for (
const GList *gIter = list; gIter != NULL; gIter = gIter->next) {
161 g_hash_table_insert(
result, (gpointer) new_node->
priv->
id, new_node);
212pe__output_node_weights(
const pcmk_resource_t *rsc,
const char *comment,
218 GList *list = g_list_sort(g_hash_table_get_values(nodes),
221 for (
const GList *gIter = list; gIter != NULL; gIter = gIter->next) {
224 out->
message(out,
"node-weight", rsc, comment, node->priv->name,
242pe__log_node_weights(
const char *file,
const char *function,
int line,
252 g_hash_table_iter_init(&iter, nodes);
253 while (g_hash_table_iter_next(&iter, NULL, (
void **) &node)) {
255 qb_log_from_external_source(function, file,
256 "%s: %s allocation score on %s: %s",
259 pcmk__node_name(node),
262 qb_log_from_external_source(function, file,
"%s: %s = %s",
264 comment, pcmk__node_name(node),
287 const char *comment, GHashTable *nodes,
300 pe__log_node_weights(file, function, line, rsc, comment, nodes);
302 pe__output_node_weights(rsc, comment, nodes,
scheduler);
311 gIter != NULL; gIter = gIter->next) {
337 if (a == NULL && b == NULL) {
375 gIter != NULL; gIter = gIter->next) {
379 resource_node_score(child_rsc, node, score, tag);
387 (gpointer) match->
priv->
id, match);
391 "Enabling %s preference (%s) for %s on %s (now %s)",
393 pcmk__node_name(node),
402 resource_node_score(rsc, node, score, tag);
407 for (; gIter != NULL; gIter = gIter->next) {
410 resource_node_score(rsc, node_iter, score, tag);
418 while (g_hash_table_iter_next(&iter, NULL, (
void **)&node_iter)) {
419 resource_node_score(rsc, node_iter, score, tag);
438 const char *value = g_hash_table_lookup(rsc->
priv->
meta,
451 "' is deprecated and will be removed in a "
452 "future release (just leave it unset)");
459 "because '%s' is not valid", rsc->
id, value);
472 "because '%s' only makes sense for promotable "
473 "clones", rsc->
id, value);
493 if ((first == NULL) || (then == NULL)) {
497 crm_trace(
"Creating action wrappers for ordering: %s then %s",
505 for (; gIter != NULL; gIter = gIter->next) {
508 if ((after->
action == then)
518 list = g_list_prepend(list, wrapper);
525 list = g_list_prepend(list, wrapper);
536 g_hash_table_destroy(ticket->
state);
547 if (pcmk__str_empty(ticket_id)) {
558 if (ticket == NULL) {
561 if (ticket == NULL) {
567 crm_trace(
"Creating ticket entry for %s", ticket_id);
569 ticket->
id = strdup(ticket_id);
586 return pcmk__xe_id(rsc->
priv->
xml);
595 gIter != NULL; gIter = gIter->next) {
606 lpc != NULL; lpc = lpc->next) {
620 gIter != NULL; gIter = gIter->next) {
635 }
else if ((rsc != NULL)
655 while (g_hash_table_iter_next(&iter, NULL, (
void **)&node)) {
656 if(node->details->online && node->details->unclean == FALSE && node->details->shutdown == FALSE) {
700 GHashTable *hash,
const char *always_first,
705 CRM_CHECK((set_name != NULL) && (rule_input != NULL) && (hash != NULL)
712 if (xml_obj == NULL) {
730 const char *target_role = NULL;
733 target_role = g_hash_table_lookup(rsc->
priv->
meta,
791 GList *retval = NULL;
793 for (GList *gIter = rscs; gIter; gIter = gIter->next) {
803 retval = g_list_prepend(retval, rsc);
820 nodes = g_list_prepend(nodes, strdup(
"*"));
828 nodes = g_list_prepend(nodes, strdup(s));
846 GList *resources = NULL;
849 resources = g_list_prepend(resources, strdup(
"*"));
861 if (strstr(s,
":") != NULL) {
862 resources = g_list_prepend(resources, strdup(rsc->
id));
882 const char *rsc_id = rsc->
id;
885 if (pcmk__is_clone(
parent)) {
893 const char *value = NULL;
909 if (!
parse_op_key(pcmk__xe_history_key(xml_op), &op_id, NULL, NULL)) {
@ pcmk__ar_none
No relation (compare with equality rather than bit set)
@ pcmk__ar_ordered
Actions are ordered (optionally, if no other flags are set)
gboolean parse_op_key(const char *key, char **rsc_id, char **op_type, guint *interval_ms)
const char * pcmk__node_attr(const pcmk_node_t *node, const char *name, const char *target, enum pcmk__rsc_node node_type)
#define pcmk__assert_alloc(nmemb, size)
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
long long crm_time_get_seconds_since_epoch(const crm_time_t *dt)
void crm_time_free(crm_time_t *dt)
bool crm_time_is_defined(const crm_time_t *t)
Check whether a time object has been initialized yet.
crm_time_t * crm_time_new_undefined(void)
Allocate memory for an uninitialized time object.
struct crm_time_s crm_time_t
#define crm_info(fmt, args...)
#define crm_notice(fmt, args...)
#define CRM_CHECK(expr, failure_action)
#define crm_trace(fmt, args...)
#define pcmk__config_warn(fmt...)
#define pcmk__config_err(fmt...)
#define pcmk__if_tracing(if_action, else_action)
pcmk_scheduler_t * scheduler
#define PCMK__NODE_ATTR_SHUTDOWN
void pcmk__free_node_copy(void *data)
void pcmk_unpack_nvpair_blocks(const xmlNode *xml, const char *element_name, const char *first_id, const pcmk_rule_input_t *rule_input, GHashTable *values, crm_time_t *next_change)
Unpack nvpair blocks contained by an XML element into a hash table, evaluated for any rules.
#define PCMK_META_TARGET_ROLE
#define PCMK_VALUE_DEFAULT
#define PCMK__META_ON_NODE
pcmk__action_result_t result
const pcmk_resource_t * pe__const_top_resource(const pcmk_resource_t *rsc, bool include_bundle)
GList * pe__rscs_with_tag(pcmk_scheduler_t *scheduler, const char *tag_name)
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)
GList * pe__unames_with_tag(pcmk_scheduler_t *scheduler, const char *tag_name)
const char * pe__clone_child_id(const pcmk_resource_t *rsc)
bool pe_can_fence(const pcmk_scheduler_t *scheduler, const pcmk_node_t *node)
pcmk_node_t * pe__copy_node(const pcmk_node_t *this_node)
GHashTable * pe__node_list2table(const GList *list)
gboolean get_target_role(const pcmk_resource_t *rsc, enum rsc_role_e *role)
GList * pe__build_rsc_list(pcmk_scheduler_t *scheduler, const char *s)
void destroy_ticket(gpointer data)
bool pe__rsc_running_on_any(pcmk_resource_t *rsc, GList *node_list)
void pe__set_resource_flags_recursive(pcmk_resource_t *rsc, uint64_t flags)
void resource_location(pcmk_resource_t *rsc, const pcmk_node_t *node, int score, const char *tag, pcmk_scheduler_t *scheduler)
gint pe__cmp_rsc_priority(gconstpointer a, gconstpointer b)
gboolean order_actions(pcmk_action_t *first, pcmk_action_t *then, uint32_t flags)
void pe__unpack_dataset_nvpairs(const xmlNode *xml_obj, const char *set_name, const pcmk_rule_input_t *rule_input, GHashTable *hash, const char *always_first, pcmk_scheduler_t *scheduler)
bool pe__rsc_running_on_only(const pcmk_resource_t *rsc, const pcmk_node_t *node)
pcmk__ticket_t * ticket_new(const char *ticket_id, pcmk_scheduler_t *scheduler)
GList * pe__filter_rsc_list(GList *rscs, GList *filter)
gboolean ghash_free_str_str(gpointer key, gpointer value, gpointer user_data)
gint pe__cmp_node_name(gconstpointer a, gconstpointer b)
void pe__clear_resource_flags_recursive(pcmk_resource_t *rsc, uint64_t flags)
xmlNode * pe__failed_probe_for_rsc(const pcmk_resource_t *rsc, const char *name)
GList * pe__build_node_name_list(pcmk_scheduler_t *scheduler, const char *s)
void pe__clear_resource_flags_on_all(pcmk_scheduler_t *scheduler, uint64_t flag)
void pe__show_node_scores_as(const char *file, const char *function, int line, bool to_log, const pcmk_resource_t *rsc, const char *comment, GHashTable *nodes, pcmk_scheduler_t *scheduler)
bool pe__resource_is_disabled(const pcmk_resource_t *rsc)
void trigger_unfencing(pcmk_resource_t *rsc, pcmk_node_t *node, const char *reason, pcmk_action_t *dependency, pcmk_scheduler_t *scheduler)
bool pcmk__rsc_filtered_by_node(pcmk_resource_t *rsc, GList *only_node)
bool pe__shutdown_requested(const pcmk_node_t *node)
const char * rsc_printable_id(const pcmk_resource_t *rsc)
bool pcmk_xe_mask_probe_failure(const xmlNode *xml_op)
Check whether an action history entry represents a maskable probe.
@ pcmk_rsc_match_basename
Match clone instances (even unique) by base name as well as exact ID.
@ pcmk_rsc_match_history
Also match clone instance ID from resource history.
@ pcmk__rsc_exclusive_probes
#define pcmk__set_rsc_flags(resource, flags_to_set)
#define pcmk__clear_rsc_flags(resource, flags_to_clear)
#define pcmk__assert(expr)
#define PCMK_ROLE_STARTED
enum rsc_role_e pcmk_parse_role(const char *role)
Parse a resource role from a string role specification.
@ pcmk_role_started
Started.
@ pcmk_role_unknown
Resource role is unknown.
@ pcmk_role_unpromoted
Unpromoted.
@ pcmk_role_stopped
Stopped.
@ pcmk_no_quorum_ignore
Act as if partition still holds quorum.
pcmk_node_t * pcmk_find_node(const pcmk_scheduler_t *scheduler, const char *node_name)
Find a node by name in scheduler data.
#define pcmk__sched_err(scheduler, fmt...)
#define pcmk__rsc_trace(rsc, fmt, args...)
void pcmk__update_recheck_time(time_t recheck, pcmk_scheduler_t *scheduler, const char *reason)
@ pcmk__sched_enable_unfencing
@ pcmk__sched_fencing_enabled
@ pcmk__sched_fence_remote_no_quorum
@ pcmk__sched_have_fencing
const char * pcmk_readable_score(int score)
Return a displayable static string for a score value.
#define PCMK_SCORE_INFINITY
Integer score to use to represent "infinity".
int pcmk__add_scores(int score1, int score2)
pcmk_resource_t * pe_find_resource_with_flags(GList *rsc_list, const char *id, enum pe_find flags)
int pcmk__numeric_strcasecmp(const char *s1, const char *s2)
gboolean pcmk__str_in_list(const gchar *s, const GList *lst, uint32_t flags)
GHashTable * pcmk__strkey_table(GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func)
#define pcmk__str_copy(str)
enum pcmk__probe_mode probe_mode
This structure contains everything that makes up a single output formatter.
int(* message)(pcmk__output_t *out, const char *message_id,...)
pcmk_node_t * assigned_node
pcmk_scheduler_t * scheduler
pcmk_resource_t * launcher
const pcmk__rsc_methods_t * fns
GHashTable * allowed_nodes
pcmk__resource_private_t * priv
bool(* active)(const pcmk_resource_t *rsc, bool all)
GHashTable * ticket_constraints
pcmk__scheduler_private_t * priv
enum pe_quorum_policy no_quorum_policy
pcmk__node_private_t * priv
struct pcmk__node_details * details
struct pcmk__node_assignment * assign
Wrappers for and extensions to libxml2.
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
xmlNode * pcmk__xe_first_child(const xmlNode *parent, const char *node_name, const char *attr_n, const char *attr_v)
xmlNode * pcmk__xe_next(const xmlNode *node, const char *element_name)
#define PCMK_XE_META_ATTRIBUTES