From 5ad426357a9eeeb8a07932506cd61cdd64c634a6 Mon Sep 17 00:00:00 2001 From: Alok Date: Thu, 3 Jul 2025 12:07:27 +0530 Subject: [PATCH] fix: use LRU cache for blocks --- .../preconf-rpc/blocktracker/blocktracker.go | 20 ++++++++++++------- .../blocktracker/blocktracker_test.go | 5 ++++- tools/preconf-rpc/service/service.go | 6 +++++- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/tools/preconf-rpc/blocktracker/blocktracker.go b/tools/preconf-rpc/blocktracker/blocktracker.go index 449f76694..04912abc6 100644 --- a/tools/preconf-rpc/blocktracker/blocktracker.go +++ b/tools/preconf-rpc/blocktracker/blocktracker.go @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + lru "github.com/hashicorp/golang-lru/v2" ) type EthClient interface { @@ -18,20 +19,25 @@ type EthClient interface { type blockTracker struct { latestBlockNo atomic.Uint64 - blocks map[uint64]*types.Block + blocks *lru.Cache[uint64, *types.Block] client EthClient log *slog.Logger checkTrigger chan struct{} } -func NewBlockTracker(client EthClient, log *slog.Logger) *blockTracker { +func NewBlockTracker(client EthClient, log *slog.Logger) (*blockTracker, error) { + cache, err := lru.New[uint64, *types.Block](1000) + if err != nil { + log.Error("Failed to create LRU cache", "error", err) + return nil, err + } return &blockTracker{ latestBlockNo: atomic.Uint64{}, - blocks: make(map[uint64]*types.Block), + blocks: cache, client: client, log: log, checkTrigger: make(chan struct{}, 1), - } + }, nil } func (b *blockTracker) Start(ctx context.Context) <-chan struct{} { @@ -55,7 +61,7 @@ func (b *blockTracker) Start(ctx context.Context) <-chan struct{} { b.log.Error("Failed to get block by number", "error", err) continue } - b.blocks[blockNo] = block + _ = b.blocks.Add(blockNo, block) b.latestBlockNo.Store(block.NumberU64()) b.log.Info("New block detected", "number", block.NumberU64(), "hash", block.Hash().Hex()) b.triggerCheck() @@ -95,14 +101,14 @@ WaitForBlock: } } - block, ok := b.blocks[blockNumber] + block, ok := b.blocks.Get(blockNumber) if !ok { block, err := b.client.BlockByNumber(ctx, big.NewInt(int64(blockNumber))) if err != nil { b.log.Error("Failed to get block by number", "error", err, "blockNumber", blockNumber) return false, err } - b.blocks[blockNumber] = block + _ = b.blocks.Add(blockNumber, block) } for _, tx := range block.Transactions() { diff --git a/tools/preconf-rpc/blocktracker/blocktracker_test.go b/tools/preconf-rpc/blocktracker/blocktracker_test.go index 9601f4e8b..2f077248a 100644 --- a/tools/preconf-rpc/blocktracker/blocktracker_test.go +++ b/tools/preconf-rpc/blocktracker/blocktracker_test.go @@ -99,7 +99,10 @@ func TestBlockTracker(t *testing.T) { }, } - tracker := blocktracker.NewBlockTracker(client, slog.Default()) + tracker, err := blocktracker.NewBlockTracker(client, slog.Default()) + if err != nil { + t.Fatalf("Failed to create block tracker: %v", err) + } done := tracker.Start(ctx) blkNo := tracker.LatestBlockNumber() diff --git a/tools/preconf-rpc/service/service.go b/tools/preconf-rpc/service/service.go index 3287401f5..1ccef45cb 100644 --- a/tools/preconf-rpc/service/service.go +++ b/tools/preconf-rpc/service/service.go @@ -184,10 +184,14 @@ func New(config *Config) (*Service, error) { return nil, fmt.Errorf("failed to create store: %w", err) } - blockTracker := blocktracker.NewBlockTracker( + blockTracker, err := blocktracker.NewBlockTracker( l1RPCClient, config.Logger.With("module", "blocktracker"), ) + if err != nil { + return nil, fmt.Errorf("failed to create block tracker: %w", err) + } + blockTrackerDone := blockTracker.Start(ctx) healthChecker.Register(health.CloseChannelHealthCheck("BlockTracker", blockTrackerDone))