@@ -18,16 +18,14 @@ import Cardano.BM.Trace (logError, logInfo)
18
18
import qualified Cardano.Db as DB
19
19
import Cardano.DbSync.Api
20
20
import Cardano.DbSync.Api.Ledger
21
- import Cardano.DbSync.Api.Types (ConsistentLevel (.. ), InsertOptions (.. ), LedgerEnv ( .. ), SyncEnv (.. ))
21
+ import Cardano.DbSync.Api.Types (ConsistentLevel (.. ), InsertOptions (.. ), SyncEnv (.. ))
22
22
import Cardano.DbSync.Era.Byron.Insert (insertByronBlock )
23
23
import qualified Cardano.DbSync.Era.Shelley.Generic as Generic
24
24
import Cardano.DbSync.Era.Universal.Block (insertBlockUniversal , prepareBlock )
25
25
import Cardano.DbSync.Era.Universal.Epoch (hasEpochStartEvent ) -- , hasNewEpochEvent)
26
26
import Cardano.DbSync.Era.Universal.Insert.LedgerEvent (insertNewEpochLedgerEvents )
27
27
import Cardano.DbSync.Error
28
- import Cardano.DbSync.Ledger.State (applyBlockAndSnapshot , defaultApplyResult )
29
- import Cardano.DbSync.Ledger.Types (ApplyResult (.. ))
30
- import Cardano.DbSync.LocalStateQuery
28
+ import Cardano.DbSync.Ledger.Types
31
29
import Cardano.DbSync.Rollback
32
30
import Cardano.DbSync.Types
33
31
import Cardano.DbSync.Util
@@ -49,6 +47,8 @@ import Cardano.DbSync.Era.Universal.Insert.Grouped (insertBlockGroupedData)
49
47
import Cardano.DbSync.Cache (queryPrevBlockWithCache )
50
48
import Control.Monad.Extra (whenJust )
51
49
import Database.Persist.Sql
50
+ import Cardano.DbSync.Threads.Ledger
51
+ import Control.Concurrent.Class.MonadSTM.Strict (readTMVar )
52
52
53
53
insertListBlocks ::
54
54
SyncEnv ->
@@ -84,7 +84,7 @@ applyAndInsertBlocksMaybe syncEnv = go
84
84
liftIO $ setConsistentLevel syncEnv Consistent
85
85
pure $ Just ls
86
86
Right _ -> do
87
- ( applyRes, _) <- liftIO (mkApplyResult syncEnv cblk False )
87
+ applyRes <- fst <$> liftIO (mkApplyResult syncEnv cblk)
88
88
whenJust (getNewEpoch applyRes) $ \ epochNo ->
89
89
liftIO $ logInfo tracer $ " Reached " <> textShow epochNo
90
90
go rest
@@ -120,7 +120,7 @@ applyAndInsertByronBlock ::
120
120
((DB. BlockId , Bool ), ByronBlock ) ->
121
121
ExceptT SyncNodeError (ReaderT SqlBackend (LoggingT IO )) ()
122
122
applyAndInsertByronBlock syncEnv ((_blockId, firstAfterRollback), blk) = do
123
- (applyResult, tookSnapshot) <- liftIO (mkApplyResult syncEnv (BlockByron blk) True )
123
+ (applyResult, tookSnapshot) <- liftIO (mkApplyResult syncEnv (BlockByron blk)) -- TODO use writeLedgerAction here as well for better performance
124
124
let isStartEventOrRollback = hasEpochStartEvent (apEvents applyResult) || firstAfterRollback
125
125
let details = apSlotDetails applyResult
126
126
insertNewEpochLedgerEvents syncEnv (sdEpochNo (apSlotDetails applyResult)) (apEvents applyResult)
@@ -135,31 +135,50 @@ applyAndInsertBlock ::
135
135
((DB. BlockId , Bool ), CardanoBlock ) ->
136
136
ExceptT SyncNodeError (ReaderT SqlBackend (LoggingT IO )) ()
137
137
applyAndInsertBlock syncEnv ((blockId, firstAfterRollback), cblock) = do
138
- (applyResult, tookSnapshot) <- liftIO (mkApplyResult syncEnv cblock True )
139
- insertNewEpochLedgerEvents syncEnv (sdEpochNo (apSlotDetails applyResult)) (apEvents applyResult)
138
+ applyRessultVar <- liftIO (asyncApplyResult syncEnv cblock)
139
+ -- insertNewEpochLedgerEvents syncEnv (sdEpochNo (apSlotDetails applyResult)) (apEvents applyResult)
140
140
whenGeneric $ \ blk ->
141
- insertBlock syncEnv (blockId, blk) applyResult firstAfterRollback tookSnapshot
141
+ prepareInsertBlock syncEnv (blockId, blk) applyRessultVar firstAfterRollback
142
142
where
143
143
tracer = getTrace syncEnv
144
144
iopts = getInsertOptions syncEnv
145
145
whenGeneric action =
146
146
maybe (liftIO $ logError tracer " Found Byron Block after Shelley" ) action (toGenericBlock iopts cblock)
147
147
148
- insertBlock ::
148
+ prepareInsertBlock ::
149
149
SyncEnv ->
150
150
(DB. BlockId , Generic. Block ) ->
151
- ApplyResult ->
152
- Bool ->
151
+ LedgerResultResTMVar ->
153
152
Bool ->
154
153
ExceptT SyncNodeError (ReaderT SqlBackend (LoggingT IO )) ()
155
- insertBlock syncEnv (blockId, blk) applyResult firstAfterRollback tookSnapshot = do
154
+ prepareInsertBlock syncEnv (blockId, blk) applyRessultVar firstAfterRollback = do
156
155
(blockDB, preparedTxs) <-
157
156
liftIO $ concurrently
158
157
(runOrThrowIO $ runExceptT $ DB. runDbLoggingExceptT backend tracer $ prepareBlock syncEnv blk)
159
158
(mapConcurrently prepareTxWithPool (Generic. blkTxs blk))
160
159
161
160
_minIds <- insertBlockGroupedData syncEnv $ mconcat (snd <$> preparedTxs)
162
- mapM_ (uncurry3 $ insertTxRest syncEnv blockId epochNo slotNo applyResult) (fst <$> preparedTxs)
161
+ (applyResult, tookSnapshot) <- liftIO $ atomically $ readTMVar applyRessultVar
162
+ insertBlockWithLedger syncEnv blockId blockDB blk (fst <$> preparedTxs) applyResult firstAfterRollback tookSnapshot
163
+ where
164
+ prepareTxWithPool tx = runOrThrowIO $ runSqlPoolNoTransaction (prepTx tx) (envPool syncEnv) Nothing
165
+ prepTx = runExceptT . prepareTxGrouped syncEnv [] blockId
166
+
167
+ backend = envBackend syncEnv
168
+ tracer = getTrace syncEnv
169
+
170
+ insertBlockWithLedger ::
171
+ SyncEnv ->
172
+ DB. BlockId ->
173
+ DB. Block ->
174
+ Generic. Block ->
175
+ [(DB. TxId , DB. Tx , Generic. Tx )] ->
176
+ ApplyResult ->
177
+ Bool ->
178
+ Bool ->
179
+ ExceptT SyncNodeError (ReaderT SqlBackend (LoggingT IO )) ()
180
+ insertBlockWithLedger syncEnv blockId blockDB blk txs applyResult firstAfterRollback tookSnapshot = do
181
+ mapM_ (uncurry3 $ insertTxRest syncEnv blockId epochNo slotNo applyResult) txs
163
182
insertBlockUniversal
164
183
syncEnv
165
184
blockId
@@ -174,11 +193,6 @@ insertBlock syncEnv (blockId, blk) applyResult firstAfterRollback tookSnapshot =
174
193
epochNo = sdEpochNo details
175
194
slotNo = sdSlotNo details
176
195
blkNo = Generic. blkBlockNo blk
177
- backend = envBackend syncEnv
178
- tracer = getTrace syncEnv
179
-
180
- prepareTxWithPool tx = runOrThrowIO $ runSqlPoolNoTransaction (prepTx tx) (envPool syncEnv) Nothing
181
- prepTx = runExceptT . prepareTxGrouped syncEnv [] blockId
182
196
183
197
insertBlockRest ::
184
198
SyncEnv ->
@@ -240,17 +254,6 @@ insertBlockRest syncEnv blkNo applyResult tookSnapshot = do
240
254
tracer = getTrace syncEnv
241
255
txOutTableType = getTxOutTableType syncEnv
242
256
243
- mkApplyResult :: SyncEnv -> CardanoBlock -> Bool -> IO (ApplyResult , Bool )
244
- mkApplyResult syncEnv cblk isCons = do
245
- (applyRes, tookSnapshot) <- case envLedgerEnv syncEnv of
246
- HasLedger hle -> applyBlockAndSnapshot hle cblk isCons
247
- NoLedger nle -> do
248
- slotDetails <- getSlotDetailsNode nle (cardanoBlockSlotNo cblk)
249
- pure (defaultApplyResult slotDetails, False )
250
- let details = apSlotDetails applyRes
251
- epochEvents <- liftIO $ atomically $ generateNewEpochEvents syncEnv details
252
- pure (applyRes {apEvents = sort $ epochEvents <> apEvents applyRes}, tookSnapshot)
253
-
254
257
takeWhileByron :: [(a , CardanoBlock )] -> ([(a , ByronBlock )], [(a , CardanoBlock )])
255
258
takeWhileByron = go []
256
259
where
0 commit comments