Skip to content

Commit d78f451

Browse files
committed
MergingTreeData: generate smaller runs
This keeps the runtime of the shrinker tests around 10s with only a small impact on the distribution of generated tests. There is still a decent amount of somewhat long runs (max size is now 50, not 100). Before: run length (1249 in total): 63.23% 10 <= n < 100 36.17% 1 <= n < 10 0.59% n == 0 After: run length (1181 in total): 51.82% 10 <= n < 100 45.39% 1 <= n < 10 2.79% n == 0
1 parent 7a24768 commit d78f451

File tree

1 file changed

+20
-7
lines changed

1 file changed

+20
-7
lines changed

src-extras/Database/LSMTree/Extras/MergingTreeData.hs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,8 @@ genMergingTreeData genKey genVal genBlob =
265265
--
266266
-- The size is measured by the number of MergingTreeData constructors.
267267
genMergingTreeDataOfSize ::
268-
Ord k => Gen k -> Gen v -> Gen b -> Int -> Gen (MergingTreeData k v b)
268+
forall k v b. Ord k
269+
=> Gen k -> Gen v -> Gen b -> Int -> Gen (MergingTreeData k v b)
269270
genMergingTreeDataOfSize genKey genVal genBlob = \n0 -> do
270271
tree <- genMergingTree n0
271272
assert (mergingTreeDataSize tree == n0) $
@@ -277,8 +278,8 @@ genMergingTreeDataOfSize genKey genVal genBlob = \n0 -> do
277278

278279
| n == 1
279280
= QC.oneof
280-
[ CompletedTreeMergeData <$> genRunData genKey genVal genBlob
281-
, OngoingTreeMergeData <$> genMergingRunData arbitrary genKey genVal genBlob
281+
[ CompletedTreeMergeData <$> genRun
282+
, OngoingTreeMergeData <$> genMergingRun arbitrary
282283
, genPendingLevelMergeNoChild
283284
]
284285

@@ -290,12 +291,12 @@ genMergingTreeDataOfSize genKey genVal genBlob = \n0 -> do
290291

291292
-- n == 1
292293
genPendingLevelMergeNoChild = do
293-
numPreExisting <- chooseIntSkewed (0, 5)
294+
numPreExisting <- chooseIntSkewed (0, 6)
294295
initPreExisting <- QC.vectorOf numPreExisting $
295296
-- these can't be last level. we generate the last input below.
296-
genPreExistingRunData (pure MR.MergeMidLevel) genKey genVal genBlob
297+
genPreExistingRun (pure MR.MergeMidLevel)
297298
-- there must be at least one (last) input to the pending merge.
298-
lastPreExisting <- genPreExistingRunData arbitrary genKey genVal genBlob
299+
lastPreExisting <- genPreExistingRun arbitrary
299300
let preExisting = initPreExisting ++ [lastPreExisting]
300301
return (PendingLevelMergeData preExisting Nothing)
301302

@@ -304,7 +305,7 @@ genMergingTreeDataOfSize genKey genVal genBlob = \n0 -> do
304305
numPreExisting <- chooseIntSkewed (0, 6)
305306
preExisting <- QC.vectorOf numPreExisting $
306307
-- there can't be a last level merge, child is last
307-
genPreExistingRunData (pure MR.MergeMidLevel) genKey genVal genBlob
308+
genPreExistingRun (pure MR.MergeMidLevel)
308309
tree <- genMergingTree (n - 1)
309310
return (PendingLevelMergeData preExisting (Just tree))
310311

@@ -313,6 +314,18 @@ genMergingTreeDataOfSize genKey genVal genBlob = \n0 -> do
313314
ns <- QC.shuffle =<< arbitraryPartition2 (n - 1)
314315
PendingUnionMergeData <$> traverse genMergingTree ns
315316

317+
genRun = genScaled genRunData
318+
genMergingRun genType = genScaled (genMergingRunData genType)
319+
genPreExistingRun genType = genScaled (genPreExistingRunData genType)
320+
321+
-- To avoid generating too large test cases, we reduce the number of
322+
-- entries for each run. The size of the individual entries is unaffected.
323+
genScaled :: forall r. (Gen k -> Gen v -> Gen b -> Gen r) -> Gen r
324+
genScaled gen =
325+
QC.sized $ \s ->
326+
QC.scale (`div` 2) $
327+
gen (QC.resize s genKey) (QC.resize s genVal) (QC.resize s genBlob)
328+
316329
-- skewed towards smaller values
317330
chooseIntSkewed (lb, ub) = do
318331
ub' <- QC.chooseInt (lb, ub)

0 commit comments

Comments
 (0)