changeset 44:3f480e231923

Be less eager re-initializing followers
author Lewin Bormann <lbo@spheniscida.de>
date Fri, 26 Jul 2019 11:38:02 +0200
parents 2995d688667f
children 5a328ba1b0e3
files consensus.go consensus_impl.go types.go
diffstat 3 files changed, 10 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/consensus.go	Fri Jul 26 11:23:22 2019 +0200
+++ b/consensus.go	Fri Jul 26 11:38:02 2019 +0200
@@ -24,6 +24,7 @@
 		sequence: 0,
 
 		failedSubmits: 0,
+		failedAccepts: make(map[Member]int),
 
 		state:            initialState,
 		participantState: state_UNJOINED,
--- a/consensus_impl.go	Fri Jul 26 11:23:22 2019 +0200
+++ b/consensus_impl.go	Fri Jul 26 11:38:02 2019 +0200
@@ -48,6 +48,7 @@
 		go func() {
 			ok, err := client.Accept(p.instance, p.sequence+1, c)
 			if err != nil {
+				p.failedAccepts[member] = p.failedAccepts[member] + 1
 				glog.Error("client ", member, " did not accept: ", err)
 				localMx.Lock()
 				errs = append(errs, NewError(ERR_CALL, "Error from remote participant", err))
@@ -58,6 +59,12 @@
 				// Useful to solve generic network errors
 				p.forceReconnect(member)
 
+				if p.failedAccepts[member] < 3 {
+					glog.Info("delaying re-initialization for ", member, ": ", p.failedAccepts[member])
+					wait <- false
+					return
+				}
+				p.failedAccepts[member] = 0
 				// Especially useful to solve ERR_STATE, ERR_GAP errors
 				err = client.StartParticipation(p.instance, p.sequence, p.cluster, member, p.self, p.members, p.state.Snapshot())
 				if err != nil {
@@ -71,6 +78,7 @@
 					return
 				}
 			}
+			p.failedAccepts[member] = 0
 			if !ok {
 				localMx.Lock()
 				errs = append(errs, NewError(ERR_DENIED, "Vote denied", nil))
--- a/types.go	Fri Jul 26 11:23:22 2019 +0200
+++ b/types.go	Fri Jul 26 11:38:02 2019 +0200
@@ -77,6 +77,7 @@
 	instance      InstanceNumber // nth round
 	sequence      SequenceNumber // nth submission in this round
 	failedSubmits int
+	failedAccepts map[Member]int
 
 	state            State
 	participantState int // See state_... constants