Skip to content

Commit 2b4c257

Browse files
fix(dot/sync): remove block announcement in bootstrap sync mode (#2906)
1 parent c331361 commit 2b4c257

File tree

10 files changed

+237
-47
lines changed

10 files changed

+237
-47
lines changed

dot/core/service.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,16 @@ func (s *Service) StorageRoot() (common.Hash, error) {
127127
}
128128

129129
// HandleBlockImport handles a block that was imported via the network
130-
func (s *Service) HandleBlockImport(block *types.Block, state *rtstorage.TrieState) error {
130+
func (s *Service) HandleBlockImport(block *types.Block, state *rtstorage.TrieState, announce bool) error {
131131
err := s.handleBlock(block, state)
132132
if err != nil {
133133
return fmt.Errorf("handling block: %w", err)
134134
}
135135

136+
if !announce {
137+
return nil
138+
}
139+
136140
bestBlockHash := s.blockState.BestBlockHash()
137141
isBestBlock := bestBlockHash.Equal(block.Header.Hash())
138142

dot/network/notifications_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package network
55

66
import (
77
"errors"
8+
"fmt"
89
"reflect"
910
"testing"
1011
"time"
@@ -196,6 +197,11 @@ func TestCreateNotificationsMessageHandler_BlockAnnounceHandshake(t *testing.T)
196197

197198
err = handler(stream, testHandshake)
198199
require.ErrorIs(t, err, errCannotValidateHandshake)
200+
201+
expectedErrorMessage := fmt.Sprintf("handling handshake: %s from peer %s using protocol %s: genesis hash mismatch",
202+
errCannotValidateHandshake, testPeerID, info.protocolID)
203+
require.EqualError(t, err, expectedErrorMessage)
204+
199205
data := info.peersData.getInboundHandshakeData(testPeerID)
200206
require.NotNil(t, data)
201207
require.True(t, data.received)

dot/sync/chain_processor.go

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ type chainProcessor struct {
2525
ctx context.Context
2626
cancel context.CancelFunc
2727

28+
chainSync ChainSync
29+
2830
// blocks that are ready for processing. ie. their parent is known, or their parent is ahead
2931
// of them within this channel and thus will be processed first
3032
readyBlocks *blockQueue
@@ -42,24 +44,35 @@ type chainProcessor struct {
4244
telemetry telemetry.Client
4345
}
4446

45-
func newChainProcessor(readyBlocks *blockQueue, pendingBlocks DisjointBlockSet,
46-
blockState BlockState, storageState StorageState,
47-
transactionState TransactionState, babeVerifier BabeVerifier,
48-
finalityGadget FinalityGadget, blockImportHandler BlockImportHandler, telemetry telemetry.Client) *chainProcessor {
47+
type chainProcessorConfig struct {
48+
readyBlocks *blockQueue
49+
pendingBlocks DisjointBlockSet
50+
syncer ChainSync
51+
blockState BlockState
52+
storageState StorageState
53+
transactionState TransactionState
54+
babeVerifier BabeVerifier
55+
finalityGadget FinalityGadget
56+
blockImportHandler BlockImportHandler
57+
telemetry telemetry.Client
58+
}
59+
60+
func newChainProcessor(cfg chainProcessorConfig) *chainProcessor {
4961
ctx, cancel := context.WithCancel(context.Background())
5062

5163
return &chainProcessor{
5264
ctx: ctx,
5365
cancel: cancel,
54-
readyBlocks: readyBlocks,
55-
pendingBlocks: pendingBlocks,
56-
blockState: blockState,
57-
storageState: storageState,
58-
transactionState: transactionState,
59-
babeVerifier: babeVerifier,
60-
finalityGadget: finalityGadget,
61-
blockImportHandler: blockImportHandler,
62-
telemetry: telemetry,
66+
readyBlocks: cfg.readyBlocks,
67+
pendingBlocks: cfg.pendingBlocks,
68+
chainSync: cfg.syncer,
69+
blockState: cfg.blockState,
70+
storageState: cfg.storageState,
71+
transactionState: cfg.transactionState,
72+
babeVerifier: cfg.babeVerifier,
73+
finalityGadget: cfg.finalityGadget,
74+
blockImportHandler: cfg.blockImportHandler,
75+
telemetry: cfg.telemetry,
6376
}
6477
}
6578

@@ -109,6 +122,8 @@ func (s *chainProcessor) processBlockData(bd *types.BlockData) error {
109122
return fmt.Errorf("failed to check block state has body for hash %s: %w", bd.Hash, err)
110123
}
111124

125+
// while in bootstrap mode we don't need to broadcast block announcements
126+
announceImportedBlock := s.chainSync.syncState() == tip
112127
if hasHeader && hasBody {
113128
// TODO: fix this; sometimes when the node shuts down the "best block" isn't stored properly,
114129
// so when the node restarts it has blocks higher than what it thinks is the best, causing it not to sync
@@ -149,7 +164,7 @@ func (s *chainProcessor) processBlockData(bd *types.BlockData) error {
149164
return err
150165
}
151166

152-
if err := s.blockImportHandler.HandleBlockImport(block, state); err != nil {
167+
if err := s.blockImportHandler.HandleBlockImport(block, state, announceImportedBlock); err != nil {
153168
logger.Warnf("failed to handle block import: %s", err)
154169
}
155170

@@ -170,7 +185,7 @@ func (s *chainProcessor) processBlockData(bd *types.BlockData) error {
170185
Body: *bd.Body,
171186
}
172187

173-
if err := s.handleBlock(block); err != nil {
188+
if err := s.handleBlock(block, announceImportedBlock); err != nil {
174189
logger.Debugf("failed to handle block number %d: %s", block.Header.Number, err)
175190
return err
176191
}
@@ -201,7 +216,7 @@ func (s *chainProcessor) handleBody(body *types.Body) {
201216
}
202217

203218
// handleHeader handles blocks (header+body) included in BlockResponses
204-
func (s *chainProcessor) handleBlock(block *types.Block) error {
219+
func (s *chainProcessor) handleBlock(block *types.Block, announceImportedBlock bool) error {
205220
parent, err := s.blockState.GetHeader(block.Header.ParentHash)
206221
if err != nil {
207222
return fmt.Errorf("%w: %s", errFailedToGetParent, err)
@@ -233,7 +248,7 @@ func (s *chainProcessor) handleBlock(block *types.Block) error {
233248
return fmt.Errorf("failed to execute block %d: %w", block.Header.Number, err)
234249
}
235250

236-
if err = s.blockImportHandler.HandleBlockImport(block, ts); err != nil {
251+
if err = s.blockImportHandler.HandleBlockImport(block, ts, announceImportedBlock); err != nil {
237252
return err
238253
}
239254

0 commit comments

Comments
 (0)