File pacemaker-ticket-standby.diff of Package pacemaker

commit de850c422b50d82d09ce820d98d057fae3ea18c9
Author: Gao,Yan <ygao@suse.com>
Date:   Fri Mar 23 12:01:13 2012 +0800

    High: PE: Support to make tickets standby for relinquishing tickets gracefully

Index: pacemaker/pengine/clone.c
===================================================================
--- pacemaker.orig/pengine/clone.c
+++ pacemaker/pengine/clone.c
@@ -522,7 +522,7 @@ clone_color(resource_t * rsc, node_t * p
     for (; gIter != NULL; gIter = gIter->next) {
         rsc_ticket_t *rsc_ticket = (rsc_ticket_t *) gIter->data;
 
-        if (rsc_ticket->ticket->granted == FALSE) {
+        if (rsc_ticket->ticket->granted == FALSE || rsc_ticket->ticket->standby) {
             rsc_ticket_constraint(rsc, rsc_ticket, data_set);
         }
     }
Index: pacemaker/pengine/group.c
===================================================================
--- pacemaker.orig/pengine/group.c
+++ pacemaker/pengine/group.c
@@ -68,7 +68,7 @@ group_color(resource_t * rsc, node_t * p
     for (; gIter != NULL; gIter = gIter->next) {
         rsc_ticket_t *rsc_ticket = (rsc_ticket_t *) gIter->data;
 
-        if (rsc_ticket->ticket->granted == FALSE) {
+        if (rsc_ticket->ticket->granted == FALSE || rsc_ticket->ticket->standby) {
             rsc_ticket_constraint(rsc, rsc_ticket, data_set);
         }
     }
Index: pacemaker/pengine/master.c
===================================================================
--- pacemaker.orig/pengine/master.c
+++ pacemaker/pengine/master.c
@@ -353,7 +353,8 @@ master_promotion_order(resource_t * rsc,
     for (; gIter != NULL; gIter = gIter->next) {
         rsc_ticket_t *rsc_ticket = (rsc_ticket_t *) gIter->data;
 
-        if (rsc_ticket->role_lh == RSC_ROLE_MASTER && rsc_ticket->ticket->granted == FALSE) {
+        if (rsc_ticket->role_lh == RSC_ROLE_MASTER 
+            && (rsc_ticket->ticket->granted == FALSE || rsc_ticket->ticket->standby)) {
             resource_location(rsc, NULL, -INFINITY, "__stateful_without_ticket__", data_set);
         }
     }
Index: pacemaker/pengine/native.c
===================================================================
--- pacemaker.orig/pengine/native.c
+++ pacemaker/pengine/native.c
@@ -494,7 +494,7 @@ native_color(resource_t * rsc, node_t *
     for (gIter = rsc->rsc_tickets; gIter != NULL; gIter = gIter->next) {
         rsc_ticket_t *rsc_ticket = (rsc_ticket_t *) gIter->data;
 
-        if (rsc_ticket->ticket->granted == FALSE) {
+        if (rsc_ticket->ticket->granted == FALSE || rsc_ticket->ticket->standby) {
             rsc_ticket_constraint(rsc, rsc_ticket, data_set);
         }
     }
@@ -1401,7 +1401,7 @@ rsc_ticket_constraint(resource_t * rsc_l
         return;
     }
 
-    if (rsc_ticket->ticket->granted == TRUE) {
+    if (rsc_ticket->ticket->granted && rsc_ticket->ticket->standby == FALSE) {
         return;
     }
 
@@ -1421,7 +1421,7 @@ rsc_ticket_constraint(resource_t * rsc_l
     crm_debug_2("%s: Processing ticket dependency on %s (%s, %s)",
                 rsc_lh->id, rsc_ticket->ticket->id, rsc_ticket->id, role2text(rsc_ticket->role_lh));
 
-    if (g_list_length(rsc_lh->running_on) > 0) {
+    if (rsc_ticket->ticket->granted == FALSE && g_list_length(rsc_lh->running_on) > 0) {
         GListPtr gIter = NULL;
 
         switch (rsc_ticket->loss_policy) {
@@ -1461,11 +1461,17 @@ rsc_ticket_constraint(resource_t * rsc_l
                 break;
         }
 
-    } else {
+    } else if (rsc_ticket->ticket->granted == FALSE){
 
         if (rsc_ticket->role_lh != RSC_ROLE_MASTER || rsc_ticket->loss_policy == loss_ticket_stop) {
             resource_location(rsc_lh, NULL, -INFINITY, "__no_ticket__", data_set);
         }
+
+    } else if (rsc_ticket->ticket->standby) {
+
+        if (rsc_ticket->role_lh != RSC_ROLE_MASTER || rsc_ticket->loss_policy == loss_ticket_stop) {
+            resource_location(rsc_lh, NULL, -INFINITY, "__ticket_standby__", data_set);
+        }
     }
 }
 
openSUSE Build Service is sponsored by