Skip to content

Commit b22f64c

Browse files
committed
PR 554 follow-up: update some TODOs about exception safety
And remove a stale comment about non-zero cases and replace it by an assertion.
1 parent 7b0d85a commit b22f64c

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/Database/LSMTree/Internal/MergingRun.hs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -712,11 +712,10 @@ performMergeSteps ::
712712
-> Credits
713713
-> m Bool
714714
performMergeSteps mergeVar creditsVar (Credits credits) =
715+
assert (credits >= 0) $
715716
withMVar mergeVar $ \case
716717
CompletedMerge{} -> pure False
717718
OngoingMerge _rs m -> do
718-
-- We have dealt with the case of credits <= 0 above,
719-
-- so here we know credits is positive
720719
let stepsToDo = credits
721720
(stepsDone, stepResult) <- Merge.steps m stepsToDo
722721
assert (stepResult == MergeDone || stepsDone >= stepsToDo) (pure ())
@@ -753,8 +752,9 @@ completeMerge mergeVar mergeKnownCompletedVar = do
753752
(OngoingMerge rs m) -> do
754753
-- first try to complete the merge before performing other side effects,
755754
-- in case the completion fails
756-
--TODO: Run.fromMutable claims not to be exception safe
757-
-- may need to use uninteruptible mask
755+
--TODO: Run.fromMutable (used in Merge.complete) claims not to be
756+
-- exception safe so we should probably be using the resource registry
757+
-- and test for exception safety.
758758
r <- Merge.complete m
759759
V.forM_ rs releaseRef
760760
-- Cache the knowledge that we completed the merge
@@ -778,11 +778,13 @@ expectCompleted (DeRef MergingRun {..}) = do
778778
let totalDebt = numEntriesToTotalDebt mergeNumEntries
779779
suppliedCredits = spentCredits + unspentCredits
780780
!credits = assert (suppliedCredits == totalDebt) $
781+
assert (unspentCredits >= 0) $
781782
unspentCredits
782783

783-
--TODO: what about exception safety: check if it is ok to be interrupted
784-
-- between performMergeSteps and completeMerge here, and above.
785784
weFinishedMerge <- performMergeSteps mergeState mergeCreditsVar credits
785+
-- If an async exception happens before we get to perform the
786+
-- completion, then that is fine. The next 'expectCompleted' will
787+
-- complete the merge.
786788
when weFinishedMerge $ completeMerge mergeState mergeKnownCompleted
787789
withMVar mergeState $ \case
788790
CompletedMerge r -> dupRef r -- return a fresh reference to the run

0 commit comments

Comments
 (0)