@@ -109,6 +109,7 @@ type (
109
109
notaryRequestPool * mempool.Pool
110
110
extensiblePool * extpool.Pool
111
111
notaryFeer NotaryFeer
112
+ headerFetcher * blockfetcher.Service
112
113
blockFetcher * blockfetcher.Service
113
114
114
115
serviceLock sync.RWMutex
@@ -227,10 +228,23 @@ func newServerFromConstructors(config ServerConfig, chain Ledger, stSync StateSy
227
228
if s .NeoFSBlockFetcherCfg .BQueueSize <= 0 {
228
229
s .NeoFSBlockFetcherCfg .BQueueSize = blockfetcher .DefaultQueueCacheSize
229
230
}
230
- s .bFetcherQueue = bqueue .New (chain , log , nil , s .NeoFSBlockFetcherCfg .BQueueSize , updateBlockQueueLenMetric , bqueue .Blocking )
231
- var err error
232
- s .blockFetcher , err = blockfetcher .New (chain , s .NeoFSBlockFetcherCfg , log , s .bFetcherQueue .PutBlock ,
233
- sync .OnceFunc (func () { close (s .blockFetcherFin ) }))
231
+ var (
232
+ err error
233
+ bq bqueue.Blockqueuer = s .chain
234
+ )
235
+ if s .config .P2PStateExchangeExtensions {
236
+ bq = s .stateSync
237
+ }
238
+ s .bFetcherQueue = bqueue .New (bq , log , nil , s .NeoFSBlockFetcherCfg .BQueueSize , updateBlockQueueLenMetric , bqueue .Blocking )
239
+ s .headerFetcher , err = blockfetcher .New (bq , s .NeoFSBlockFetcherCfg , log , s .bFetcherQueue .PutBlock , s .bFetcherQueue .PutHeader ,
240
+ func () {
241
+ s .log .Info ("NeoFS BlockFetcher finished headers downloading" )
242
+ })
243
+ if err != nil {
244
+ return nil , fmt .Errorf ("failed to create NeoFS BlockFetcher: %w" , err )
245
+ }
246
+ s .NeoFSBlockFetcherCfg .BlocksOnly = true
247
+ s .blockFetcher , err = blockfetcher .New (bq , s .NeoFSBlockFetcherCfg , log , s .bFetcherQueue .PutBlock , s .bFetcherQueue .PutHeader , sync .OnceFunc (func () { close (s .blockFetcherFin ) }))
234
248
if err != nil {
235
249
return nil , fmt .Errorf ("failed to create NeoFS BlockFetcher: %w" , err )
236
250
}
@@ -311,12 +325,6 @@ func (s *Server) Start() {
311
325
go s .bQueue .Run ()
312
326
go s .bSyncQueue .Run ()
313
327
go s .bFetcherQueue .Run ()
314
- if s .ServerConfig .NeoFSBlockFetcherCfg .Enabled {
315
- err := s .blockFetcher .Start ()
316
- if err != nil {
317
- s .log .Error ("skipping NeoFS BlockFetcher" , zap .Error (err ))
318
- }
319
- }
320
328
for _ , tr := range s .transports {
321
329
go tr .Accept ()
322
330
}
@@ -333,7 +341,12 @@ func (s *Server) Shutdown() {
333
341
s .log .Info ("shutting down server" , zap .Int ("peers" , s .PeerCount ()))
334
342
if s .ServerConfig .NeoFSBlockFetcherCfg .Enabled {
335
343
s .bFetcherQueue .Discard ()
336
- s .blockFetcher .Shutdown ()
344
+ if s .headerFetcher .IsActive () {
345
+ s .headerFetcher .Shutdown ()
346
+ }
347
+ if s .blockFetcher .IsActive () {
348
+ s .blockFetcher .Shutdown ()
349
+ }
337
350
}
338
351
for _ , tr := range s .transports {
339
352
tr .Close ()
@@ -732,7 +745,7 @@ func (s *Server) IsInSync() bool {
732
745
var peersNumber int
733
746
var notHigher int
734
747
735
- if s .stateSync .IsActive () || s .blockFetcher .IsActive () {
748
+ if s .stateSync .IsActive () || s .headerFetcher . IsActive () || s . blockFetcher .IsActive () {
736
749
return false
737
750
}
738
751
@@ -792,7 +805,7 @@ func (s *Server) handleVersionCmd(p Peer, version *payload.Version) error {
792
805
793
806
// handleBlockCmd processes the block received from its peer.
794
807
func (s * Server ) handleBlockCmd (p Peer , block * block.Block ) error {
795
- if s .blockFetcher .IsActive () {
808
+ if s .headerFetcher . IsActive () || s . blockFetcher .IsActive () {
796
809
return nil
797
810
}
798
811
if s .stateSync .IsActive () {
@@ -815,15 +828,23 @@ func (s *Server) handlePing(p Peer, ping *payload.Ping) error {
815
828
}
816
829
817
830
func (s * Server ) requestBlocksOrHeaders (p Peer ) error {
818
- if s .blockFetcher .IsActive () {
819
- return nil
820
- }
821
831
if s .stateSync .NeedHeaders () {
822
- if s .chain .HeaderHeight () < p .LastBlockIndex () {
832
+ if s .chain .HeaderHeight () < p .LastBlockIndex () || s . NeoFSBlockFetcherCfg . Enabled {
823
833
return s .requestHeaders (p )
824
834
}
825
835
return nil
826
836
}
837
+ if s .headerFetcher .IsActive () {
838
+ s .headerFetcher .Shutdown ()
839
+ }
840
+ if s .ServerConfig .NeoFSBlockFetcherCfg .Enabled {
841
+ if ((s .stateSync .IsActive () && s .headerFetcher .IsShutdown ()) || ! s .stateSync .IsActive ()) && ! s .blockFetcher .IsShutdown () {
842
+ if err := s .blockFetcher .Start (); err != nil {
843
+ s .log .Error ("skipping NeoFS BlockFetcher" , zap .Error (err ))
844
+ }
845
+ }
846
+ }
847
+
827
848
var (
828
849
bq bqueue.Blockqueuer = s .chain
829
850
requestMPTNodes bool
@@ -847,6 +868,16 @@ func (s *Server) requestBlocksOrHeaders(p Peer) error {
847
868
848
869
// requestHeaders sends a CMDGetHeaders message to the peer to sync up in headers.
849
870
func (s * Server ) requestHeaders (p Peer ) error {
871
+ if s .ServerConfig .NeoFSBlockFetcherCfg .Enabled {
872
+ if ! s .headerFetcher .IsShutdown () {
873
+ err := s .headerFetcher .Start ()
874
+ if err != nil {
875
+ s .log .Error ("skipping NeoFS BlockFetcher" , zap .Error (err ))
876
+ } else {
877
+ return err
878
+ }
879
+ }
880
+ }
850
881
pl := getRequestBlocksPayload (p , s .chain .HeaderHeight (), & s .lastRequestedHeader )
851
882
return p .EnqueueP2PMessage (NewMessage (CMDGetHeaders , pl ))
852
883
}
@@ -1136,7 +1167,7 @@ func (s *Server) handleGetHeadersCmd(p Peer, gh *payload.GetBlockByIndex) error
1136
1167
1137
1168
// handleHeadersCmd processes headers payload.
1138
1169
func (s * Server ) handleHeadersCmd (p Peer , h * payload.Headers ) error {
1139
- if s .blockFetcher .IsActive () {
1170
+ if s .headerFetcher .IsActive () {
1140
1171
return nil
1141
1172
}
1142
1173
return s .stateSync .AddHeaders (h .Hdrs ... )
@@ -1335,6 +1366,9 @@ func (s *Server) handleGetAddrCmd(p Peer) error {
1335
1366
// 2. Send requests for chunk in increasing order.
1336
1367
// 3. After all requests have been sent, request random height.
1337
1368
func (s * Server ) requestBlocks (bq bqueue.Blockqueuer , p Peer ) error {
1369
+ if s .blockFetcher .IsActive () {
1370
+ return nil
1371
+ }
1338
1372
pl := getRequestBlocksPayload (p , bq .BlockHeight (), & s .lastRequestedBlock )
1339
1373
lq , capLeft := s .bQueue .LastQueued ()
1340
1374
if capLeft == 0 {
@@ -1468,9 +1502,6 @@ func (s *Server) handleMessage(peer Peer, msg *Message) error {
1468
1502
}
1469
1503
1470
1504
func (s * Server ) tryInitStateSync () {
1471
- if s .blockFetcher .IsActive () {
1472
- return
1473
- }
1474
1505
if ! s .stateSync .IsActive () {
1475
1506
s .bSyncQueue .Discard ()
1476
1507
return
0 commit comments