@@ -18,16 +18,14 @@ import Cardano.BM.Trace (logError, logInfo)
1818import qualified Cardano.Db as DB
1919import Cardano.DbSync.Api
2020import Cardano.DbSync.Api.Ledger
21- import Cardano.DbSync.Api.Types (ConsistentLevel (.. ), InsertOptions (.. ), LedgerEnv ( .. ), SyncEnv (.. ))
21+ import Cardano.DbSync.Api.Types (ConsistentLevel (.. ), InsertOptions (.. ), SyncEnv (.. ))
2222import Cardano.DbSync.Era.Byron.Insert (insertByronBlock )
2323import qualified Cardano.DbSync.Era.Shelley.Generic as Generic
2424import Cardano.DbSync.Era.Universal.Block (insertBlockUniversal , prepareBlock )
2525import Cardano.DbSync.Era.Universal.Epoch (hasEpochStartEvent ) -- , hasNewEpochEvent)
2626import Cardano.DbSync.Era.Universal.Insert.LedgerEvent (insertNewEpochLedgerEvents )
2727import 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
3129import Cardano.DbSync.Rollback
3230import Cardano.DbSync.Types
3331import Cardano.DbSync.Util
@@ -49,6 +47,8 @@ import Cardano.DbSync.Era.Universal.Insert.Grouped (insertBlockGroupedData)
4947import Cardano.DbSync.Cache (queryPrevBlockWithCache )
5048import Control.Monad.Extra (whenJust )
5149import Database.Persist.Sql
50+ import Cardano.DbSync.Threads.Ledger
51+ import Control.Concurrent.Class.MonadSTM.Strict (readTMVar )
5252
5353insertListBlocks ::
5454 SyncEnv ->
@@ -84,7 +84,7 @@ applyAndInsertBlocksMaybe syncEnv = go
8484 liftIO $ setConsistentLevel syncEnv Consistent
8585 pure $ Just ls
8686 Right _ -> do
87- ( applyRes, _) <- liftIO (mkApplyResult syncEnv cblk False )
87+ applyRes <- fst <$> liftIO (mkApplyResult syncEnv cblk)
8888 whenJust (getNewEpoch applyRes) $ \ epochNo ->
8989 liftIO $ logInfo tracer $ " Reached " <> textShow epochNo
9090 go rest
@@ -120,7 +120,7 @@ applyAndInsertByronBlock ::
120120 ((DB. BlockId , Bool ), ByronBlock ) ->
121121 ExceptT SyncNodeError (ReaderT SqlBackend (LoggingT IO )) ()
122122applyAndInsertByronBlock 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
124124 let isStartEventOrRollback = hasEpochStartEvent (apEvents applyResult) || firstAfterRollback
125125 let details = apSlotDetails applyResult
126126 insertNewEpochLedgerEvents syncEnv (sdEpochNo (apSlotDetails applyResult)) (apEvents applyResult)
@@ -135,31 +135,50 @@ applyAndInsertBlock ::
135135 ((DB. BlockId , Bool ), CardanoBlock ) ->
136136 ExceptT SyncNodeError (ReaderT SqlBackend (LoggingT IO )) ()
137137applyAndInsertBlock 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)
140140 whenGeneric $ \ blk ->
141- insertBlock syncEnv (blockId, blk) applyResult firstAfterRollback tookSnapshot
141+ prepareInsertBlock syncEnv (blockId, blk) applyRessultVar firstAfterRollback
142142 where
143143 tracer = getTrace syncEnv
144144 iopts = getInsertOptions syncEnv
145145 whenGeneric action =
146146 maybe (liftIO $ logError tracer " Found Byron Block after Shelley" ) action (toGenericBlock iopts cblock)
147147
148- insertBlock ::
148+ prepareInsertBlock ::
149149 SyncEnv ->
150150 (DB. BlockId , Generic. Block ) ->
151- ApplyResult ->
152- Bool ->
151+ LedgerResultResTMVar ->
153152 Bool ->
154153 ExceptT SyncNodeError (ReaderT SqlBackend (LoggingT IO )) ()
155- insertBlock syncEnv (blockId, blk) applyResult firstAfterRollback tookSnapshot = do
154+ prepareInsertBlock syncEnv (blockId, blk) applyRessultVar firstAfterRollback = do
156155 (blockDB, preparedTxs) <-
157156 liftIO $ concurrently
158157 (runOrThrowIO $ runExceptT $ DB. runDbLoggingExceptT backend tracer $ prepareBlock syncEnv blk)
159158 (mapConcurrently prepareTxWithPool (Generic. blkTxs blk))
160159
161160 _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
163182 insertBlockUniversal
164183 syncEnv
165184 blockId
@@ -174,11 +193,6 @@ insertBlock syncEnv (blockId, blk) applyResult firstAfterRollback tookSnapshot =
174193 epochNo = sdEpochNo details
175194 slotNo = sdSlotNo details
176195 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
182196
183197insertBlockRest ::
184198 SyncEnv ->
@@ -240,17 +254,6 @@ insertBlockRest syncEnv blkNo applyResult tookSnapshot = do
240254 tracer = getTrace syncEnv
241255 txOutTableType = getTxOutTableType syncEnv
242256
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-
254257takeWhileByron :: [(a , CardanoBlock )] -> ([(a , ByronBlock )], [(a , CardanoBlock )])
255258takeWhileByron = go []
256259 where
0 commit comments