Skip to content

Commit 63e14ff

Browse files
committed
reduce redundant transactions
1 parent 6675bcb commit 63e14ff

4 files changed

Lines changed: 19 additions & 35 deletions

File tree

cardano-db-sync/src/Cardano/DbSync/Api.hs

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE ApplicativeDo #-}
12
{-# LANGUAGE BangPatterns #-}
23
{-# LANGUAGE FlexibleContexts #-}
34
{-# LANGUAGE GADTs #-}
@@ -43,6 +44,7 @@ module Cardano.DbSync.Api (
4344
generateNewEpochEvents,
4445
logDbState,
4546
convertToPoint,
47+
determineIsolationLevel,
4648
)
4749
where
4850

@@ -91,8 +93,6 @@ import Cardano.DbSync.Ledger.Types (HasLedgerEnv (..), LedgerStateFile (..), Sna
9193
import Cardano.DbSync.LocalStateQuery
9294
import Cardano.DbSync.Types
9395
import Cardano.DbSync.Util
94-
import qualified Hasql.Pipeline as HsqlP
95-
import qualified Hasql.Session as HsqlSes
9696

9797
setConsistentLevel :: SyncEnv -> ConsistentLevel -> IO ()
9898
setConsistentLevel env cst = do
@@ -247,7 +247,7 @@ getInsertOptions :: SyncEnv -> InsertOptions
247247
getInsertOptions = soptInsertOptions . envOptions
248248

249249
getSlotHash :: DB.DbEnv -> SlotNo -> IO [(SlotNo, ByteString)]
250-
getSlotHash backend = DB.runDbDirectSilent backend . DB.querySlotHash
250+
getSlotHash backend slotNo = DB.runDbTransSilent backend (Just DB.ReadCommitted) (DB.querySlotHash slotNo)
251251

252252
hasLedgerState :: SyncEnv -> Bool
253253
hasLedgerState syncEnv =
@@ -269,18 +269,13 @@ getDbLatestBlockInfo dbEnv = do
269269
, bBlockNo = BlockNo . fromMaybe 0 $ DB.blockBlockNo block
270270
}
271271

272-
-- | Pipeline block and points queries in a single transaction for better performance
273-
loadBlockAndPointsData :: DB.DbEnv -> IO (Maybe DB.Block, [(Maybe Word64, ByteString)])
274-
loadBlockAndPointsData dbEnv =
275-
DB.runDbTransSilent dbEnv (Just DB.ReadCommitted) $ do
276-
(mBlockEntity, points) <- DB.runSession DB.mkDbCallStack $
277-
HsqlSes.pipeline $ do
278-
blk <- HsqlP.statement () DB.queryLatestBlockStmt
279-
pts <- HsqlP.statement () DB.queryLatestPointsStmt
280-
pure (blk, pts)
281-
282-
let mBlock = DB.entityVal <$> mBlockEntity
283-
pure (mBlock, points)
272+
-- | Determine isolation level based on sync state
273+
determineIsolationLevel :: SyncEnv -> IO (Maybe DB.IsolationLevel)
274+
determineIsolationLevel syncEnv = do
275+
syncState <- readTVarIO (envDbIsolationState syncEnv)
276+
pure $ case syncState of
277+
DB.SyncLagging -> Just DB.ReadCommitted
278+
DB.SyncFollowing -> Nothing
284279

285280
getDbTipBlockNo :: SyncEnv -> IO (Point.WithOrigin BlockNo)
286281
getDbTipBlockNo env = do
@@ -329,7 +324,7 @@ mkSyncEnv ::
329324
Bool ->
330325
IO SyncEnv
331326
mkSyncEnv metricSetters trce dbEnv syncOptions protoInfo nw maxLovelaceSupply nwMagic systemStart syncNodeConfigFromFile syncNP runNearTipMigrationFnc isJsonbInSchema = do
332-
dbCNamesVar <- newTVarIO =<< DB.runDbDirectSilent dbEnv DB.queryRewardAndEpochStakeConstraints
327+
dbCNamesVar <- newTVarIO =<< DB.runDbTransSilent dbEnv (Just DB.ReadCommitted) DB.queryRewardAndEpochStakeConstraints
333328
cache <-
334329
if soptCache syncOptions
335330
then
@@ -466,7 +461,7 @@ getLatestPoints env = do
466461
verifySnapshotPoint env snapshotPoints
467462
NoLedger _ -> do
468463
-- Brings the 5 latest.
469-
lastPoints <- DB.runDbDirectSilent (envDbEnv env) DB.queryLatestPoints
464+
lastPoints <- DB.runDbTransSilent (envDbEnv env) (Just DB.ReadCommitted) DB.queryLatestPoints
470465
pure $ mapMaybe convert lastPoints
471466
where
472467
convert (Nothing, _) = Nothing
@@ -521,7 +516,7 @@ getBootstrapInProgress ::
521516
DB.DbEnv ->
522517
IO Bool
523518
getBootstrapInProgress trce bootstrapFlag dbEnv = do
524-
DB.runDbDirectSilent dbEnv $ do
519+
DB.runDbTransSilent dbEnv (Just DB.ReadCommitted) $ do
525520
ems <- DB.queryAllExtraMigrations
526521
let btsState = DB.bootstrapState ems
527522
case (bootstrapFlag, btsState) of

cardano-db-sync/src/Cardano/DbSync/Default.hs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ import Cardano.DbSync.Rollback
4646
import Cardano.DbSync.Types
4747
import Cardano.DbSync.Util
4848
import Cardano.DbSync.Util.Constraint (addConstraintsIfNotExist)
49-
import Control.Concurrent.Class.MonadSTM.Strict (readTVarIO)
5049

5150
insertListBlocks ::
5251
SyncEnv ->
@@ -249,13 +248,6 @@ insertBlock syncEnv cblk applyRes firstAfterRollback tookSnapshot = do
249248
blkNo = headerFieldBlockNo $ getHeaderFields cblk
250249

251250
-- | Determine isolation level based on current sync state
252-
determineIsolationLevel :: SyncEnv -> IO (Maybe DB.IsolationLevel)
253-
determineIsolationLevel syncEnv = do
254-
syncState <- readTVarIO (envDbIsolationState syncEnv)
255-
pure $ case syncState of
256-
DB.SyncLagging -> Just DB.ReadCommitted -- Syncing: use ReadCommitted for performance
257-
DB.SyncFollowing -> Nothing -- Following: use default RepeatableRead for consistency
258-
259251
isWithinTwoMin :: SlotDetails -> Bool
260252
isWithinTwoMin sd = isSyncedWithinSeconds sd 120 == SyncFollowing
261253

cardano-db-sync/src/Cardano/DbSync/OffChain.hs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,9 @@ module Cardano.DbSync.OffChain (
2323

2424
import Cardano.BM.Trace (Trace, logInfo)
2525
import qualified Cardano.Db as DB
26-
import Cardano.DbSync.Api
26+
import Cardano.DbSync.Api (determineIsolationLevel, getInsertOptions, getTrace)
2727
import Cardano.DbSync.Api.Types (InsertOptions (..), SyncEnv (..))
2828
import Cardano.DbSync.Config.Types
29-
import qualified Cardano.DbSync.Default as Default
3029
import Cardano.DbSync.OffChain.Http
3130
import Cardano.DbSync.OffChain.Query
3231
import qualified Cardano.DbSync.OffChain.Vote.Types as Vote
@@ -249,9 +248,8 @@ runFetchOffChainPoolThread syncEnv = do
249248
threadSyncEnv = syncEnv {envDbEnv = dbEnv}
250249
forever $ do
251250
tDelay
252-
-- Determine isolation level based on sync state (dynamic optimization)
253-
mIsolationLevel <- Default.determineIsolationLevel syncEnv
254-
-- Use transaction runner with dynamic isolation level to eliminate redundant BEGIN/COMMIT
251+
-- Use dynamic isolation level based on sync state
252+
mIsolationLevel <- determineIsolationLevel syncEnv
255253
_ <-
256254
DB.runDbTransLogged trce dbEnv mIsolationLevel $
257255
loadOffChainPoolWorkQueue trce (envOffChainPoolWorkQueue threadSyncEnv)
@@ -287,9 +285,8 @@ runFetchOffChainVoteThread syncEnv = do
287285
-- Use the thread-specific SyncEnv for all operations
288286
forever $ do
289287
tDelay
290-
-- Determine isolation level based on sync state (dynamic optimization)
291-
mIsolationLevel <- Default.determineIsolationLevel syncEnv
292-
-- Use transaction runner with dynamic isolation level to eliminate redundant BEGIN/COMMIT
288+
-- Use dynamic isolation level based on sync state
289+
mIsolationLevel <- determineIsolationLevel syncEnv
293290
_ <-
294291
DB.runDbTransLogged trce dbEnv mIsolationLevel $
295292
loadOffChainVoteWorkQueue trce (envOffChainVoteWorkQueue threadSyncEnv)

cardano-db-sync/src/Cardano/DbSync/Rollback.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ rollbackFromBlockNo syncEnv blkNo = do
6868

6969
prepareRollback :: SyncEnv -> CardanoPoint -> Tip CardanoBlock -> IO (Either SyncNodeError Bool)
7070
prepareRollback syncEnv point serverTip = do
71-
DB.runDbDirectSilent (envDbEnv syncEnv) $ runExceptT action
71+
DB.runDbTransSilent (envDbEnv syncEnv) (Just DB.ReadCommitted) $ runExceptT action
7272
where
7373
trce = getTrace syncEnv
7474

0 commit comments

Comments
 (0)