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