Skip to content

Commit 36e01ae

Browse files
committed
Do unsafeRelease when closing all forkers
1 parent 1eabc2b commit 36e01ae

File tree

3 files changed

+23
-10
lines changed
  • ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Storage/LedgerDB

3 files changed

+23
-10
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ closeAllForkers forkersVar = do
705705
forkerEnvs <- Map.elems <$> readTVar forkersVar
706706
writeTVar forkersVar Map.empty
707707
return forkerEnvs
708-
mapM_ closeForkerEnv forkerEnvs
708+
mapM_ (closeForkerEnv True) forkerEnvs
709709

710710
-- | Acquire both a value handle and a db changelog at the tip. Holds a read lock
711711
-- while doing so.
@@ -822,4 +822,4 @@ implForkerClose (LDBHandle varState) forkerKey = do
822822
stateTVar
823823
(ldbForkers ldbEnv)
824824
(Map.updateLookupWithKey (\_ _ -> Nothing) forkerKey)
825-
whenJust envMay closeForkerEnv
825+
whenJust envMay (closeForkerEnv False)

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,17 @@ deriving instance
9090
Close
9191
-------------------------------------------------------------------------------}
9292

93-
closeForkerEnv :: IOLike m => ForkerEnv m l blk -> m ()
94-
closeForkerEnv ForkerEnv{foeBackingStoreValueHandle} = do
95-
either (\(l, _, _) -> atomically . unsafeReleaseReadAccess $ l) (Monad.void . release . fst)
93+
closeForkerEnv :: IOLike m => Bool -> ForkerEnv m l blk -> m ()
94+
closeForkerEnv closingAll ForkerEnv{foeBackingStoreValueHandle} = do
95+
either
96+
(\(l, _, _) -> atomically . unsafeReleaseReadAccess $ l)
97+
( Monad.void
98+
-- During shutdown, we will close all forkers from the main thread
99+
-- instead of from the thread that opened the forker, hence we need
100+
-- unsafeRelease.
101+
. (if closingAll then unsafeRelease else release)
102+
. fst
103+
)
96104
=<< takeMVar foeBackingStoreValueHandle
97105

98106
{-------------------------------------------------------------------------------

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -662,14 +662,19 @@ closeAllForkers ::
662662
m ()
663663
closeAllForkers lock forkersVar = do
664664
toClose <- atomically $ swapTVar forkersVar Map.empty
665-
mapM_ (closeForkerEnv lock) toClose
665+
mapM_ (closeForkerEnv True lock) toClose
666666

667-
closeForkerEnv :: IOLike m => RAWLock m LDBLock -> ForkerEnv m l blk -> m ()
668-
closeForkerEnv lock frkEnv =
667+
closeForkerEnv :: IOLike m => Bool -> RAWLock m LDBLock -> ForkerEnv m l blk -> m ()
668+
closeForkerEnv closingAll lock frkEnv =
669669
RAWLock.withWriteAccess lock $
670670
const $ do
671671
id =<< (atomically $ swapTVar (snd $ foeResourcesToRelease frkEnv) (pure ()))
672-
_ <- release (fst (foeResourcesToRelease frkEnv))
672+
_ <-
673+
-- During shutdown, we will close all forkers from the main thread
674+
-- instead of from the thread that opened the forker, hence we need
675+
-- unsafeRelease.
676+
(if closingAll then unsafeRelease else release)
677+
(fst (foeResourcesToRelease frkEnv))
673678
pure ((), LDBLock)
674679

675680
getForkerEnv ::
@@ -734,7 +739,7 @@ implForkerClose (LDBHandle varState) forkerKey = do
734739
<$> stateTVar
735740
(ldbForkers ldbEnv)
736741
(Map.updateLookupWithKey (\_ _ -> Nothing) forkerKey)
737-
whenJust menv (uncurry closeForkerEnv)
742+
whenJust menv (uncurry (closeForkerEnv False))
738743

739744
newForker ::
740745
( IOLike m

0 commit comments

Comments
 (0)