|
@@ -504,7 +504,9 @@ struct totemsrp_instance {
|
|
|
totemsrp_stats_t stats;
|
|
totemsrp_stats_t stats;
|
|
|
|
|
|
|
|
uint32_t orf_token_discard;
|
|
uint32_t orf_token_discard;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ uint32_t originated_orf_token;
|
|
|
|
|
+
|
|
|
uint32_t waiting_trans_ack;
|
|
uint32_t waiting_trans_ack;
|
|
|
|
|
|
|
|
void * token_recv_event_handle;
|
|
void * token_recv_event_handle;
|
|
@@ -680,6 +682,8 @@ static void totemsrp_instance_initialize (struct totemsrp_instance *instance)
|
|
|
|
|
|
|
|
instance->orf_token_discard = 0;
|
|
instance->orf_token_discard = 0;
|
|
|
|
|
|
|
|
|
|
+ instance->originated_orf_token = 0;
|
|
|
|
|
+
|
|
|
instance->commit_token = (struct memb_commit_token *)instance->commit_token_storage;
|
|
instance->commit_token = (struct memb_commit_token *)instance->commit_token_storage;
|
|
|
|
|
|
|
|
instance->waiting_trans_ack = 1;
|
|
instance->waiting_trans_ack = 1;
|
|
@@ -1729,6 +1733,8 @@ static void memb_state_operational_enter (struct totemsrp_instance *instance)
|
|
|
unsigned int i;
|
|
unsigned int i;
|
|
|
unsigned int res;
|
|
unsigned int res;
|
|
|
|
|
|
|
|
|
|
+ instance->originated_orf_token = 0;
|
|
|
|
|
+
|
|
|
memb_consensus_reset (instance);
|
|
memb_consensus_reset (instance);
|
|
|
|
|
|
|
|
old_ring_state_reset (instance);
|
|
old_ring_state_reset (instance);
|
|
@@ -1913,6 +1919,8 @@ static void memb_state_gather_enter (
|
|
|
{
|
|
{
|
|
|
instance->orf_token_discard = 1;
|
|
instance->orf_token_discard = 1;
|
|
|
|
|
|
|
|
|
|
+ instance->originated_orf_token = 0;
|
|
|
|
|
+
|
|
|
memb_set_merge (
|
|
memb_set_merge (
|
|
|
&instance->my_id, 1,
|
|
&instance->my_id, 1,
|
|
|
instance->my_proc_list, &instance->my_proc_list_entries);
|
|
instance->my_proc_list, &instance->my_proc_list_entries);
|
|
@@ -4349,6 +4357,14 @@ static int message_handler_memb_commit_token (
|
|
|
|
|
|
|
|
case MEMB_STATE_RECOVERY:
|
|
case MEMB_STATE_RECOVERY:
|
|
|
if (totemip_equal (&instance->my_id.addr[0], &instance->my_ring_id.rep)) {
|
|
if (totemip_equal (&instance->my_id.addr[0], &instance->my_ring_id.rep)) {
|
|
|
|
|
+
|
|
|
|
|
+ /* Filter out duplicated tokens */
|
|
|
|
|
+ if (instance->originated_orf_token) {
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ instance->originated_orf_token = 1;
|
|
|
|
|
+
|
|
|
log_printf (instance->totemsrp_log_level_debug,
|
|
log_printf (instance->totemsrp_log_level_debug,
|
|
|
"Sending initial ORF token\n");
|
|
"Sending initial ORF token\n");
|
|
|
|
|
|