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

Merge trunk revision 2984:
r2984 | sdake | 2010-07-03 14:54:22 -0700 (Sat, 03 Jul 2010) | 2 lines

Fix fail list fault that occurs in very rare circumstances.



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

Steven Dake 15 лет назад
Родитель
Сommit
1ef50c9ebd
1 измененных файлов с 44 добавлено и 17 удалено
  1. 44 17
      exec/totemsrp.c

+ 44 - 17
exec/totemsrp.c

@@ -3904,12 +3904,15 @@ static int message_handler_memb_merge_detect (
 	return (0);
 	return (0);
 }
 }
 
 
-static int memb_join_process (
+static void memb_join_process (
 	struct totemsrp_instance *instance,
 	struct totemsrp_instance *instance,
 	const struct memb_join *memb_join)
 	const struct memb_join *memb_join)
 {
 {
 	struct srp_addr *proc_list;
 	struct srp_addr *proc_list;
 	struct srp_addr *failed_list;
 	struct srp_addr *failed_list;
+	int gather_entered = 0;
+	int fail_minus_memb_entries = 0;
+	struct srp_addr fail_minus_memb[PROCESSOR_COUNT_MAX];
 
 
 	proc_list = (struct srp_addr *)memb_join->end_of_memb_join;
 	proc_list = (struct srp_addr *)memb_join->end_of_memb_join;
 	failed_list = proc_list + memb_join->proc_list_entries;
 	failed_list = proc_list + memb_join->proc_list_entries;
@@ -3919,7 +3922,8 @@ static int memb_join_process (
 	memb_set_print ("faillist", failed_list, memb_join->failed_list_entries);
 	memb_set_print ("faillist", failed_list, memb_join->failed_list_entries);
 	memb_set_print ("my_proclist", instance->my_proc_list, instance->my_proc_list_entries);
 	memb_set_print ("my_proclist", instance->my_proc_list, instance->my_proc_list_entries);
 	memb_set_print ("my_faillist", instance->my_failed_list, instance->my_failed_list_entries);
 	memb_set_print ("my_faillist", instance->my_failed_list, instance->my_failed_list_entries);
-*/
+-*/
+
 	if (memb_set_equal (proc_list,
 	if (memb_set_equal (proc_list,
 		memb_join->proc_list_entries,
 		memb_join->proc_list_entries,
 		instance->my_proc_list,
 		instance->my_proc_list,
@@ -3942,7 +3946,7 @@ static int memb_join_process (
 				memb_state_commit_token_create (instance);
 				memb_state_commit_token_create (instance);
 
 
 				memb_state_commit_enter (instance);
 				memb_state_commit_enter (instance);
-				return (0);
+				return;
 		}
 		}
 		if (memb_consensus_agreed (instance) &&
 		if (memb_consensus_agreed (instance) &&
 			memb_lowest_in_config (instance)) {
 			memb_lowest_in_config (instance)) {
@@ -3951,7 +3955,7 @@ static int memb_join_process (
 
 
 			memb_state_commit_enter (instance);
 			memb_state_commit_enter (instance);
 		} else {
 		} else {
-			return (0);
+			return;
 		}
 		}
 	} else
 	} else
 	if (memb_set_subset (proc_list,
 	if (memb_set_subset (proc_list,
@@ -3964,12 +3968,12 @@ static int memb_join_process (
 		instance->my_failed_list,
 		instance->my_failed_list,
 		instance->my_failed_list_entries)) {
 		instance->my_failed_list_entries)) {
 
 
-		return (0);
+		return;
 	} else
 	} else
 	if (memb_set_subset (&memb_join->system_from, 1,
 	if (memb_set_subset (&memb_join->system_from, 1,
 		instance->my_failed_list, instance->my_failed_list_entries)) {
 		instance->my_failed_list, instance->my_failed_list_entries)) {
 
 
-		return (0);
+		return;
 	} else {
 	} else {
 		memb_set_merge (proc_list,
 		memb_set_merge (proc_list,
 			memb_join->proc_list_entries,
 			memb_join->proc_list_entries,
@@ -3983,14 +3987,42 @@ static int memb_join_process (
 				&memb_join->system_from, 1,
 				&memb_join->system_from, 1,
 				instance->my_failed_list, &instance->my_failed_list_entries);
 				instance->my_failed_list, &instance->my_failed_list_entries);
 		} else {
 		} else {
-			memb_set_merge (failed_list,
-				memb_join->failed_list_entries,
-				instance->my_failed_list, &instance->my_failed_list_entries);
+			if (memb_set_subset (
+				&memb_join->system_from, 1,
+				instance->my_memb_list,
+				instance->my_memb_entries)) {
+
+				if (memb_set_subset (
+					&memb_join->system_from, 1,
+					instance->my_failed_list,
+					instance->my_failed_list_entries) == 0) {
+
+					memb_set_merge (failed_list,
+						memb_join->failed_list_entries,
+						instance->my_failed_list, &instance->my_failed_list_entries);
+				} else {
+					memb_set_subtract (fail_minus_memb,
+						&fail_minus_memb_entries,
+						failed_list,
+						memb_join->failed_list_entries,
+						instance->my_memb_list,
+						instance->my_memb_entries);
+
+					memb_set_merge (fail_minus_memb,
+						fail_minus_memb_entries,
+						instance->my_failed_list,
+						&instance->my_failed_list_entries);
+				}
+			}
 		}
 		}
 		memb_state_gather_enter (instance, 11);
 		memb_state_gather_enter (instance, 11);
-		return (1); /* gather entered */
+		gather_entered = 1;
+	}
+	if (gather_entered == 0 &&
+		instance->memb_state == MEMB_STATE_OPERATIONAL) {
+
+		memb_state_gather_enter (instance, 12);
 	}
 	}
-	return (0); /* gather not entered */
 }
 }
 
 
 static void memb_join_endian_convert (const struct memb_join *in, struct memb_join *out)
 static void memb_join_endian_convert (const struct memb_join *in, struct memb_join *out)
@@ -4121,7 +4153,6 @@ static int message_handler_memb_join (
 {
 {
 	const struct memb_join *memb_join;
 	const struct memb_join *memb_join;
 	struct memb_join *memb_join_convert = alloca (msg_len);
 	struct memb_join *memb_join_convert = alloca (msg_len);
-	int gather_entered;
 
 
 	if (endian_conversion_needed) {
 	if (endian_conversion_needed) {
 		memb_join = memb_join_convert;
 		memb_join = memb_join_convert;
@@ -4144,11 +4175,7 @@ static int message_handler_memb_join (
 	}
 	}
 	switch (instance->memb_state) {
 	switch (instance->memb_state) {
 		case MEMB_STATE_OPERATIONAL:
 		case MEMB_STATE_OPERATIONAL:
-			gather_entered = memb_join_process (instance,
-				memb_join);
-			if (gather_entered == 0) {
-				memb_state_gather_enter (instance, 12);
-			}
+			memb_join_process (instance, memb_join);
 			break;
 			break;
 
 
 		case MEMB_STATE_GATHER:
 		case MEMB_STATE_GATHER: