|
@@ -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:
|