mirror of
https://github.com/grassrootseconomics/eth-tracker.git
synced 2025-04-25 09:41:00 +02:00
85 lines
1.9 KiB
Go
85 lines
1.9 KiB
Go
package syncer
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/dgraph-io/badger/v4"
|
|
)
|
|
|
|
const (
|
|
blockBatchSize = 100
|
|
)
|
|
|
|
func (s *Syncer) BootstrapHistoricalSyncer() error {
|
|
v, err := s.db.GetLowerBound()
|
|
if err != nil {
|
|
if err == badger.ErrKeyNotFound {
|
|
if err := s.db.SetLowerBound(s.initialLowerBound); err != nil {
|
|
return err
|
|
}
|
|
v = s.initialLowerBound
|
|
} else {
|
|
return err
|
|
}
|
|
}
|
|
|
|
latestBlock, err := s.chain.GetLatestBlock(context.Background())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := s.db.SetUpperBound(latestBlock); err != nil {
|
|
return err
|
|
}
|
|
|
|
missingBlocks, err := s.db.GetMissingValuesBitSet(v, latestBlock)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
missingBlocksCount := missingBlocks.Count()
|
|
s.logg.Info("bootstrapping historical syncer", "missing_blocks", missingBlocksCount, "lower_bound", v, "upper_bound", latestBlock)
|
|
|
|
buffer := make([]uint, missingBlocksCount)
|
|
missingBlocks.NextSetMany(0, buffer)
|
|
for _, v := range buffer {
|
|
s.batchQueue.PushFront(uint64(v))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *Syncer) StartHistoricalSyncer(ctx context.Context) error {
|
|
s.logg.Info("starting historical syncer", "batch_size", blockBatchSize)
|
|
for {
|
|
select {
|
|
case <-ctx.Done():
|
|
s.logg.Info("historical syncer shutting down")
|
|
return nil
|
|
default:
|
|
if s.batchQueue.Len() > 0 {
|
|
var (
|
|
currentIterLen = s.batchQueue.Len()
|
|
)
|
|
|
|
if currentIterLen > blockBatchSize {
|
|
currentIterLen = blockBatchSize
|
|
}
|
|
batch := make([]uint64, currentIterLen)
|
|
for i := 0; i < currentIterLen; i++ {
|
|
v, _ := s.batchQueue.PopFront()
|
|
batch[i] = v
|
|
}
|
|
|
|
blocks, err := s.chain.GetBlocks(context.Background(), batch)
|
|
if err != nil {
|
|
s.logg.Error("batch blocks fetcher error", "fetch_size", currentIterLen, "block_range", fmt.Sprintf("%d-%d", batch[0], batch[len(batch)-1]), "error", err)
|
|
}
|
|
|
|
for _, v := range blocks {
|
|
s.blocksQueue.PushBack(v)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|