From 2f4c1f60c789a6d19a328b44ae9d3a6c1c394e5c Mon Sep 17 00:00:00 2001 From: Erik Grinaker Date: Wed, 2 Sep 2020 10:16:08 +0200 Subject: [PATCH] statesync: broadcast snapshot request to all peers on startup (#5320) On startup, the peer-to-peer stack may have peers connected before the state sync process begins, causing these to not trigger `AddPeer` events and thus not be used for snapshot discovery. Broadcasting a snapshot request to these explicitly makes sure we discover snapshots from existing peers as well. --- CHANGELOG_PENDING.md | 2 ++ statesync/reactor.go | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index d56f28a1f..1d92f2df0 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -40,4 +40,6 @@ Friendly reminder, we have a [bug bounty program](https://hackerone.com/tendermi - [statesync] \#5311 Fix validator set off-by-one causing consensus failures (@erikgrinaker) +- [statesync] \#5320 Broadcast snapshot request to all pre-connected peers on start (@erikgrinaker) + - [light] [\#5307](https://github.com/tendermint/tendermint/pull/5307) Persist correct proposer priority in light client validator sets (@cmwaters) diff --git a/statesync/reactor.go b/statesync/reactor.go index dec60c2c9..8536583ab 100644 --- a/statesync/reactor.go +++ b/statesync/reactor.go @@ -254,6 +254,10 @@ func (r *Reactor) Sync(stateProvider StateProvider) (sm.State, *types.Commit, er r.syncer = newSyncer(r.Logger, r.conn, r.connQuery, stateProvider, r.tempDir) r.mtx.Unlock() + // Request snapshots from all currently connected peers + r.Logger.Debug("Requesting snapshots from known peers") + r.Switch.Broadcast(SnapshotChannel, mustEncodeMsg(&ssproto.SnapshotsRequest{})) + state, commit, err := r.syncer.SyncAny(defaultDiscoveryTime) r.mtx.Lock() r.syncer = nil