@@ -21,6 +21,7 @@ import qualified Cardano.Ledger.Alonzo.Scripts as Ledger
21
21
import Cardano.Ledger.Shelley.AdaPots as Shelley
22
22
import Cardano.Prelude
23
23
import Cardano.Slotting.Slot (EpochNo (.. ), SlotNo )
24
+ import Data.List (span )
24
25
import Ouroboros.Consensus.Cardano.Block (HardForkBlock (.. ))
25
26
import qualified Ouroboros.Consensus.HardFork.Combinator as Consensus
26
27
import Ouroboros.Network.Block (blockHash , blockNo , getHeaderFields , headerFieldBlockNo , unBlockNo )
@@ -29,7 +30,7 @@ import qualified Cardano.Db as DB
29
30
import Cardano.DbSync.Api
30
31
import Cardano.DbSync.Api.Ledger
31
32
import Cardano.DbSync.Api.Types (ConsistentLevel (.. ), InsertOptions (.. ), LedgerEnv (.. ), SyncEnv (.. ), SyncOptions (.. ))
32
- import Cardano.DbSync.Config.Types (dncInsertOptions , sioStopAtBlock )
33
+ import Cardano.DbSync.Config.Types (SyncInsertOptions ( .. ), dncInsertOptions )
33
34
import Cardano.DbSync.DbEvent (runDbSyncTransaction )
34
35
import Cardano.DbSync.Epoch (epochHandler )
35
36
import Cardano.DbSync.Era.Byron.Insert (insertByronBlock )
@@ -52,8 +53,37 @@ insertListBlocks ::
52
53
[CardanoBlock ] ->
53
54
IO (Either SyncNodeError () )
54
55
insertListBlocks syncEnv blocks = do
55
- runDbSyncTransaction (getTrace syncEnv) (envDbEnv syncEnv) $ do
56
- traverse_ (applyAndInsertBlockMaybe syncEnv (getTrace syncEnv)) blocks
56
+ case sioStopAtBlock $ dncInsertOptions $ envSyncNodeConfig syncEnv of
57
+ Nothing -> runDbSyncTransaction (getTrace syncEnv) (envDbEnv syncEnv) $ do
58
+ traverse_ (applyAndInsertBlockMaybe syncEnv (getTrace syncEnv)) blocks
59
+ Just targetBlock ->
60
+ insertListBlocksWithStopCondition syncEnv blocks targetBlock
61
+
62
+ insertListBlocksWithStopCondition ::
63
+ SyncEnv ->
64
+ [CardanoBlock ] ->
65
+ Word64 -> -- target block number
66
+ IO (Either SyncNodeError () )
67
+ insertListBlocksWithStopCondition syncEnv blocks targetBlock = do
68
+ -- Find all blocks up to and including the target block
69
+ let (blocksToProcess, _) = span (\ cblk -> unBlockNo (blockNo cblk) <= targetBlock) blocks
70
+
71
+ -- Check if we hit the stop condition in this batch
72
+ let hitStopCondition = any (\ cblk -> unBlockNo (blockNo cblk) >= targetBlock) blocks
73
+
74
+ -- Process the blocks in transaction
75
+ result <- runDbSyncTransaction (getTrace syncEnv) (envDbEnv syncEnv) $ do
76
+ traverse_ (applyAndInsertBlockMaybe syncEnv (getTrace syncEnv)) blocksToProcess
77
+
78
+ -- If we hit the stop condition and transaction succeeded, shutdown
79
+ case result of
80
+ Right () | hitStopCondition -> do
81
+ let tracer = getTrace syncEnv
82
+ liftIO $
83
+ logInfo tracer $
84
+ " Reached stop condition at block " <> textShow targetBlock <> " . Stopping db-sync gracefully."
85
+ pure $ Left $ SNErrDefault (mkSyncNodeCallStack " insertListBlocks" ) " Stop condition reached"
86
+ _ -> pure result
57
87
58
88
applyAndInsertBlockMaybe ::
59
89
SyncEnv ->
@@ -127,16 +157,6 @@ insertBlock syncEnv cblk applyRes firstAfterRollback tookSnapshot = do
127
157
let ! withinHalfHour = isWithinHalfHour details
128
158
insertNewEpochLedgerEvents syncEnv (sdEpochNo details) (apEvents applyResult)
129
159
130
- -- Check stop condition after successful block insertion
131
- let stopAtBlock = sioStopAtBlock $ dncInsertOptions $ envSyncNodeConfig syncEnv
132
- case stopAtBlock of
133
- Just targetBlock | unBlockNo blkNo >= targetBlock -> do
134
- liftIO $
135
- logInfo tracer $
136
- " Reached stop condition at block " <> textShow targetBlock <> " . Stopping db-sync gracefully."
137
- throwError $ SNErrDefault (mkSyncNodeCallStack " insertBlock" ) " Stop condition reached"
138
- _ -> pure ()
139
-
140
160
let isNewEpochEvent = hasNewEpochEvent (apEvents applyResult)
141
161
let isStartEventOrRollback = hasEpochStartEvent (apEvents applyResult) || firstAfterRollback
142
162
let isMember poolId = Set. member poolId (apPoolsRegistered applyResult)
0 commit comments