@@ -28,6 +28,7 @@ module ScheduledMerges (
2828 new ,
2929 LookupResult (.. ),
3030 lookup , lookups ,
31+ Op ,
3132 Update (.. ),
3233 update , updates ,
3334 insert , inserts ,
@@ -42,7 +43,9 @@ module ScheduledMerges (
4243 supplyUnionCredits ,
4344
4445 -- * Test and trace
46+ MTree (.. ),
4547 logicalValue ,
48+ Representation ,
4649 dumpRepresentation ,
4750 representationShape ,
4851 Event ,
@@ -65,6 +68,7 @@ import Control.Monad.ST
6568import Control.Tracer (Tracer , contramap , traceWith )
6669import GHC.Stack (HasCallStack , callStack )
6770
71+ import qualified Test.QuickCheck as QC
6872
6973data LSM s = LSMHandle ! (STRef s Counter )
7074 ! (STRef s (LSMContent s ))
@@ -1171,11 +1175,11 @@ expectCompletedMergingTree (MergingTree ref) = do
11711175-- Measurements
11721176--
11731177
1174- data MTree = MLeaf Run
1175- | MNode MergeType [MTree ]
1176- deriving stock Show
1178+ data MTree r = MLeaf r
1179+ | MNode MergeType [MTree r ]
1180+ deriving stock ( Eq , Foldable , Functor , Show )
11771181
1178- allLevels :: LSM s -> ST s (Buffer , [[Run ]], Maybe MTree )
1182+ allLevels :: LSM s -> ST s (Buffer , [[Run ]], Maybe ( MTree Run ) )
11791183allLevels (LSMHandle _ lsmr) = do
11801184 LSMContent wb ls ul <- readSTRef lsmr
11811185 rs <- flattenLevels ls
@@ -1202,7 +1206,7 @@ flattenMergingRun (MergingRun _ ref) = do
12021206 CompletedMerge r -> return [r]
12031207 OngoingMerge _ rs _ -> return rs
12041208
1205- flattenTree :: MergingTree s -> ST s MTree
1209+ flattenTree :: MergingTree s -> ST s ( MTree Run )
12061210flattenTree (MergingTree ref) = do
12071211 mts <- readSTRef ref
12081212 case mts of
@@ -1228,22 +1232,29 @@ logicalValue lsm = do
12281232 mergeRuns :: MergeType -> [Run ] -> Run
12291233 mergeRuns = mergek
12301234
1231- mergeTree :: MTree -> Run
1235+ mergeTree :: MTree Run -> Run
12321236 mergeTree (MLeaf r) = r
12331237 mergeTree (MNode mt ts) = mergeRuns mt (map mergeTree ts)
12341238
12351239 justInsert (Insert v b) = Just (v, b)
12361240 justInsert Delete = Nothing
12371241 justInsert (Mupsert v) = Just (v, Nothing )
12381242
1239- -- TODO: Consider MergingTree, or just remove this function? It's unused.
1240- dumpRepresentation :: LSM s
1241- -> ST s [(Maybe (MergePolicy , MergeType , MergingRunState ), [Run ])]
1243+ type Representation = (Run , [LevelRepresentation ], Maybe (MTree Run ))
1244+
1245+ type LevelRepresentation =
1246+ (Maybe (MergePolicy , MergeType , MergingRunState ), [Run ])
1247+
1248+ dumpRepresentation :: LSM s -> ST s Representation
12421249dumpRepresentation (LSMHandle _ lsmr) = do
1243- LSMContent wb ls _ <- readSTRef lsmr
1244- ((Nothing , [wb]) : ) <$> mapM dumpLevel ls
1250+ LSMContent wb ls ul <- readSTRef lsmr
1251+ levels <- mapM dumpLevel ls
1252+ tree <- case ul of
1253+ NoUnion -> return Nothing
1254+ Union t _ -> Just <$> flattenTree t
1255+ return (wb, levels, tree)
12451256
1246- dumpLevel :: Level s -> ST s ( Maybe ( MergePolicy , MergeType , MergingRunState ), [ Run ])
1257+ dumpLevel :: Level s -> ST s LevelRepresentation
12471258dumpLevel (Level (Single r) rs) =
12481259 return (Nothing , (r: rs))
12491260dumpLevel (Level (Merging mp (MergingRun mt ref)) rs) = do
@@ -1253,14 +1264,17 @@ dumpLevel (Level (Merging mp (MergingRun mt ref)) rs) = do
12531264-- For each level:
12541265-- 1. the runs involved in an ongoing merge
12551266-- 2. the other runs (including completed merge)
1256- representationShape :: [(Maybe (MergePolicy , MergeType , MergingRunState ), [Run ])]
1257- -> [([Int ], [Int ])]
1258- representationShape =
1259- map $ \ (mmr, rs) ->
1267+ representationShape :: Representation
1268+ -> (Int , [([Int ], [Int ])], Maybe (MTree Int ))
1269+ representationShape (wb, levels, tree) =
1270+ (summaryRun wb, map summaryLevel levels, fmap (fmap summaryRun) tree)
1271+ where
1272+ summaryLevel (mmr, rs) =
12601273 let (ongoing, complete) = summaryMR mmr
12611274 in (ongoing, complete <> map summaryRun rs)
1262- where
1275+
12631276 summaryRun = runSize
1277+
12641278 summaryMR = \ case
12651279 Nothing -> ([] , [] )
12661280 Just (_, _, CompletedMerge r) -> ([] , [summaryRun r])
@@ -1297,3 +1311,26 @@ data EventDetail =
12971311 mergeSize :: Int
12981312 }
12991313 deriving stock Show
1314+
1315+ -------------------------------------------------------------------------------
1316+ -- Arbitrary
1317+ --
1318+
1319+ instance QC. Arbitrary Key where
1320+ arbitrary = K <$> QC. arbitrarySizedNatural
1321+ shrink (K v) = K <$> QC. shrink v
1322+
1323+ instance QC. Arbitrary Value where
1324+ arbitrary = V <$> QC. arbitrarySizedNatural
1325+ shrink (V v) = V <$> QC. shrink v
1326+
1327+ instance QC. Arbitrary Blob where
1328+ arbitrary = B <$> QC. arbitrarySizedNatural
1329+ shrink (B v) = B <$> QC. shrink v
1330+
1331+ instance (QC. Arbitrary v , QC. Arbitrary b ) => QC. Arbitrary (Update v b ) where
1332+ arbitrary = QC. frequency
1333+ [ (3 , Insert <$> QC. arbitrary <*> QC. arbitrary)
1334+ , (1 , Mupsert <$> QC. arbitrary)
1335+ , (1 , pure Delete )
1336+ ]
0 commit comments