45 if (consider_guest && pcmk__is_guest_or_bundle_node(node)) {
69 GHashTable *new_table = NULL;
77 g_hash_table_iter_init(&iter, nodes);
78 while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) {
81 g_hash_table_insert(new_table, (gpointer) new_node->
priv->
id,
96 destroy_node_tables(gpointer
data)
98 g_hash_table_destroy((GHashTable *)
data);
125 g_hash_table_insert(*copy, rsc->
id,
129 iter != NULL; iter = iter->next) {
161 iter != NULL; iter = iter->next) {
181 for (
const GList *iter = list; iter != NULL; iter = iter->next) {
209 compare_nodes(gconstpointer a, gconstpointer b, gpointer
data)
236 if (node1_score > node2_score) {
237 crm_trace(
"%s before %s (score %d > %d)",
238 pcmk__node_name(
node1), pcmk__node_name(
node2),
239 node1_score, node2_score);
243 if (node1_score < node2_score) {
245 pcmk__node_name(
node1), pcmk__node_name(
node2),
246 node1_score, node2_score);
262 crm_trace(
"%s before %s (greater capacity by %d attributes)",
263 pcmk__node_name(
node1), pcmk__node_name(
node2),
267 crm_trace(
"%s after %s (lower capacity by %d attributes)",
276 crm_trace(
"%s before %s (%d resources < %d)",
277 pcmk__node_name(
node1), pcmk__node_name(
node2),
282 crm_trace(
"%s after %s (%d resources > %d)",
283 pcmk__node_name(
node1), pcmk__node_name(
node2),
290 if (preferred != NULL) {
291 if (pcmk__same_node(preferred,
node1)) {
292 crm_trace(
"%s before %s (preferred node)",
293 pcmk__node_name(
node1), pcmk__node_name(
node2));
295 }
else if (pcmk__same_node(preferred,
node2)) {
296 crm_trace(
"%s after %s (not preferred node)",
297 pcmk__node_name(
node1), pcmk__node_name(
node2));
307 pcmk__node_name(
node1), pcmk__node_name(
node2));
311 pcmk__node_name(
node1), pcmk__node_name(
node2));
331 return g_list_sort_with_data(nodes, compare_nodes, active_node);
352 g_hash_table_iter_init(&iter, nodes);
353 while (g_hash_table_iter_next(&iter, NULL, (
void **) &node)) {
372 const char *strategy_str =
380 crm_info(
"Applying node health strategy '%s'", strategy_str);
387 for (GList *iter =
scheduler->
nodes; iter != NULL; iter = iter->next) {
395 crm_info(
"Overall system health of %s is %d",
396 pcmk__node_name(node), health);
402 bool constrain =
true;
415 rsc->
id, pcmk__node_name(node));
434 GHashTable *allowed_nodes = NULL;
436 if ((rsc == NULL) || (node == NULL)) {
445 return g_hash_table_lookup(allowed_nodes, node->
priv->
id);
pcmk_node_t * pe__copy_node(const pcmk_node_t *this_node)
int pcmk__health_score(const char *option, const pcmk_scheduler_t *scheduler)
#define pcmk__rsc_trace(rsc, fmt, args...)
void pcmk__copy_node_tables(const pcmk_resource_t *rsc, GHashTable **copy)
pcmk__scheduler_private_t * priv
pcmk_node_t *(* location)(const pcmk_resource_t *rsc, GList **list, uint32_t target)
GList * pcmk__sort_nodes(GList *nodes, pcmk_node_t *active_node)
const pcmk__rsc_methods_t * fns
enum pcmk__health_strategy pcmk__parse_health_strategy(const char *value)
const char * pcmk__cluster_option(GHashTable *options, const char *name)
void pcmk__free_node_copy(void *data)
bool pcmk__any_node_available(GHashTable *nodes)
#define PCMK_META_ALLOW_UNHEALTHY_NODES
pcmk__node_private_t * priv
#define PCMK_VALUE_MINIMAL
#define crm_trace(fmt, args...)
GList * pcmk__copy_node_list(const GList *list, bool reset)
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
pcmk__resource_private_t * priv
Wrappers for and extensions to libxml2.
pcmk_scheduler_t * scheduler
void pcmk__apply_node_health(pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL int pcmk__compare_node_capacities(const pcmk_node_t *node1, const pcmk_node_t *node2)
GHashTable * allowed_nodes
#define pcmk__assert(expr)
#define PCMK_OPT_NODE_HEALTH_STRATEGY
G_GNUC_INTERNAL pcmk__location_t * pcmk__new_location(const char *id, pcmk_resource_t *rsc, int node_score, const char *discover_mode, pcmk_node_t *foo_node)
GHashTable * pcmk__copy_node_table(GHashTable *nodes)
GHashTable * pcmk__strkey_table(GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func)
pcmk__action_result_t result
#define PCMK_OPT_NODE_HEALTH_BASE
pcmk_scheduler_t * scheduler
void pcmk__restore_node_tables(pcmk_resource_t *rsc, GHashTable *backup)
pcmk_resource_t * launcher
pcmk_node_t * pcmk__top_allowed_node(const pcmk_resource_t *rsc, const pcmk_node_t *node)
const char * placement_strategy
gboolean crm_is_true(const char *s)
#define PCMK_VALUE_BALANCED
bool pcmk__node_available(const pcmk_node_t *node, bool consider_score, bool consider_guest)
int pe__sum_node_health_scores(const pcmk_node_t *node, int base_health)
struct pcmk__node_details * details
#define crm_info(fmt, args...)
#define PCMK_SCORE_INFINITY
Integer score to use to represent "infinity".
struct pcmk__node_assignment * assign