Mercurial > lbo > hg > clusterconsensus
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))