changeset 47:71b6822763da default tip

Fix more race conditions in Accept logic
author Lewin Bormann <lbo@spheniscida.de>
date Fri, 26 Jul 2019 12:10:39 +0200
parents 8f5f20f6b685
children
files consensus_impl.go
diffstat 1 files changed, 6 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/consensus_impl.go	Fri Jul 26 12:05:23 2019 +0200
+++ b/consensus_impl.go	Fri Jul 26 12:10:39 2019 +0200
@@ -49,9 +49,9 @@
 		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()
+				p.failedAccepts[member] = p.failedAccepts[member] + 1
 				errs = append(errs, NewError(ERR_CALL, "Error from remote participant", err))
 				localMx.Unlock()
 
@@ -60,12 +60,15 @@
 				// Useful to solve generic network errors
 				p.forceReconnect(member)
 
+				localMx.Lock()
 				if p.failedAccepts[member] < 3 {
 					glog.Info("delaying re-initialization for ", member, ": ", p.failedAccepts[member])
+					localMx.Unlock()
 					wait <- false
 					return
 				}
 				p.failedAccepts[member] = 0
+				localMx.Unlock()
 				// 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 {
@@ -79,7 +82,9 @@
 					return
 				}
 			}
+			localMx.Lock()
 			p.failedAccepts[member] = 0
+			localMx.Unlock()
 			if !ok {
 				localMx.Lock()
 				errs = append(errs, NewError(ERR_DENIED, "Vote denied", nil))