@@ -935,16 +935,17 @@ checkedUnionDebt tree debtRef = do
935935
936936type 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-
944938updateAcc :: (Op -> Op -> Op ) -> LookupAcc -> Op -> LookupAcc
945939updateAcc _ Nothing old = Just old
946940updateAcc 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