Skip to content

Commit 9915ae3

Browse files
committed
prototype: use LookupTree
1 parent 034f718 commit 9915ae3

File tree

1 file changed

+38
-23
lines changed

1 file changed

+38
-23
lines changed

prototypes/ScheduledMerges.hs

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -935,16 +935,17 @@ checkedUnionDebt tree debtRef = do
935935

936936
type LookupAcc = Maybe Op
937937

938-
mergeAcc :: [LookupAcc] -> LookupAcc
939-
mergeAcc = foldl (updateAcc combine) Nothing . catMaybes
940-
941-
unionAcc :: [LookupAcc] -> LookupAcc
942-
unionAcc = foldl (updateAcc combineUnion) Nothing . catMaybes
943-
944938
updateAcc :: (Op -> Op -> Op) -> LookupAcc -> Op -> LookupAcc
945939
updateAcc _ Nothing old = Just old
946940
updateAcc f (Just new_) old = Just (f new_ old) -- acc has more recent Op
947941

942+
mergeAcc :: TreeMergeType -> [LookupAcc] -> LookupAcc
943+
mergeAcc mt = foldl (updateAcc com) Nothing . catMaybes
944+
where
945+
com = case mt of
946+
MergeLevel -> combine
947+
MergeUnion -> combineUnion
948+
948949
-- | We handle lookups by accumulating results by going through the runs from
949950
-- most recent to least recent, starting with the write buffer.
950951
--
@@ -957,8 +958,12 @@ doLookup wb runs ul k = do
957958
NoUnion ->
958959
return (convertAcc acc0)
959960
Union tree _ -> do
960-
accTree <- lookupsTree k tree
961-
return (convertAcc (mergeAcc [acc0, accTree]))
961+
treeBatches <- buildLookupTree tree
962+
let treeResults = lookupBatch Nothing k <$> treeBatches
963+
return $ convertAcc $ foldLookupTree $
964+
if null wb && null runs
965+
then treeResults
966+
else LookupNode MergeLevel [LookupBatch acc0, treeResults ]
962967
where
963968
convertAcc :: LookupAcc -> LookupResult Value Blob
964969
convertAcc = \case
@@ -976,6 +981,10 @@ lookupBatch acc k rs =
976981
let ops = [op | r <- rs, Just op <- [Map.lookup k r]]
977982
in foldl (updateAcc combine) acc ops
978983

984+
data LookupTree a = LookupBatch a
985+
| LookupNode TreeMergeType [LookupTree a]
986+
deriving stock Functor
987+
979988
-- | Do lookups on runs at the leaves and recursively combine the resulting
980989
-- 'LookupAcc's, either using 'mergeAcc' or 'unionAcc' depending on the merge
981990
-- type.
@@ -989,32 +998,38 @@ lookupBatch acc k rs =
989998
-- have a union level) and then do lookups, two batches of lookups have to be
990999
-- performed (plus a batch for the table's regular levels if it has been updated
9911000
-- after the union).
992-
lookupsTree :: Key -> MergingTree s -> ST s LookupAcc
993-
lookupsTree k = go
1001+
--
1002+
-- TODO: we can still improve the batching, for example combining the child of
1003+
-- PendingLevelMerge with the pre-existing runs when it is already completed.
1004+
buildLookupTree :: MergingTree s -> ST s (LookupTree [Run])
1005+
buildLookupTree = go
9941006
where
995-
go :: MergingTree s -> ST s LookupAcc
1007+
go :: MergingTree s -> ST s (LookupTree [Run])
9961008
go (MergingTree treeState) = readSTRef treeState >>= \case
9971009
CompletedTreeMerge r ->
998-
return $ lookupBatch' [r]
1010+
return $ LookupBatch [r]
9991011
OngoingTreeMerge (MergingRun mt _ mergeState) ->
10001012
readSTRef mergeState >>= \case
10011013
CompletedMerge r ->
1002-
return $ lookupBatch' [r]
1014+
return $ LookupBatch [r]
10031015
OngoingMerge _ rs _ -> case mt of
1004-
MergeLevel -> return $ lookupBatch' rs -- combine into batch
1005-
MergeUnion -> return $ unionAcc (map (\r -> lookupBatch' [r]) rs)
1006-
PendingTreeMerge (PendingUnionMerge trees) -> do
1007-
unionAcc <$> traverse go trees
1016+
MergeLevel -> return $ LookupBatch rs -- combine into batch
1017+
MergeUnion -> return $ LookupNode MergeUnion $ map (\r -> LookupBatch [r]) rs
10081018
PendingTreeMerge (PendingLevelMerge prs tree) -> do
1009-
runs <- concat <$> traverse flattenPreExistingRun prs -- combine into batch
1010-
let acc0 = lookupBatch' runs
1019+
preExisting <- LookupBatch . concat <$>
1020+
traverse flattenPreExistingRun prs -- combine into batch
10111021
case tree of
1012-
Nothing -> return acc0 -- only runs and merging level runs, done
1022+
Nothing -> return preExisting
10131023
Just t -> do
1014-
accTree <- go t
1015-
return (mergeAcc [acc0, accTree])
1024+
lTree <- go t
1025+
return (LookupNode MergeLevel [preExisting, lTree])
1026+
PendingTreeMerge (PendingUnionMerge trees) -> do
1027+
LookupNode MergeUnion <$> traverse go trees
10161028

1017-
lookupBatch' = lookupBatch Nothing k
1029+
foldLookupTree :: LookupTree LookupAcc -> LookupAcc
1030+
foldLookupTree = \case
1031+
LookupBatch acc -> acc
1032+
LookupNode mt children -> mergeAcc mt (map foldLookupTree children)
10181033

10191034
-------------------------------------------------------------------------------
10201035
-- Nominal credits

0 commit comments

Comments
 (0)