Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 38 additions & 1 deletion internal/committer/reorg.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,35 @@ func detectAndHandleReorgs(startBlock int64, endBlock int64) (int64, error) {
// 1) Block verification: find reorg range from header continuity (existing behavior)
reorgStartBlock := int64(-1)
reorgEndBlock := int64(-1)
missingStartBlock := int64(-1)
missingEndBlock := int64(-1)
missingBlockCount := 0
lastHeaderBlock := startBlock - 1

for i, blockHeader := range blockHeaders {
expectedBlockNumber := startBlock + int64(i)
if blockHeader == nil || blockHeader.Number == nil {
if missingStartBlock == -1 {
missingStartBlock = expectedBlockNumber
}
missingEndBlock = expectedBlockNumber
missingBlockCount++
continue
}
lastHeaderBlock = blockHeader.Number.Int64()
}
if missingStartBlock > -1 {
log.Warn().
Int64("missing_start_block", missingStartBlock).
Int64("missing_end_block", missingEndBlock).
Int("missing_block_count", missingBlockCount).
Msg("Reorg: missing block headers in ClickHouse; scheduling repair from RPC")
}

for i := 1; i < len(blockHeaders); i++ {
if blockHeaders[i] == nil || blockHeaders[i].Number == nil || blockHeaders[i-1] == nil || blockHeaders[i-1].Number == nil {
continue
}
if blockHeaders[i].Number.Int64() != blockHeaders[i-1].Number.Int64()+1 {
// non-sequential block numbers
reorgStartBlock = blockHeaders[i-1].Number.Int64()
Expand All @@ -131,7 +159,6 @@ func detectAndHandleReorgs(startBlock int64, endBlock int64) (int64, error) {
}

// set end to the last block if not set
lastHeaderBlock := blockHeaders[len(blockHeaders)-1].Number.Int64()
if reorgEndBlock == -1 {
// No header-based end detected; default to the last header for last-valid-block tracking.
reorgEndBlock = lastHeaderBlock
Expand Down Expand Up @@ -162,6 +189,16 @@ func detectAndHandleReorgs(startBlock int64, endBlock int64) (int64, error) {
finalEnd = reorgEndBlock
}

// missing ClickHouse block headers range
if missingStartBlock > -1 {
if finalStart == -1 || missingStartBlock < finalStart {
finalStart = missingStartBlock
}
if finalEnd == -1 || missingEndBlock > finalEnd {
finalEnd = missingEndBlock
}
}

// transactions range
if txStart > -1 {
if finalStart == -1 || txStart < finalStart {
Expand Down
4 changes: 4 additions & 0 deletions internal/libs/clickhouse.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,10 @@ func GetBlockHeadersForReorgCheck(chainId uint64, startBlockNumber uint64, endBl

// just to make sure the blocks are in the correct order
for _, block := range blocks {
if block.Number == nil {
log.Warn().Msg("GetBlockHeadersForReorgCheck: skipping block header with nil block number")
continue
}
idx := block.Number.Uint64() - sb
if idx >= length {
log.Error().Msgf("Block number %s is out of range", block.Number.String())
Expand Down
Loading