Index: exec/totemsrp.c =================================================================== --- exec/totemsrp.c (revision 2147) +++ exec/totemsrp.c (revision 2148) @@ -3737,7 +3737,7 @@ return (0); } -static int memb_join_process ( +static void memb_join_process ( struct totemsrp_instance *instance, struct memb_join *memb_join) { @@ -3746,7 +3746,11 @@ (struct memb_commit_token *)commit_token_storage; struct srp_addr *proc_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; failed_list = proc_list + memb_join->proc_list_entries; @@ -3773,7 +3777,7 @@ memb_state_commit_token_create (instance, my_commit_token); memb_state_commit_enter (instance, my_commit_token); - return (0); + return; } if (memb_consensus_agreed (instance) && @@ -3783,7 +3787,7 @@ memb_state_commit_enter (instance, my_commit_token); } else { - return (0); + return; } } else if (memb_set_subset (proc_list, @@ -3796,12 +3800,12 @@ instance->my_failed_list, instance->my_failed_list_entries)) { - return (0); + return; } else if (memb_set_subset (&memb_join->system_from, 1, instance->my_failed_list, instance->my_failed_list_entries)) { - return (0); + return; } else { memb_set_merge (proc_list, memb_join->proc_list_entries, @@ -3815,14 +3819,42 @@ &memb_join->system_from, 1, instance->my_failed_list, &instance->my_failed_list_entries); } 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); - return (1); /* gather entered */ + gather_entered = 1; } - return (0); /* gather not entered */ + if (gather_entered == 0 && + instance->memb_state == MEMB_STATE_OPERATIONAL) { + + memb_state_gather_enter (instance, 12); + } } static void memb_join_endian_convert (struct memb_join *in, struct memb_join *out) @@ -3953,7 +3985,6 @@ { struct memb_join *memb_join; struct memb_join *memb_join_convert = alloca (msg_len); - int gather_entered; if (endian_conversion_needed) { memb_join = memb_join_convert; @@ -3968,11 +3999,7 @@ } switch (instance->memb_state) { 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; case MEMB_STATE_GATHER: