@@ -965,7 +965,7 @@ func (lp *logPoller) backfill(ctx context.Context, start, end int64) error {
965965 }
966966
967967 lp .lggr .Debugw ("Inserting backfilled logs with batch endblock" , "from" , from , "to" , to , "logs" , len (gethLogs ))
968- err = lp .orm .InsertLogsWithBlocks (ctx , convertLogs (gethLogs , blocks , lp .lggr , lp .ec .ConfiguredChainID ()), [] Block { endblock } )
968+ err = lp .orm .InsertLogsWithBlock (ctx , convertLogs (gethLogs , blocks , lp .lggr , lp .ec .ConfiguredChainID ()), endblock )
969969 if err != nil {
970970 lp .lggr .Warnw ("Unable to insert logs, retrying" , "err" , err , "from" , from , "to" , to )
971971 return err
@@ -1187,118 +1187,52 @@ func (lp *logPoller) pollAndSaveLogs(ctx context.Context, currentBlockNumber int
11871187 return fmt .Errorf ("failed to backfill finalized logs: %w" , err )
11881188 }
11891189 currentBlockNumber = lastSafeBackfillBlock + 1
1190- currentBlock , err = lp .getCurrentBlockMaybeHandleReorg (ctx , currentBlockNumber , nil , isReplay )
1191- if err != nil {
1192- // If there's an error handling the reorg, we can't be sure what state the db was left in.
1193- // Resume from the latest block saved.
1194- return fmt .Errorf ("failed to get current block: %w" , err )
1195- }
1196- currentBlockNumber = currentBlock .Number
11971190 }
11981191
11991192 for {
1200- blocks , logs , err := lp .getUnfinalizedLogs (ctx , currentBlock , latestBlockNumber , safeBlockNumber , latestFinalizedBlockNumber , isReplay )
1201- // even if we have an error, we may have partial logs and blocks that can be saved, so we save what we have and then retry.
1202- if len (logs ) > 0 || len (blocks ) > 0 {
1203- lp .lggr .Debugw ("Saving logs" , "logs" , len (logs ), "blocks" , len (blocks ), "currentBlockNumber" , currentBlockNumber )
1204- insertErr := lp .orm .InsertLogsWithBlocks (ctx , logs , blocks )
1205- if insertErr != nil {
1206- lp .lggr .Warnw ("Unable to save logs, retrying later" , "insertErr" , insertErr , "block" , currentBlockNumber , "err" , err )
1207- return nil
1208- }
1209- }
1210-
1211- if err == nil {
1212- if len (blocks ) > 0 {
1213- latestBlockNumber = blocks [len (blocks )- 1 ].BlockNumber
1193+ if currentBlockNumber > currentBlock .Number {
1194+ currentBlock , err = lp .getCurrentBlockMaybeHandleReorg (ctx , currentBlockNumber , nil , isReplay )
1195+ if err != nil {
1196+ // If there's an error handling the reorg, we can't be sure what state the db was left in.
1197+ // Resume from the latest block saved.
1198+ return fmt .Errorf ("failed to get current block: %w" , err )
12141199 }
1215- lp .lggr .Debugw ("Finished processing unfinalized blocks" , "from" , currentBlockNumber , "to" , latestBlockNumber )
1216- return nil
1217- }
1218-
1219- var reorgErr * reorgError
1220- if ! errors .As (err , & reorgErr ) {
1221- return fmt .Errorf ("failed to get unfinalized logs: %w" , err )
1200+ currentBlockNumber = currentBlock .Number
12221201 }
12231202
1224- lp .lggr .Warnw ("Reorg detected during unfinalized log processing, handling reorg" , "err" , err , "currentBlockNumber" , currentBlockNumber , "lastKnownMatchingHead" , reorgErr .ReorgedAt .Number )
1225- currentBlock , err = lp .handleReorg (ctx , reorgErr .ReorgedAt )
1226- if err != nil {
1227- return fmt .Errorf ("failed to handle reorg: %w" , err )
1228- }
1229- currentBlockNumber = currentBlock .Number
1230- lp .lggr .Infow ("Finished handling reorg, resuming log processing from new block after LCA" , "currentBlockNumber" , currentBlock .Number )
1231- }
1232- }
1233-
1234- type reorgError struct {
1235- ReorgedAt * evmtypes.Head
1236- }
1237-
1238- func newReorgError (reorgedAt * evmtypes.Head ) error {
1239- return & reorgError {ReorgedAt : reorgedAt }
1240- }
1241-
1242- func (e * reorgError ) Error () string {
1243- return fmt .Sprintf ("reorg detected at block %d" , e .ReorgedAt .Number )
1244- }
1245-
1246- func (lp * logPoller ) getUnfinalizedLogs (ctx context.Context , currentBlock * evmtypes.Head , latest , safe , finalized int64 , isReplay bool ) ([]Block , []Log , error ) {
1247- const maxUnfinalizedBlocks = 2000
1248- var logs []Log
1249- var blocks []Block
1250- for {
12511203 h := currentBlock .Hash
1252- rpcLogs , err := lp .latencyMonitor .FilterLogs (ctx , lp .Filter (nil , nil , & h ))
1204+ var logs []types.Log
1205+ logs , err = lp .latencyMonitor .FilterLogs (ctx , lp .Filter (nil , nil , & h ))
12531206 if err != nil {
1254- lp .lggr .Warnw ("Unable to query for logs, retrying on next poll " , "err" , err , "block" , currentBlock . Number )
1255- return blocks , logs , fmt . Errorf ( "unable to query for logs: %w" , err )
1207+ lp .lggr .Warnw ("Unable to query for logs, retrying" , "err" , err , "block" , currentBlockNumber )
1208+ return nil
12561209 }
1257- lp .lggr .Debugw ("Unfinalized log query" , "logs" , len (logs ), "currentBlockNumber" , currentBlock . Number , "blockHash" , currentBlock .Hash , "timestamp" , currentBlock .Timestamp )
1210+ lp .lggr .Debugw ("Unfinalized log query" , "logs" , len (logs ), "currentBlockNumber" , currentBlockNumber , "blockHash" , currentBlock .Hash , "timestamp" , currentBlock .Timestamp )
12581211 block := Block {
12591212 BlockHash : h ,
1260- BlockNumber : currentBlock . Number ,
1213+ BlockNumber : currentBlockNumber ,
12611214 BlockTimestamp : currentBlock .Timestamp ,
1262- FinalizedBlockNumber : finalized ,
1263- SafeBlockNumber : safe ,
1264- }
1265- logs = append (logs , convertLogs (rpcLogs , []Block {block }, lp .lggr , lp .ec .ConfiguredChainID ())... )
1266- blocks = append (blocks , block )
1267-
1268- if currentBlock .Number >= latest {
1269- return blocks , logs , nil
1270- }
1271-
1272- if len (blocks ) >= maxUnfinalizedBlocks {
1273- lp .lggr .Warnw ("Too many unfinalized blocks, stopping log retrieval to avoid OOM" , "currentBlockNumber" , currentBlock .Number , "latestBlockNumber" , latest )
1274- return blocks , logs , nil
1275- }
1276-
1277- nextBlock , err := lp .headerByNumber (ctx , currentBlock .Number + 1 )
1215+ FinalizedBlockNumber : latestFinalizedBlockNumber ,
1216+ SafeBlockNumber : safeBlockNumber ,
1217+ }
1218+ err = lp .orm .InsertLogsWithBlock (
1219+ ctx ,
1220+ convertLogs (logs , []Block {block }, lp .lggr , lp .ec .ConfiguredChainID ()),
1221+ block ,
1222+ )
12781223 if err != nil {
1279- lp .lggr .Warnw ("Unable to get next block header, retrying on next poll" , "err" , err , "block" , currentBlock .Number )
1280- return blocks , logs , fmt .Errorf ("unable to get next block: %w" , err )
1281- }
1282-
1283- if nextBlock .ParentHash != currentBlock .Hash {
1284- return blocks , logs , newReorgError (nextBlock )
1224+ lp .lggr .Warnw ("Unable to save logs resuming from last saved block + 1" , "err" , err , "block" , currentBlockNumber )
1225+ return nil
12851226 }
1286-
1287- if isReplay {
1288- // During replay, we also check if the next block matches what we have in the DB to avoid false positives on reorgs due to finality violation.
1289- nextBlockDB , err := lp .orm .SelectBlockByNumber (ctx , nextBlock .Number )
1290- if err != nil && ! pkgerrors .Is (err , sql .ErrNoRows ) {
1291- lp .lggr .Warnw ("Unable to get next block from DB during replay, retrying on next poll" , "err" , err , "block" , nextBlock .Number )
1292- return blocks , logs , fmt .Errorf ("failed to get next block from DB during replay: %w" , err )
1293- }
1294-
1295- if nextBlockDB != nil && nextBlock .Hash != nextBlockDB .BlockHash {
1296- return blocks , logs , newReorgError (nextBlock )
1297- }
1227+ // Update current block.
1228+ // Same reorg detection on unfinalized blocks.
1229+ currentBlockNumber ++
1230+ if currentBlockNumber > latestBlockNumber {
1231+ break
12981232 }
1299-
1300- currentBlock = nextBlock
13011233 }
1234+
1235+ return nil
13021236}
13031237
13041238// Returns information about latestBlock, latestFinalizedBlockNumber provided by HeadTracker
0 commit comments