@@ -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
340344mkInternals ::
@@ -694,17 +698,14 @@ newForkerByRollback h rr n = getEnv h $ \ldbEnv -> do
694698-- | Close all open block and header 'Forker's.
695699closeAllForkers ::
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
0 commit comments