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
********************************************

Reply via email to