@@ -38,6 +38,7 @@ import (
3838 "github.com/erigontech/erigon/db/kv/prune"
3939 "github.com/erigontech/erigon/db/kv/rawdbv3"
4040 "github.com/erigontech/erigon/db/kv/temporal"
41+ "github.com/erigontech/erigon/db/rawdb"
4142 "github.com/erigontech/erigon/db/snapshotsync"
4243 "github.com/erigontech/erigon/db/snapshotsync/freezeblocks"
4344 "github.com/erigontech/erigon/db/snaptype"
@@ -54,6 +55,10 @@ import (
5455 "github.com/erigontech/erigon/turbo/silkworm"
5556)
5657
58+ // Track mode for logging only on transitions
59+ var lastRetireMode string
60+ var lastPruneMode string
61+
5762type SnapshotsCfg struct {
5863 db kv.TemporalRwDB
5964 chainConfig * chain.Config
@@ -393,10 +398,42 @@ func SnapshotsPrune(s *PruneState, cfg SnapshotsCfg, ctx context.Context, tx kv.
393398
394399 var minBlockNumber uint64
395400
401+ // Calculate blocksInDB to detect backlog needing aggressive retirement
402+ var blocksInDB uint64
403+ chainTip , err := stages .GetStageProgress (tx , stages .Execution )
404+ if err == nil && chainTip > 0 {
405+ firstBlockInDB , ok , _ := rawdb .ReadFirstNonGenesisHeaderNumber (tx )
406+ if ok && firstBlockInDB > 0 && chainTip > firstBlockInDB {
407+ blocksInDB = chainTip - firstBlockInDB
408+ }
409+ }
410+ frozenBlocks := cfg .blockReader .FrozenBlocks ()
411+
412+ // Use aggressive workers when backlog exists, not just during initial sync
413+ retireWorkers := 1
414+ retireMode := "normal"
396415 if s .CurrentSyncCycle .IsInitialCycle {
397- cfg .blockRetire .SetWorkers (estimate .CompressSnapshot .Workers ())
398- } else {
399- cfg .blockRetire .SetWorkers (1 )
416+ retireWorkers = estimate .CompressSnapshot .Workers ()
417+ retireMode = "initialCycle"
418+ } else if blocksInDB > 5_000 {
419+ retireWorkers = estimate .CompressSnapshot .Workers ()
420+ retireMode = "backlog"
421+ }
422+ cfg .blockRetire .SetWorkers (retireWorkers )
423+
424+ // Log only on mode transitions
425+ if retireMode != lastRetireMode {
426+ lastRetireMode = retireMode
427+ if retireMode == "backlog" {
428+ logger .Info ("[OtterSync] retire backlog: on" ,
429+ "workers" , retireWorkers ,
430+ "blocksInDB" , blocksInDB ,
431+ "frozenBlocks" , frozenBlocks )
432+ } else if retireMode == "normal" {
433+ logger .Info ("[OtterSync] retire backlog: off" ,
434+ "blocksInDB" , blocksInDB ,
435+ "frozenBlocks" , frozenBlocks )
436+ }
400437 }
401438
402439 noDl := cfg .snapshotDownloader == nil || reflect .ValueOf (cfg .snapshotDownloader ).IsNil ()
@@ -438,10 +475,44 @@ func SnapshotsPrune(s *PruneState, cfg SnapshotsCfg, ctx context.Context, tx kv.
438475
439476 pruneLimit := 10
440477 pruneTimeout := 125 * time .Millisecond
478+ pruneMode := "normal"
479+ var pruneBlocksInDB uint64
480+
441481 if s .CurrentSyncCycle .IsInitialCycle {
442482 pruneLimit = 10_000
443483 pruneTimeout = time .Hour
484+ pruneMode = "initialCycle"
485+ } else {
486+ // Check for backlog even when not initial cycle
487+ chainTip , _ := stages .GetStageProgress (tx , stages .Execution )
488+ firstBlockInDB , ok , _ := rawdb .ReadFirstNonGenesisHeaderNumber (tx )
489+ if ok && firstBlockInDB > 0 && chainTip > firstBlockInDB {
490+ pruneBlocksInDB = chainTip - firstBlockInDB
491+ if pruneBlocksInDB > 5_000 {
492+ pruneLimit = 10_000
493+ pruneTimeout = time .Hour
494+ pruneMode = "aggressive"
495+ } else if pruneBlocksInDB > 2_500 {
496+ pruneLimit = 1_000
497+ pruneTimeout = 10 * time .Minute
498+ pruneMode = "medium"
499+ }
500+ }
501+ }
502+
503+ // Log only on mode transitions
504+ if pruneMode != lastPruneMode {
505+ prevMode := lastPruneMode
506+ lastPruneMode = pruneMode
507+ if pruneMode == "aggressive" {
508+ logger .Info ("[OtterSync] prune backlog: aggressive" , "limit" , pruneLimit , "blocksInDB" , pruneBlocksInDB )
509+ } else if pruneMode == "medium" {
510+ logger .Info ("[OtterSync] prune backlog: medium" , "limit" , pruneLimit , "blocksInDB" , pruneBlocksInDB )
511+ } else if pruneMode == "normal" && (prevMode == "aggressive" || prevMode == "medium" ) {
512+ logger .Info ("[OtterSync] prune backlog: off" , "blocksInDB" , pruneBlocksInDB )
513+ }
444514 }
515+
445516 if _ , err := cfg .blockRetire .PruneAncientBlocks (tx , pruneLimit , pruneTimeout ); err != nil {
446517 return err
447518 }
0 commit comments