Commit 49647f2b authored by Rick Bernt's avatar Rick Bernt Committed by GitHub

op-supervisor: Load the starting block from log db (#11090)

* finish TODO(optimism#11023)

* revert GetLogBlockNum() && use ClosestBlockInfo

* catch error

* rewind

* gofmt -w -s .

* op-supervisor: Remove unused import.

---------
Co-authored-by: default avatarAdrian Sutton <adrian@oplabs.co>
parent d4a22a7c
...@@ -5,6 +5,7 @@ import ( ...@@ -5,6 +5,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"io" "io"
"math"
"sync/atomic" "sync/atomic"
"time" "time"
...@@ -50,7 +51,21 @@ func NewSupervisorBackend(ctx context.Context, logger log.Logger, m Metrics, cfg ...@@ -50,7 +51,21 @@ func NewSupervisorBackend(ctx context.Context, logger log.Logger, m Metrics, cfg
return nil, fmt.Errorf("failed to create logdb for chain %v at %v: %w", chainID, path, err) return nil, fmt.Errorf("failed to create logdb for chain %v at %v: %w", chainID, path, err)
} }
logDBs[i] = logDB logDBs[i] = logDB
monitor, err := source.NewChainMonitor(ctx, logger, cm, chainID, rpc, rpcClient)
// Get the last checkpoint that was written then Rewind the db
// to the block prior to that block and start from there.
// Guarantees we will always roll back at least one block
// so we know we're always starting from a fully written block.
checkPointBlock, _, err := logDB.ClosestBlockInfo(math.MaxUint64)
if err != nil {
return nil, fmt.Errorf("failed to get block from checkpoint: %w", err)
}
block := checkPointBlock - 1
err = logDB.Rewind(block)
if err != nil {
return nil, fmt.Errorf("failed to 'Rewind' the database: %w", err)
}
monitor, err := source.NewChainMonitor(ctx, logger, cm, chainID, rpc, rpcClient, block)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create monitor for rpc %v: %w", rpc, err) return nil, fmt.Errorf("failed to create monitor for rpc %v: %w", rpc, err)
} }
......
...@@ -31,15 +31,16 @@ type ChainMonitor struct { ...@@ -31,15 +31,16 @@ type ChainMonitor struct {
headMonitor *HeadMonitor headMonitor *HeadMonitor
} }
func NewChainMonitor(ctx context.Context, logger log.Logger, m Metrics, chainID types.ChainID, rpc string, client client.RPC) (*ChainMonitor, error) { func NewChainMonitor(ctx context.Context, logger log.Logger, m Metrics, chainID types.ChainID, rpc string, client client.RPC, block uint64) (*ChainMonitor, error) {
logger = logger.New("chainID", chainID) logger = logger.New("chainID", chainID)
cl, err := newClient(ctx, logger, m, rpc, client, pollInterval, trustRpc, rpcKind) cl, err := newClient(ctx, logger, m, rpc, client, pollInterval, trustRpc, rpcKind)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// TODO(optimism#11023): Load the starting block from log db startingHead := eth.L1BlockRef{
startingHead := eth.L1BlockRef{} Number: block,
}
fetchReceipts := newLogFetcher(cl, &loggingReceiptProcessor{logger}) fetchReceipts := newLogFetcher(cl, &loggingReceiptProcessor{logger})
unsafeBlockProcessor := NewChainProcessor(logger, cl, startingHead, fetchReceipts) unsafeBlockProcessor := NewChainProcessor(logger, cl, startingHead, fetchReceipts)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment