Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 58cebef081c94cb5f88b9fe2fbddfdc8 > files > 51

openais-0.80.6-28.el5_6.1.src.rpm

Index: exec/totemsrp.c
===================================================================
--- exec/totemsrp.c	(revision 2164)
+++ exec/totemsrp.c	(revision 2165)
@@ -477,8 +477,6 @@
 
 	unsigned int set_aru;
 
-	int old_ring_state_saved;
-
 	int old_ring_state_aru;
 
 	unsigned int old_ring_state_high_seq_received;
@@ -1310,16 +1308,13 @@
  */
 static void old_ring_state_save (struct totemsrp_instance *instance)
 {
-	if (instance->old_ring_state_saved == 0) {
-		instance->old_ring_state_saved = 1;
-		memcpy (&instance->my_old_ring_id, &instance->my_ring_id,
-			sizeof (struct memb_ring_id));
-		instance->old_ring_state_aru = instance->my_aru;
-		instance->old_ring_state_high_seq_received = instance->my_high_seq_received;
-		log_printf (instance->totemsrp_log_level_notice,
-			"Saving state aru %x high seq received %x\n",
-			instance->my_aru, instance->my_high_seq_received);
-	}
+	memcpy (&instance->my_old_ring_id, &instance->my_ring_id,
+		sizeof (struct memb_ring_id));
+	instance->old_ring_state_aru = instance->my_aru;
+	instance->old_ring_state_high_seq_received = instance->my_high_seq_received;
+	log_printf (instance->totemsrp_log_level_debug,
+		"Saving state aru %x high seq received %x\n",
+		instance->my_aru, instance->my_high_seq_received);
 }
 
 static void ring_save (struct totemsrp_instance *instance)
@@ -1336,25 +1331,19 @@
 	instance->ring_saved = 0;
 }
 
-static void ring_state_restore (struct totemsrp_instance *instance)
+static void old_ring_state_restore (struct totemsrp_instance *instance)
 {
-	if (instance->old_ring_state_saved) {
-		memcpy (&instance->my_ring_id, &instance->my_old_ring_id,
-			sizeof (struct memb_ring_id));
-
-		instance->my_aru = instance->old_ring_state_aru;
-		instance->my_high_seq_received = instance->old_ring_state_high_seq_received;
-		log_printf (instance->totemsrp_log_level_notice,
-			"Restoring instance->my_aru %x my high seq received %x\n",
-			instance->my_aru, instance->my_high_seq_received);
-	}
+	instance->my_aru = instance->old_ring_state_aru;
+	instance->my_high_seq_received = instance->old_ring_state_high_seq_received;
+	log_printf (instance->totemsrp_log_level_notice,
+		"Restoring instance->my_aru %x my high seq received %x\n",
+		instance->my_aru, instance->my_high_seq_received);
 }
 
 static void old_ring_state_reset (struct totemsrp_instance *instance)
 {
 	log_printf (instance->totemsrp_log_level_debug,
 		"Resetting old ring state\n");
-	instance->old_ring_state_saved = 0;
 }
 
 static void reset_token_timeout (struct totemsrp_instance *instance) {
@@ -1434,6 +1423,12 @@
 
 static void memb_merge_detect_transmit (struct totemsrp_instance *instance);
 
+static void memb_recovery_state_token_loss (struct totemsrp_instance *instance)
+{
+	old_ring_state_restore (instance);
+	memb_state_gather_enter (instance, 5);
+}
+
 /*
  * Timers used for various states of the membership algorithm
  */
@@ -1465,8 +1460,7 @@
 		case MEMB_STATE_RECOVERY:
 			log_printf (instance->totemsrp_log_level_notice,
 				"The token was lost in the RECOVERY state.\n");
-			ring_state_restore (instance);
-			memb_state_gather_enter (instance, 5);
+			memb_recovery_state_token_loss (instance);
 			break;
 	}
 }
@@ -2309,17 +2303,7 @@
 			break;
 		}
 		message_item = (struct message_item *)queue_item_get (mcast_queue);
-		/* preincrement required by algo */
-		if (instance->old_ring_state_saved &&
-			(instance->memb_state == MEMB_STATE_GATHER ||
-			instance->memb_state == MEMB_STATE_COMMIT)) {
 
-			log_printf (instance->totemsrp_log_level_debug,
-				"not multicasting at seqno is %d\n",
-			token->seq);
-			return (0);
-		}
-
 		message_item->mcast->seq = ++token->seq;
 		message_item->mcast->this_seqno = instance->global_seqno++;
 
@@ -4130,9 +4114,8 @@
 
 				memb_join->ring_seq >= instance->my_ring_id.seq) {
 
-				ring_state_restore (instance);
-
 				memb_join_process (instance, memb_join);
+				memb_recovery_state_token_loss (instance);
 				memb_state_gather_enter (instance, 14);
 			}
 			break;