Send Linux-ha-cvs mailing list submissions to linux-ha-cvs@lists.linux-ha.org
To subscribe or unsubscribe via the World Wide Web, visit http://lists.community.tummy.com/mailman/listinfo/linux-ha-cvs or, via email, send a message with subject or body 'help' to [EMAIL PROTECTED] You can reach the person managing the list at [EMAIL PROTECTED] When replying, please edit your Subject line so it is more specific than "Re: Contents of Linux-ha-cvs digest..." Today's Topics: 1. Linux-HA CVS: crm by andrew from (linux-ha-cvs@lists.linux-ha.org) ---------------------------------------------------------------------- Message: 1 Date: Wed, 5 Jul 2006 08:20:03 -0600 (MDT) From: linux-ha-cvs@lists.linux-ha.org Subject: [Linux-ha-cvs] Linux-HA CVS: crm by andrew from To: [EMAIL PROTECTED] Message-ID: <[EMAIL PROTECTED]> linux-ha CVS committal Author : andrew Host : Project : linux-ha Module : crm Dir : linux-ha/crm/pengine Modified Files: clone.c native.c utils.c utils.h Log Message: OSDL #1360: Clones enforce resource_stickiness == INFINITY Move clone instances to higher preferred nodes =================================================================== RCS file: /home/cvs/linux-ha/linux-ha/crm/pengine/clone.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- clone.c 22 Jun 2006 09:14:23 -0000 1.4 +++ clone.c 5 Jul 2006 14:20:02 -0000 1.5 @@ -1,4 +1,4 @@ -/* $Id: clone.c,v 1.4 2006/06/22 09:14:23 andrew Exp $ */ +/* $Id: clone.c,v 1.5 2006/07/05 14:20:02 andrew Exp $ */ /* * Copyright (C) 2004 Andrew Beekhof <[EMAIL PROTECTED]> * @@ -120,19 +120,6 @@ return 0; } -static gboolean -can_run_resources(node_t *node) -{ - if(node->details->online == FALSE - || node->details->unclean - || node->details->standby) { - crm_debug_2("%s: online=%d, unclean=%d, standby=%d", - node->details->uname, node->details->online, - node->details->unclean, node->details->standby); - return FALSE; - } - return TRUE; -} static GListPtr next_color(GListPtr head, GListPtr iter, int max) @@ -175,6 +162,7 @@ GListPtr color_ptr = NULL; GListPtr child_colors = NULL; int local_node_max = 0; + int reverse_pointer = 0; clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); @@ -218,8 +206,12 @@ a_node->details->uname, rsc->id); new_color = create_color(data_set, NULL, NULL); + new_color->local_weight = a_node->weight; new_color->details->candidate_nodes = g_list_append( NULL, node_copy(a_node)); + child_colors = g_list_append(child_colors, new_color); + crm_debug_3("Created color %d for node %s (score = %d): %s", + new_color->id, a_node->details->uname, a_node->weight, rsc->id); slist_iter(child, resource_t, clone_data->child_list, lpc2, node_t *current = NULL; @@ -266,15 +258,16 @@ continue; } + a_node->weight = merge_weights(a_node->weight, child->stickiness); + new_color->local_weight = a_node->weight; + crm_debug_2("Assigning color: %s", child->id); native_assign_color(child, new_color); - ); + native_assign_color(rsc, new_color); - child_colors = g_list_append(child_colors, new_color); ); - while(local_node_max > 1 && clone_data->max_nodes * (local_node_max -1) >= clone_data->clone_max) { @@ -283,6 +276,9 @@ local_node_max); } + + child_colors = g_list_sort(child_colors, sort_color_weight); + /* allocate the rest */ slist_iter(child, resource_t, clone_data->child_list, lpc2, if(child->provisional == FALSE) { @@ -302,6 +298,65 @@ ); clone_data->self->provisional = FALSE; + if(rsc->stickiness >= INFINITY) { + return NULL; + } + + reverse_pointer = g_list_length(child_colors) - 1; + slist_iter(color, color_t, child_colors, lpc, + color_t *replace_color = NULL; + resource_t *replace_rsc = NULL; + + CRM_CHECK(color != NULL, continue); + if(color->details->num_resources != 0) { + crm_debug_4("color %d has %d resources", + color->id, color->details->num_resources); + break; + + } else if(lpc >= reverse_pointer) { + crm_debug_3("lpc %d, reverse lpc %d", lpc, reverse_pointer); + break; + } + + crm_debug_3("Color %d has %d resources, stealing one from...", + color->id, color->details->num_resources); + + do { + crm_debug_3("lpc %d, reverse lpc %d", lpc, reverse_pointer); + if(lpc >= reverse_pointer) { + return NULL; + } + replace_color = g_list_nth_data(child_colors, reverse_pointer); + reverse_pointer--; + + CRM_CHECK(replace_color != NULL, continue); + CRM_CHECK(replace_color->details->num_resources >= 0, continue); + if(replace_color->details->num_resources == 0) { + continue; + } + + CRM_CHECK(replace_color->details->allocated_resources != NULL, continue); + replace_rsc = replace_color->details->allocated_resources->data; + + crm_debug_3("\tColor %d with %d resources (index = %d, rsc = %s)", + replace_color->id, replace_color->details->num_resources, + reverse_pointer+1, replace_rsc?replace_rsc->id:"none"); + + } while(replace_color == NULL + || replace_color->id == 0 + || replace_color->details->num_resources == 0); + + if(replace_rsc->variant == pe_native) { + native_assign_color(replace_rsc, color); + + } else if(replace_rsc->variant == pe_group) { + group_assign_color(replace_rsc, color); + + } else { + crm_err("Bad variant: %d", replace_rsc->variant); + } + ); + return NULL; } @@ -882,7 +937,7 @@ clone_variant_data_t *clone_data = NULL; get_clone_variant_data(clone_data, rsc); - crm_debug_3("Processing actions from %s", rsc->id); + crm_debug_3("Processing location constraint %s for %s", constraint->id, rsc->id); clone_data->self->cmds->rsc_location(clone_data->self, constraint); slist_iter( =================================================================== RCS file: /home/cvs/linux-ha/linux-ha/crm/pengine/native.c,v retrieving revision 1.155 retrieving revision 1.156 diff -u -3 -r1.155 -r1.156 --- native.c 3 Jul 2006 11:47:38 -0000 1.155 +++ native.c 5 Jul 2006 14:20:02 -0000 1.156 @@ -1,4 +1,4 @@ -/* $Id: native.c,v 1.155 2006/07/03 11:47:38 andrew Exp $ */ +/* $Id: native.c,v 1.156 2006/07/05 14:20:02 andrew Exp $ */ /* * Copyright (C) 2004 Andrew Beekhof <[EMAIL PROTECTED]> * @@ -791,14 +791,14 @@ crm_debug_2("RHS of constraint %s is NULL", constraint->id); return; } - print_resource(LOG_DEBUG_3, "before update: ", rsc, TRUE); or_list = node_list_or( rsc->allowed_nodes, constraint->node_list_rh, FALSE); pe_free_shallow(rsc->allowed_nodes); rsc->allowed_nodes = or_list; - - print_resource(LOG_DEBUG_3, "after update: ", rsc, TRUE); + slist_iter(node, node_t, or_list, lpc, + crm_debug_3("%s + %s : %d", rsc->id, node->details->uname, node->weight); + ); } void native_expand(resource_t *rsc, pe_working_set_t *data_set) @@ -981,24 +981,6 @@ { } -static gint sort_color_weight(gconstpointer a, gconstpointer b) -{ - const color_t *color1 = (const color_t*)a; - const color_t *color2 = (const color_t*)b; - - if(a == NULL) { return 1; } - if(b == NULL) { return -1; } - - if(color1->local_weight > color2->local_weight) { - return -1; - } - - if(color1->local_weight < color2->local_weight) { - return 1; - } - - return 0; -} gboolean native_choose_color(resource_t *rsc, color_t *no_color) @@ -1068,18 +1050,32 @@ void native_assign_color(resource_t *rsc, color_t *color) { - color_t *local_color = add_color(rsc, color); - GListPtr intersection = NULL; - GListPtr old_list = NULL; + color_t *local_color = NULL; rsc->provisional = FALSE; + if(rsc->color != NULL) { + /* TODO: check its a clone */ + CRM_CHECK(color->id != rsc->color->id, return); + rsc->color->details->allocated_resources = + g_list_remove(rsc->color->details->allocated_resources, rsc); + (rsc->color->details->num_resources)--; + rsc->candidate_colors = + g_list_remove(rsc->candidate_colors, rsc->color); + crm_free(rsc->color); + rsc->color = NULL; + } + + local_color = add_color(rsc, color); CRM_CHECK(local_color != NULL, return); local_color->details->allocated_resources = g_list_append(local_color->details->allocated_resources,rsc); if(rsc->variant == pe_native) { + GListPtr old_list = NULL; + GListPtr intersection = NULL; + (local_color->details->num_resources)++; rsc->color = copy_color(local_color); crm_debug_3("Created intersection for color %d", =================================================================== RCS file: /home/cvs/linux-ha/linux-ha/crm/pengine/utils.c,v retrieving revision 1.146 retrieving revision 1.147 diff -u -3 -r1.146 -r1.147 --- utils.c 21 Jun 2006 11:06:13 -0000 1.146 +++ utils.c 5 Jul 2006 14:20:02 -0000 1.147 @@ -1,4 +1,4 @@ -/* $Id: utils.c,v 1.146 2006/06/21 11:06:13 andrew Exp $ */ +/* $Id: utils.c,v 1.147 2006/07/05 14:20:02 andrew Exp $ */ /* * Copyright (C) 2004 Andrew Beekhof <[EMAIL PROTECTED]> * @@ -413,6 +413,21 @@ } +gboolean +can_run_resources(const node_t *node) +{ + if(node->details->online == FALSE + || node->details->shutdown + || node->details->unclean + || node->details->standby) { + crm_debug_2("%s: online=%d, unclean=%d, standby=%d", + node->details->uname, node->details->online, + node->details->unclean, node->details->standby); + return FALSE; + } + return TRUE; +} + /* return -1 if 'a' is more preferred * return 1 if 'b' is more preferred */ @@ -430,14 +445,10 @@ node1_weight = node1->weight; node2_weight = node2->weight; - if(node1->details->unclean - || node1->details->standby - || node1->details->shutdown) { + if(can_run_resources(node1) == FALSE) { node1_weight = -INFINITY; } - if(node2->details->unclean - || node2->details->standby - || node2->details->shutdown) { + if(can_run_resources(node2) == FALSE) { node2_weight = -INFINITY; } @@ -478,3 +489,46 @@ crm_debug_4("%s = %s", node1->details->uname, node2->details->uname); return 0; } + +gint sort_color_weight(gconstpointer a, gconstpointer b) +{ + const color_t *color1 = (const color_t*)a; + const color_t *color2 = (const color_t*)b; + + int color1_weight = 0; + int color2_weight = 0; + + if(a == NULL) { return 1; } + if(b == NULL) { return -1; } + + color1_weight = color1->local_weight; + color2_weight = color2->local_weight; + + if(color1_weight > color2_weight) { + crm_debug_3("%d (%d) > %d (%d) : weight", + color1->id, color1_weight, + color2->id, color2_weight); + return -1; + } + + if(color1_weight < color2_weight) { + crm_debug_3("%d (%d) < %d (%d) : weight", + color1->id, color1_weight, + color2->id, color2_weight); + return 1; + } + + crm_debug_3("%d (%d) == %d (%d) : weight", + color1->id, color1_weight, + color2->id, color2_weight); + + if(color1->id < color2->id) { + return -1; + + } else if(color1->id > color2->id) { + return 1; + } + CRM_CHECK(color1->id != color2->id, + crm_err("Color %d duplicated in list", color1->id)); + return 0; +} =================================================================== RCS file: /home/cvs/linux-ha/linux-ha/crm/pengine/utils.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- utils.h 21 Jun 2006 11:06:13 -0000 1.2 +++ utils.h 5 Jul 2006 14:20:02 -0000 1.3 @@ -1,4 +1,4 @@ -/* $Id: utils.h,v 1.2 2006/06/21 11:06:13 andrew Exp $ */ +/* $Id: utils.h,v 1.3 2006/07/05 14:20:02 andrew Exp $ */ /* * Copyright (C) 2004 Andrew Beekhof <[EMAIL PROTECTED]> * @@ -72,5 +72,8 @@ extern gint sort_cons_strength(gconstpointer a, gconstpointer b); extern gint sort_node_weight(gconstpointer a, gconstpointer b); +extern gint sort_color_weight(gconstpointer a, gconstpointer b); + +extern gboolean can_run_resources(const node_t *node); #endif ------------------------------ _______________________________________________ Linux-ha-cvs mailing list Linux-ha-cvs@lists.linux-ha.org http://lists.community.tummy.com/mailman/listinfo/linux-ha-cvs End of Linux-ha-cvs Digest, Vol 32, Issue 17 ********************************************