@@ -134,9 +134,9 @@ writeDatabase env repo WriteContent{..} latency =
134134 --
135135 -- TODO: What if someone is already deduplicating another batch? Should we
136136 -- not write in that case?
137- r <- tryWithMutex (wrLock writing) $ const $
137+ r <- tryWithMutexSafe (wrLock writing) $ \ lock ->
138138 reallyWriteBatch
139- env repo odb lookup writing size False writeBatch writeOwnership
139+ env repo odb lock lookup writing size False writeBatch writeOwnership
140140 case r of
141141 Just cont -> cont
142142 Nothing ->
@@ -148,14 +148,15 @@ reallyWriteBatch
148148 => Env
149149 -> Repo
150150 -> OpenDB s
151+ -> Storage. WriteLock w
151152 -> Lookup
152153 -> Writing
153154 -> Word64 -- ^ original size of the batch
154155 -> Bool -- ^ has the batch already been de-duped?
155156 -> Thrift. Batch
156157 -> Maybe DefineOwnership
157158 -> IO (IO Subst )
158- reallyWriteBatch env repo OpenDB {.. } lookup writing original_size deduped
159+ reallyWriteBatch env repo OpenDB {.. } lock lookup writing original_size deduped
159160 batch@ Thrift. Batch {.. } maybeOwn = do
160161 let ! real_size = batchSize batch
161162 Stats. tick (envStats env) Stats. mutatorThroughput original_size
@@ -191,7 +192,7 @@ reallyWriteBatch env repo OpenDB{..} lookup writing original_size deduped
191192 commitOwnership = do
192193 owned <- mapM (coerce Subst. unsafeSubstIntervalsAndRelease subst)
193194 batch_owned
194- Storage. addOwnership odbHandle owned
195+ Storage. addOwnership odbHandle lock owned
195196 deps <- mapM (substDependencies subst) batch_dependencies
196197 derivedOwners <-
197198 if | Just owners <- maybeOwn -> do
@@ -201,7 +202,7 @@ reallyWriteBatch env repo OpenDB{..} lookup writing original_size deduped
201202 makeDefineOwnership env repo next_id deps
202203 | otherwise -> return Nothing
203204 forM_ derivedOwners $ \ ownBatch ->
204- Storage. addDefineOwnership odbHandle ownBatch
205+ Storage. addDefineOwnership odbHandle lock ownBatch
205206
206207 doCommit =
207208 tick env repo WriteTraceCommit
@@ -228,7 +229,7 @@ reallyWriteBatch env repo OpenDB{..} lookup writing original_size deduped
228229 doCommit
229230 `finally`
230231 do atomically $ writeTVar (wrCommit writing) Nothing
231- withMutex (wrLock writing) $ const $ release facts
232+ withMutexSafe (wrLock writing) $ const $ release facts
232233
233234 new_next_id <- Lookup. firstFreeId facts
234235 atomicWriteIORef (wrNextId writing) new_next_id
@@ -290,8 +291,8 @@ deDupBatch env repo odb lookup writing original_size
290291 forM_ maybeOwn $ \ ownBatch ->
291292 Ownership. substDefineOwnership ownBatch dsubst
292293 -- And now write it do the DB, deduplicating again
293- cont <- withMutex (wrLock writing) $ const $
294- reallyWriteBatch env repo odb lookup writing original_size True
294+ cont <- withMutexSafe (wrLock writing) $ \ lock ->
295+ reallyWriteBatch env repo odb lock lookup writing original_size True
295296 deduped_batch
296297 { Thrift. batch_owned = is
297298 , Thrift. batch_dependencies = deps
0 commit comments