@@ -222,17 +222,17 @@ func (s *Synchronizer) verifierTask(ctx context.Context, block *core.Block, stat
222
222
return
223
223
}
224
224
highestBlockHeader := s .highestBlockHeader .Load ()
225
- if highestBlockHeader == nil || highestBlockHeader . Number <= block . Number {
226
- highestBlock , err := s . starknetData . BlockLatest ( ctx )
227
- if err != nil {
228
- s . log . Warnw ( "Failed fetching latest block" , "err" , err )
229
- } else {
230
- s . highestBlockHeader . Store ( highestBlock . Header )
231
- isBehind := highestBlock . Number > block . Number + uint64 ( maxWorkers ())
232
- if s . catchUpMode != isBehind {
233
- resetStreams ()
234
- }
235
- s .catchUpMode = isBehind
225
+ if highestBlockHeader != nil {
226
+ isBehind := highestBlockHeader . Number > block . Number + uint64 ( maxWorkers () )
227
+ if s . catchUpMode != isBehind {
228
+ resetStreams ( )
229
+ }
230
+ s . catchUpMode = isBehind
231
+ }
232
+
233
+ if highestBlockHeader == nil || highestBlockHeader . Number < block . Number {
234
+ if s . highestBlockHeader . CompareAndSwap ( highestBlockHeader , block . Header ) {
235
+ s .bestBlockGauge . Set ( float64 ( block . Header . Number ))
236
236
}
237
237
}
238
238
@@ -266,6 +266,8 @@ func (s *Synchronizer) syncBlocks(syncCtx context.Context) {
266
266
267
267
pendingSem := make (chan struct {}, 1 )
268
268
go s .pollPending (syncCtx , pendingSem )
269
+ latestSem := make (chan struct {}, 1 )
270
+ go s .pollLatest (syncCtx , latestSem )
269
271
270
272
for {
271
273
select {
@@ -277,6 +279,7 @@ func (s *Synchronizer) syncBlocks(syncCtx context.Context) {
277
279
select {
278
280
case <- syncCtx .Done ():
279
281
pendingSem <- struct {}{}
282
+ latestSem <- struct {}{}
280
283
return
281
284
default :
282
285
streamCtx , streamCancel = context .WithCancel (syncCtx )
@@ -346,18 +349,54 @@ func (s *Synchronizer) pollPending(ctx context.Context, sem chan struct{}) {
346
349
select {
347
350
case sem <- struct {}{}:
348
351
go func () {
352
+ defer func () {
353
+ <- sem
354
+ }()
349
355
err := s .fetchAndStorePending (ctx )
350
356
if err != nil {
351
357
s .log .Debugw ("Error while trying to poll pending block" , "err" , err )
352
358
}
353
- <- sem
354
359
}()
355
360
default :
356
361
}
357
362
}
358
363
}
359
364
}
360
365
366
+ func (s * Synchronizer ) pollLatest (ctx context.Context , sem chan struct {}) {
367
+ poll := func () {
368
+ select {
369
+ case sem <- struct {}{}:
370
+ go func () {
371
+ defer func () {
372
+ <- sem
373
+ }()
374
+ highestBlock , err := s .starknetData .BlockLatest (ctx )
375
+ if err != nil {
376
+ s .log .Warnw ("Failed fetching latest block" , "err" , err )
377
+ } else {
378
+ s .highestBlockHeader .Store (highestBlock .Header )
379
+ }
380
+ s .bestBlockGauge .Set (float64 (highestBlock .Header .Number ))
381
+ }()
382
+ default :
383
+ }
384
+ }
385
+
386
+ ticker := time .NewTicker (time .Minute )
387
+ poll ()
388
+
389
+ for {
390
+ select {
391
+ case <- ctx .Done ():
392
+ ticker .Stop ()
393
+ return
394
+ case <- ticker .C :
395
+ poll ()
396
+ }
397
+ }
398
+ }
399
+
361
400
func (s * Synchronizer ) fetchAndStorePending (ctx context.Context ) error {
362
401
highestBlockHeader := s .highestBlockHeader .Load ()
363
402
if highestBlockHeader == nil {
@@ -394,18 +433,12 @@ func (s *Synchronizer) fetchAndStorePending(ctx context.Context) error {
394
433
395
434
func (s * Synchronizer ) updateStats (block * core.Block ) {
396
435
var (
397
- transactions = block .TransactionCount
398
- currentHeight = block .Number
399
- highestKnownHeight uint64 = 0
436
+ transactions = block .TransactionCount
437
+ currentHeight = block .Number
400
438
)
401
- highestBlockHeader := s .highestBlockHeader .Load ()
402
- if highestBlockHeader != nil {
403
- highestKnownHeight = highestBlockHeader .Number
404
- }
405
439
406
440
s .blockCount .Inc ()
407
441
s .chainHeightGauge .Set (float64 (currentHeight ))
408
- s .bestBlockGauge .Set (float64 (highestKnownHeight ))
409
442
s .transactionCount .Add (float64 (transactions ))
410
443
}
411
444
0 commit comments