Skip to content

Commit 11bad3a

Browse files
committed
Allocate forker maps in the registries
1 parent 3131f7c commit 11bad3a

File tree

2 files changed

+34
-28
lines changed
  • ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Storage/LedgerDB

2 files changed

+34
-28
lines changed

ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Storage/LedgerDB/V1.hs

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ mkInitDb args bss getBlock =
9090
st <- lgrGenesis
9191
let genesis = forgetLedgerTables st
9292
chlog = DbCh.empty genesis
93+
-- We ignore the ResourceKey here because we only want this to close
94+
-- once the node is shutting down.
9395
(_, backingStore) <-
9496
allocate
9597
lgrRegistry
@@ -120,7 +122,9 @@ mkInitDb args bss getBlock =
120122
(varDB, prevApplied) <-
121123
(,) <$> newTVarIO db <*> newTVarIO Set.empty
122124
flushLock <- mkLedgerDBLock
123-
forkers <- newTVarIO Map.empty
125+
-- We ignore the ResourceKey here because we only want this to close
126+
-- once the node is shutting down.
127+
(_, forkers) <- allocate lgrRegistry (\_ -> newTVarIO Map.empty) closeAllForkers
124128
nextForkerKey <- newTVarIO (ForkerKey 0)
125129
let env =
126130
LedgerDBEnv
@@ -334,7 +338,7 @@ implCloseDB (LDBHandle varState) = do
334338

335339
-- Only when the LedgerDB was open
336340
whenJust mbOpenEnv $ \env -> do
337-
closeAllForkers env
341+
closeAllForkers (ldbForkers env)
338342
bsClose (ldbBackingStore env)
339343

340344
mkInternals ::
@@ -694,17 +698,14 @@ newForkerByRollback h rr n = getEnv h $ \ldbEnv -> do
694698
-- | Close all open block and header 'Forker's.
695699
closeAllForkers ::
696700
IOLike m =>
697-
LedgerDBEnv m l blk ->
701+
StrictTVar m (Map ForkerKey (ForkerEnv m l blk)) ->
698702
m ()
699-
closeAllForkers ldbEnv =
700-
do
701-
forkerEnvs <- atomically $ do
702-
forkerEnvs <- Map.elems <$> readTVar forkersVar
703-
writeTVar forkersVar Map.empty
704-
return forkerEnvs
705-
mapM_ closeForkerEnv forkerEnvs
706-
where
707-
forkersVar = ldbForkers ldbEnv
703+
closeAllForkers forkersVar = do
704+
forkerEnvs <- atomically $ do
705+
forkerEnvs <- Map.elems <$> readTVar forkersVar
706+
writeTVar forkersVar Map.empty
707+
return forkerEnvs
708+
mapM_ closeForkerEnv forkerEnvs
708709

709710
-- | Acquire both a value handle and a db changelog at the tip. Holds a read lock
710711
-- while doing so.
@@ -775,9 +776,13 @@ newForker h ldbEnv rr dblog = readLocked $ do
775776
}
776777
atomically $ do
777778
-- We need to make sure to release this read access when we drop the value
778-
-- handle, so in 'closeForkerEnv' if it wasn't promoted or when promoting it
779-
-- in 'getValueHandle'.
779+
-- handle, so in 'closeForkerEnv' (if it wasn't promoted) or in
780+
-- 'getValueHandle' (if it was promoted).
780781
unsafeAcquireReadAccess (ldbLock ldbEnv)
782+
783+
-- Note that we add the forkerEnv to the 'ldbForkers' so that an exception
784+
-- which will close all the forkers, also closes this one, releasing the
785+
-- read access we acquired above.
781786
modifyTVar (ldbForkers ldbEnv) $ Map.insert forkerKey forkerEnv
782787
traceWith (foeTracer forkerEnv) ForkerOpen
783788
pure $ mkForker h (ldbQueryBatchSize ldbEnv) forkerKey

ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Storage/LedgerDB/V2.hs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,11 @@ mkInitDb args flavArgs getBlock =
9898
, mkLedgerDb = \lseq -> do
9999
varDB <- newTVarIO lseq
100100
prevApplied <- newTVarIO Set.empty
101-
forkers <- newTVarIO Map.empty
102-
nextForkerKey <- newTVarIO (ForkerKey 0)
103101
lock <- RAWLock.new LDBLock
102+
-- We ignore the ResourceKey here because we only want this to close
103+
-- once the node is shutting down.
104+
(_, forkers) <- allocate lgrRegistry (\_ -> newTVarIO Map.empty) (closeAllForkers lock)
105+
nextForkerKey <- newTVarIO (ForkerKey 0)
104106
let env =
105107
LedgerDBEnv
106108
{ ldbSeq = varDB
@@ -421,7 +423,7 @@ implCloseDB (LDBHandle varState) = do
421423

422424
-- Only when the LedgerDB was open
423425
whenJust mbOpenEnv $ \env -> do
424-
closeAllForkers env
426+
closeAllForkers (ldbOpenHandlesLock env) (ldbForkers env)
425427

426428
{-------------------------------------------------------------------------------
427429
The LedgerDBEnv
@@ -655,17 +657,16 @@ newForkerByRollback h rr n = getEnv h $ \ldbEnv ->
655657
-- | Close all open 'Forker's.
656658
closeAllForkers ::
657659
IOLike m =>
658-
LedgerDBEnv m l blk ->
660+
RAWLock m LDBLock ->
661+
StrictTVar m (Map ForkerKey (ForkerEnv m l blk)) ->
659662
m ()
660-
closeAllForkers ldbEnv = do
661-
toClose <- fmap (ldbEnv,) <$> (atomically $ stateTVar forkersVar (,Map.empty))
662-
mapM_ closeForkerEnv toClose
663-
where
664-
forkersVar = ldbForkers ldbEnv
663+
closeAllForkers lock forkersVar = do
664+
toClose <- atomically $ swapTVar forkersVar Map.empty
665+
mapM_ (closeForkerEnv lock) toClose
665666

666-
closeForkerEnv :: IOLike m => (LedgerDBEnv m l blk, ForkerEnv m l blk) -> m ()
667-
closeForkerEnv (LedgerDBEnv{ldbOpenHandlesLock}, frkEnv) =
668-
RAWLock.withWriteAccess ldbOpenHandlesLock $
667+
closeForkerEnv :: IOLike m => RAWLock m LDBLock -> ForkerEnv m l blk -> m ()
668+
closeForkerEnv lock frkEnv =
669+
RAWLock.withWriteAccess lock $
669670
const $ do
670671
id =<< (atomically $ swapTVar (snd $ foeResourcesToRelease frkEnv) (pure ()))
671672
_ <- release (fst (foeResourcesToRelease frkEnv))
@@ -729,11 +730,11 @@ implForkerClose (LDBHandle varState) forkerKey = do
729730
readTVar varState >>= \case
730731
LedgerDBClosed -> pure Nothing
731732
LedgerDBOpen ldbEnv ->
732-
fmap (ldbEnv,)
733+
fmap (ldbOpenHandlesLock ldbEnv,)
733734
<$> stateTVar
734735
(ldbForkers ldbEnv)
735736
(Map.updateLookupWithKey (\_ _ -> Nothing) forkerKey)
736-
whenJust menv closeForkerEnv
737+
whenJust menv (uncurry closeForkerEnv)
737738

738739
newForker ::
739740
( IOLike m

0 commit comments

Comments
 (0)