@@ -222,17 +222,17 @@ func (s *Synchronizer) verifierTask(ctx context.Context, block *core.Block, stat
222222				return 
223223			}
224224			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 )) 
236236				}
237237			}
238238
@@ -266,6 +266,8 @@ func (s *Synchronizer) syncBlocks(syncCtx context.Context) {
266266
267267	pendingSem  :=  make (chan  struct {}, 1 )
268268	go  s .pollPending (syncCtx , pendingSem )
269+ 	latestSem  :=  make (chan  struct {}, 1 )
270+ 	go  s .pollLatest (syncCtx , latestSem )
269271
270272	for  {
271273		select  {
@@ -277,6 +279,7 @@ func (s *Synchronizer) syncBlocks(syncCtx context.Context) {
277279			select  {
278280			case  <- syncCtx .Done ():
279281				pendingSem  <-  struct {}{}
282+ 				latestSem  <-  struct {}{}
280283				return 
281284			default :
282285				streamCtx , streamCancel  =  context .WithCancel (syncCtx )
@@ -346,18 +349,54 @@ func (s *Synchronizer) pollPending(ctx context.Context, sem chan struct{}) {
346349			select  {
347350			case  sem  <-  struct {}{}:
348351				go  func () {
352+ 					defer  func () {
353+ 						<- sem 
354+ 					}()
349355					err  :=  s .fetchAndStorePending (ctx )
350356					if  err  !=  nil  {
351357						s .log .Debugw ("Error while trying to poll pending block" , "err" , err )
352358					}
353- 					<- sem 
354359				}()
355360			default :
356361			}
357362		}
358363	}
359364}
360365
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+ 
361400func  (s  * Synchronizer ) fetchAndStorePending (ctx  context.Context ) error  {
362401	highestBlockHeader  :=  s .highestBlockHeader .Load ()
363402	if  highestBlockHeader  ==  nil  {
@@ -394,18 +433,12 @@ func (s *Synchronizer) fetchAndStorePending(ctx context.Context) error {
394433
395434func  (s  * Synchronizer ) updateStats (block  * core.Block ) {
396435	var  (
397- 		transactions               =  block .TransactionCount 
398- 		currentHeight              =  block .Number 
399- 		highestKnownHeight  uint64  =  0 
436+ 		transactions   =  block .TransactionCount 
437+ 		currentHeight  =  block .Number 
400438	)
401- 	highestBlockHeader  :=  s .highestBlockHeader .Load ()
402- 	if  highestBlockHeader  !=  nil  {
403- 		highestKnownHeight  =  highestBlockHeader .Number 
404- 	}
405439
406440	s .blockCount .Inc ()
407441	s .chainHeightGauge .Set (float64 (currentHeight ))
408- 	s .bestBlockGauge .Set (float64 (highestKnownHeight ))
409442	s .transactionCount .Add (float64 (transactions ))
410443}
411444
0 commit comments