Просмотр исходного кода

Merge trunk revision 2651:
r2651 | asalkeld | 2010-02-01 23:24:01 -0700 (Mon, 01 Feb 2010) | 3 lines

totemsrp: fix transitional configuration changes with long token timeouts



git-svn-id: http://svn.fedorahosted.org/svn/corosync/branches/flatiron@2698 fd59a12c-fef9-0310-b244-a6a79926bd2f

Steven Dake 16 лет назад
Родитель
Сommit
2dd1e2a68e
1 измененных файлов с 42 добавлено и 30 удалено
  1. 42 30
      exec/totemsrp.c

+ 42 - 30
exec/totemsrp.c

@@ -479,8 +479,6 @@ struct totemsrp_instance {
 
 	unsigned int old_ring_state_high_seq_received;
 
-	int ring_saved;
-
 	unsigned int my_last_seq;
 
 	struct timeval tv_old;
@@ -1299,10 +1297,15 @@ static void memb_set_merge (
 	return;
 }
 
-static void memb_set_and (
-        struct srp_addr *set1, int set1_entries,
-        struct srp_addr *set2, int set2_entries,
-        struct srp_addr *and, int *and_entries)
+static void memb_set_and_with_ring_id (
+	struct srp_addr *set1,
+	struct memb_ring_id *set1_ring_ids,
+	int set1_entries,
+	struct srp_addr *set2,
+	int set2_entries,
+	struct memb_ring_id *old_ring_id,
+	struct srp_addr *and,
+	int *and_entries)
 {
 	int i;
 	int j;
@@ -1313,7 +1316,9 @@ static void memb_set_and (
 	for (i = 0; i < set2_entries; i++) {
 		for (j = 0; j < set1_entries; j++) {
 			if (srp_addr_equal (&set1[j], &set2[i])) {
-				found = 1;
+				if (memcmp (&set1_ring_ids[j], old_ring_id, sizeof (struct memb_ring_id)) == 0) {
+					found = 1;
+				}
 				break;
 			}
 		}
@@ -1393,20 +1398,6 @@ static void old_ring_state_save (struct totemsrp_instance *instance)
 	}
 }
 
-static void ring_save (struct totemsrp_instance *instance)
-{
-	if (instance->ring_saved == 0) {
-		instance->ring_saved = 1;
-		memcpy (&instance->my_old_ring_id, &instance->my_ring_id,
-			sizeof (struct memb_ring_id));
-	}
-}
-
-static void ring_reset (struct totemsrp_instance *instance)
-{
-	instance->ring_saved = 0;
-}
-
 static void ring_state_restore (struct totemsrp_instance *instance)
 {
 	if (instance->old_ring_state_saved) {
@@ -1694,7 +1685,7 @@ static void memb_state_operational_enter (struct totemsrp_instance *instance)
 	memb_consensus_reset (instance);
 
 	old_ring_state_reset (instance);
-	ring_reset (instance);
+
 	deliver_messages_from_recovery_to_regular (instance);
 
 	log_printf (instance->totemsrp_log_level_debug,
@@ -1794,6 +1785,14 @@ static void memb_state_operational_enter (struct totemsrp_instance *instance)
 
 	reset_pause_timeout (instance);
 
+	/*
+	 * Save ring id information from this configuration to determine
+	 * which processors are transitioning from old regular configuration
+	 * in to new regular configuration on the next configuration change
+	 */
+	memcpy (&instance->my_old_ring_id, &instance->my_ring_id,
+		sizeof (struct memb_ring_id));
+
 	return;
 }
 
@@ -1864,8 +1863,6 @@ static void target_set_completed (
 static void memb_state_commit_enter (
 	struct totemsrp_instance *instance)
 {
-	ring_save (instance);
-
 	old_ring_state_save (instance);
 
 	memb_state_commit_token_update (instance);
@@ -1915,6 +1912,7 @@ static void memb_state_recovery_enter (
 	unsigned int messages_originated = 0;
 	const struct srp_addr *addr;
 	struct memb_commit_token_memb_entry *memb_list;
+	struct memb_ring_id my_new_memb_ring_id_list[PROCESSOR_COUNT_MAX];
 
 	addr = (const struct srp_addr *)commit_token->end_of_commit_token;
 	memb_list = (struct memb_commit_token_memb_entry *)(addr + commit_token->addr_entries);
@@ -1936,17 +1934,32 @@ static void memb_state_recovery_enter (
 	/*
 	 * Build regular configuration
 	 */
- 	totemrrp_processor_count_set (
+	totemrrp_processor_count_set (
 		instance->totemrrp_context,
 		commit_token->addr_entries);
 
 	/*
 	 * Build transitional configuration
 	 */
-	memb_set_and (instance->my_new_memb_list, instance->my_new_memb_entries,
-		instance->my_memb_list, instance->my_memb_entries,
-		instance->my_trans_memb_list, &instance->my_trans_memb_entries);
-
+	for (i = 0; i < instance->my_new_memb_entries; i++) {
+		memcpy (&my_new_memb_ring_id_list[i],
+			&memb_list[i].ring_id,
+			sizeof (struct memb_ring_id));
+	}
+	memb_set_and_with_ring_id (
+		instance->my_new_memb_list,
+		my_new_memb_ring_id_list,
+		instance->my_new_memb_entries,
+		instance->my_memb_list,
+		instance->my_memb_entries,
+		&instance->my_old_ring_id,
+		instance->my_trans_memb_list,
+		&instance->my_trans_memb_entries);
+
+	for (i = 0; i < instance->my_trans_memb_entries; i++) {
+		log_printf (instance->totemsrp_log_level_debug,
+			"TRANS [%d] member %s:\n", i, totemip_print (&instance->my_trans_memb_list[i].addr[0]));
+	}
 	for (i = 0; i < instance->my_new_memb_entries; i++) {
 		log_printf (instance->totemsrp_log_level_debug,
 			"position [%d] member %s:\n", i, totemip_print (&addr[i].addr[0]));
@@ -2684,7 +2697,6 @@ static void memb_state_commit_token_update (
 
 	memcpy (&memb_list[instance->commit_token->memb_index].ring_id,
 		&instance->my_old_ring_id, sizeof (struct memb_ring_id));
-	assert (!totemip_zero_check(&instance->my_old_ring_id.rep));
 
 	memb_list[instance->commit_token->memb_index].aru = instance->old_ring_state_aru;
 	/*