diff --git a/consensus/consensus.go b/consensus/consensus.go index 98fcb98af..58baeffea 100644 --- a/consensus/consensus.go +++ b/consensus/consensus.go @@ -135,6 +135,10 @@ func (consensus *Consensus) prefillNeighborVotes(elc *election.Election, height if rn.GetHeight() < height && height < rn.GetMinVerifiableHeight() { continue } + // Neighbor's consensus state is not up to date + if time.Since(rn.GetLastUpdateTime()) > getConsensusStateInterval*2 { + continue + } neighborIDs = append(neighborIDs, rn.GetID()) } diff --git a/consensus/state.go b/consensus/state.go index 4bd3ce0c8..146a9cb24 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -81,6 +81,7 @@ func (consensus *Consensus) getNeighborConsensusState(neighbor *node.RemoteNode) neighbor.SetHeight(replyMsg.LedgerHeight) neighbor.SetMinVerifiableHeight(replyMsg.MinVerifiableHeight) neighbor.SetSyncState(replyMsg.SyncState) + neighbor.SetLastUpdateTime(time.Now()) return replyMsg, nil } diff --git a/node/neighbor.go b/node/neighbor.go index 234d7f332..a949ef22b 100644 --- a/node/neighbor.go +++ b/node/neighbor.go @@ -95,7 +95,7 @@ func (localNode *LocalNode) startConnectingToRandomNeighbors() { } for { - time.Sleep(util.RandDuration(randomNeighborConnectInterval, 1.0/6.0)) + time.Sleep(util.RandDuration(randomNeighborConnectInterval, 1.0/3.0)) if len(localNode.randomNeighbors) >= maxNumRandomNeighbors { nbr := localNode.GetNbrNode(localNode.randomNeighbors[0]) diff --git a/node/remotenode.go b/node/remotenode.go index 8e43da55a..3a6ad1216 100644 --- a/node/remotenode.go +++ b/node/remotenode.go @@ -18,7 +18,8 @@ type RemoteNode struct { sharedKey *[sharedKeySize]byte sync.RWMutex - height uint32 + height uint32 + lastUpdateTime time.Time } func (remoteNode *RemoteNode) MarshalJSON() ([]byte, error) { @@ -83,6 +84,18 @@ func (remoteNode *RemoteNode) SetHeight(height uint32) { remoteNode.height = height } +func (remoteNode *RemoteNode) GetLastUpdateTime() time.Time { + remoteNode.RLock() + defer remoteNode.RUnlock() + return remoteNode.lastUpdateTime +} + +func (remoteNode *RemoteNode) SetLastUpdateTime(lastUpdateTime time.Time) { + remoteNode.Lock() + defer remoteNode.Unlock() + remoteNode.lastUpdateTime = lastUpdateTime +} + func (remoteNode *RemoteNode) CloseConn() { remoteNode.nnetNode.Stop(nil) }