Skip to content

Commit 25a5a16

Browse files
committed
Try supporting V1 snapshot format
Partly to see how the scheme works in practice. It looks like we have to _not_ match on the version most of the time.
1 parent e491590 commit 25a5a16

File tree

3 files changed

+69
-47
lines changed

3 files changed

+69
-47
lines changed

bench/macro/lsm-tree-bench-wp8.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ doRun gopts opts = do
594594
tbl <- if check opts
595595
then let conf = mkTableConfigRun gopts opts benchTableConfig
596596
in LSM.newTableWith @IO @K @V @B conf session
597-
else let conf = mkOverrideDiskCachePolicy gopts opts
597+
else let conf = mkTableConfigOverride gopts opts
598598
in LSM.openTableFromSnapshotWith @IO @K @V @B conf session name label
599599

600600
-- In checking mode, compare each output against a pure reference.

src/Database/LSMTree/Internal/Snapshot/Codec.hs

Lines changed: 66 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import Codec.CBOR.Decoding
2222
import Codec.CBOR.Encoding
2323
import Codec.CBOR.Read
2424
import Codec.CBOR.Write
25-
import Control.Monad (unless)
2625
import Control.Monad.Class.MonadThrow (Exception (displayException),
2726
MonadThrow (..))
2827
import Data.Bifunctor (Bifunctor (..))
@@ -58,23 +57,25 @@ import Text.Printf
5857
-- for more. Forwards compatibility is not provided at all: snapshots with a
5958
-- later version than the current version for the library release will always
6059
-- fail.
61-
data SnapshotVersion = V0
62-
deriving stock (Show, Eq)
60+
data SnapshotVersion = V0 | V1
61+
deriving stock (Show, Eq, Ord)
6362

6463
-- >>> prettySnapshotVersion currentSnapshotVersion
65-
-- "v0"
64+
-- "1"
6665
prettySnapshotVersion :: SnapshotVersion -> String
6766
prettySnapshotVersion V0 = "v0"
67+
prettySnapshotVersion V1 = "v1"
6868

6969
-- >>> currentSnapshotVersion
7070
-- V0
7171
currentSnapshotVersion :: SnapshotVersion
72-
currentSnapshotVersion = V0
72+
currentSnapshotVersion = V1
7373

7474
isCompatible :: SnapshotVersion -> Either String ()
75-
isCompatible otherVersion = do
76-
case ( currentSnapshotVersion, otherVersion ) of
77-
(V0, V0) -> Right ()
75+
isCompatible otherVersion
76+
-- for the moment, all versions are backwards compatible:
77+
| currentSnapshotVersion >= otherVersion = Right ()
78+
| otherwise = Left "forward compatibility not supported"
7879

7980
{-------------------------------------------------------------------------------
8081
Writing and reading files
@@ -198,13 +199,15 @@ instance Encode SnapshotVersion where
198199
encodeListLen 1
199200
<> case ver of
200201
V0 -> encodeWord 0
202+
V1 -> encodeWord 1
201203

202204
instance Decode SnapshotVersion where
203205
decode = do
204206
_ <- decodeListLenOf 1
205207
ver <- decodeWord
206208
case ver of
207209
0 -> pure V0
210+
1 -> pure V1
208211
_ -> fail ("Unknown snapshot format version number: " <> show ver)
209212

210213
{-------------------------------------------------------------------------------
@@ -232,13 +235,22 @@ instance DecodeVersioned SnapshotMetaData where
232235
<*> decodeVersioned ver
233236
<*> decodeMaybe ver
234237

238+
decodeVersioned V1 = do
239+
_ <- decodeListLenOf 5
240+
SnapshotMetaData
241+
<$> decodeVersioned V0
242+
<*> decodeVersioned V1
243+
<*> decodeVersioned V0
244+
<*> decodeVersioned V0
245+
<*> decodeMaybe V0
246+
235247
-- SnapshotLabel
236248

237249
instance Encode SnapshotLabel where
238250
encode (SnapshotLabel s) = encodeString s
239251

240252
instance DecodeVersioned SnapshotLabel where
241-
decodeVersioned V0 = SnapshotLabel <$> decodeString
253+
decodeVersioned _v = SnapshotLabel <$> decodeString
242254

243255
instance Encode SnapshotRun where
244256
encode SnapshotRun { snapRunNumber, snapRunCaching, snapRunIndex } =
@@ -249,7 +261,7 @@ instance Encode SnapshotRun where
249261
<> encode snapRunIndex
250262

251263
instance DecodeVersioned SnapshotRun where
252-
decodeVersioned v@V0 = do
264+
decodeVersioned v = do
253265
n <- decodeListLen
254266
tag <- decodeWord
255267
case (n, tag) of
@@ -290,19 +302,28 @@ instance Encode TableConfig where
290302

291303
instance DecodeVersioned TableConfig where
292304
decodeVersioned v@V0 = do
293-
n <- decodeListLen
294-
unless (n >= 7 && n <= 8) $
295-
fail "TableConfig: expected record of length 7 or 8"
305+
decodeListLenOf 7
306+
confMergePolicy <- decodeVersioned v
307+
confMergeSchedule <- decodeVersioned v
308+
confSizeRatio <- decodeVersioned v
309+
confWriteBufferAlloc <- decodeVersioned v
310+
confBloomFilterAlloc <- decodeVersioned v
311+
confFencePointerIndex <- decodeVersioned v
312+
confDiskCachePolicy <- decodeVersioned v
313+
let confMergeBatchSize = case confWriteBufferAlloc of
314+
AllocNumEntries n -> MergeBatchSize n
315+
pure TableConfig {..}
316+
317+
decodeVersioned v@V1 = do
318+
decodeListLenOf 8
296319
confMergePolicy <- decodeVersioned v
297320
confMergeSchedule <- decodeVersioned v
298321
confSizeRatio <- decodeVersioned v
299322
confWriteBufferAlloc <- decodeVersioned v
300323
confBloomFilterAlloc <- decodeVersioned v
301324
confFencePointerIndex <- decodeVersioned v
302325
confDiskCachePolicy <- decodeVersioned v
303-
confMergeBatchSize <- if n == 8
304-
then decodeVersioned v
305-
else pure (confMergeBatchSize defaultTableConfig)
326+
confMergeBatchSize <- decodeVersioned v
306327
pure TableConfig {..}
307328

308329
-- MergePolicy
@@ -311,7 +332,7 @@ instance Encode MergePolicy where
311332
encode LazyLevelling = encodeWord 0
312333

313334
instance DecodeVersioned MergePolicy where
314-
decodeVersioned V0 = do
335+
decodeVersioned _v = do
315336
tag <- decodeWord
316337
case tag of
317338
0 -> pure LazyLevelling
@@ -323,7 +344,7 @@ instance Encode SizeRatio where
323344
encode Four = encodeInt 4
324345

325346
instance DecodeVersioned SizeRatio where
326-
decodeVersioned V0 = do
347+
decodeVersioned _v = do
327348
x <- decodeWord64
328349
case x of
329350
4 -> pure Four
@@ -338,7 +359,7 @@ instance Encode WriteBufferAlloc where
338359
<> encodeInt numEntries
339360

340361
instance DecodeVersioned WriteBufferAlloc where
341-
decodeVersioned V0 = do
362+
decodeVersioned _v = do
342363
_ <- decodeListLenOf 2
343364
tag <- decodeWord
344365
case tag of
@@ -356,7 +377,7 @@ instance Encode RunParams where
356377
<> encode runParamIndex
357378

358379
instance DecodeVersioned RunParams where
359-
decodeVersioned v@V0 = do
380+
decodeVersioned v = do
360381
n <- decodeListLen
361382
tag <- decodeWord
362383
case (n, tag) of
@@ -371,7 +392,7 @@ instance Encode RunDataCaching where
371392
encode NoCacheRunData = encodeWord 1
372393

373394
instance DecodeVersioned RunDataCaching where
374-
decodeVersioned V0 = do
395+
decodeVersioned _v = do
375396
tag <- decodeWord
376397
case tag of
377398
0 -> pure CacheRunData
@@ -383,7 +404,7 @@ instance Encode IndexType where
383404
encode Compact = encodeWord 1
384405

385406
instance DecodeVersioned IndexType where
386-
decodeVersioned V0 = do
407+
decodeVersioned _v = do
387408
tag <- decodeWord
388409
case tag of
389410
0 -> pure Ordinary
@@ -401,7 +422,7 @@ instance Encode RunBloomFilterAlloc where
401422
<> encodeDouble fpr
402423

403424
instance DecodeVersioned RunBloomFilterAlloc where
404-
decodeVersioned V0 = do
425+
decodeVersioned _v = do
405426
n <- decodeListLen
406427
tag <- decodeWord
407428
case (n, tag) of
@@ -422,7 +443,7 @@ instance Encode BloomFilterAlloc where
422443
<> encodeDouble x
423444

424445
instance DecodeVersioned BloomFilterAlloc where
425-
decodeVersioned V0 = do
446+
decodeVersioned _v = do
426447
n <- decodeListLen
427448
tag <- decodeWord
428449
case (n, tag) of
@@ -455,7 +476,7 @@ instance Encode FencePointerIndexType where
455476
encode OrdinaryIndex = encodeWord 1
456477

457478
instance DecodeVersioned FencePointerIndexType where
458-
decodeVersioned V0 = do
479+
decodeVersioned _v = do
459480
tag <- decodeWord
460481
case tag of
461482
0 -> pure CompactIndex
@@ -477,7 +498,7 @@ instance Encode DiskCachePolicy where
477498
<> encodeWord 2
478499

479500
instance DecodeVersioned DiskCachePolicy where
480-
decodeVersioned V0 = do
501+
decodeVersioned _v = do
481502
n <- decodeListLen
482503
tag <- decodeWord
483504
case (n, tag) of
@@ -493,7 +514,7 @@ instance Encode MergeSchedule where
493514
encode Incremental = encodeWord 1
494515

495516
instance DecodeVersioned MergeSchedule where
496-
decodeVersioned V0 = do
517+
decodeVersioned _v = do
497518
tag <- decodeWord
498519
case tag of
499520
0 -> pure OneShot
@@ -506,7 +527,7 @@ instance Encode MergeBatchSize where
506527
encode (MergeBatchSize n) = encodeInt n
507528

508529
instance DecodeVersioned MergeBatchSize where
509-
decodeVersioned V0 = MergeBatchSize <$> decodeInt
530+
decodeVersioned _v = MergeBatchSize <$> decodeInt
510531

511532
{-------------------------------------------------------------------------------
512533
Encoding and decoding: SnapLevels
@@ -518,7 +539,7 @@ instance Encode r => Encode (SnapLevels r) where
518539
encode (SnapLevels levels) = encode levels
519540

520541
instance DecodeVersioned r => DecodeVersioned (SnapLevels r) where
521-
decodeVersioned v@V0 = SnapLevels <$> decodeVersioned v
542+
decodeVersioned v = SnapLevels <$> decodeVersioned v
522543

523544
-- SnapLevel
524545

@@ -530,7 +551,7 @@ instance Encode r => Encode (SnapLevel r) where
530551

531552

532553
instance DecodeVersioned r => DecodeVersioned (SnapLevel r) where
533-
decodeVersioned v@V0 = do
554+
decodeVersioned v = do
534555
_ <- decodeListLenOf 2
535556
SnapLevel <$> decodeVersioned v <*> decodeVersioned v
536557

@@ -548,7 +569,7 @@ instance Encode RunNumber where
548569
encode (RunNumber x) = encodeInt x
549570

550571
instance DecodeVersioned RunNumber where
551-
decodeVersioned V0 = RunNumber <$> decodeInt
572+
decodeVersioned _v = RunNumber <$> decodeInt
552573

553574
-- SnapIncomingRun
554575

@@ -566,7 +587,7 @@ instance Encode r => Encode (SnapIncomingRun r) where
566587
<> encode x
567588

568589
instance DecodeVersioned r => DecodeVersioned (SnapIncomingRun r) where
569-
decodeVersioned v@V0 = do
590+
decodeVersioned v = do
570591
n <- decodeListLen
571592
tag <- decodeWord
572593
case (n, tag) of
@@ -583,7 +604,7 @@ instance Encode MergePolicyForLevel where
583604
encode LevelLevelling = encodeWord 1
584605

585606
instance DecodeVersioned MergePolicyForLevel where
586-
decodeVersioned V0 = do
607+
decodeVersioned _v = do
587608
tag <- decodeWord
588609
case tag of
589610
0 -> pure LevelTiering
@@ -607,7 +628,7 @@ instance (Encode t, Encode r) => Encode (SnapMergingRun t r) where
607628
<> encode mt
608629

609630
instance (DecodeVersioned t, DecodeVersioned r) => DecodeVersioned (SnapMergingRun t r) where
610-
decodeVersioned v@V0 = do
631+
decodeVersioned v = do
611632
n <- decodeListLen
612633
tag <- decodeWord
613634
case (n, tag) of
@@ -623,25 +644,25 @@ instance Encode NominalDebt where
623644
encode (NominalDebt x) = encodeInt x
624645

625646
instance DecodeVersioned NominalDebt where
626-
decodeVersioned V0 = NominalDebt <$> decodeInt
647+
decodeVersioned _v = NominalDebt <$> decodeInt
627648

628649
instance Encode NominalCredits where
629650
encode (NominalCredits x) = encodeInt x
630651

631652
instance DecodeVersioned NominalCredits where
632-
decodeVersioned V0 = NominalCredits <$> decodeInt
653+
decodeVersioned _v = NominalCredits <$> decodeInt
633654

634655
instance Encode MergeDebt where
635656
encode (MergeDebt (MergeCredits x)) = encodeInt x
636657

637658
instance DecodeVersioned MergeDebt where
638-
decodeVersioned V0 = (MergeDebt . MergeCredits) <$> decodeInt
659+
decodeVersioned _v = (MergeDebt . MergeCredits) <$> decodeInt
639660

640661
instance Encode MergeCredits where
641662
encode (MergeCredits x) = encodeInt x
642663

643664
instance DecodeVersioned MergeCredits where
644-
decodeVersioned V0 = MergeCredits <$> decodeInt
665+
decodeVersioned _v = MergeCredits <$> decodeInt
645666

646667
-- MergeType
647668

@@ -650,7 +671,7 @@ instance Encode MR.LevelMergeType where
650671
encode MR.MergeLastLevel = encodeWord 1
651672

652673
instance DecodeVersioned MR.LevelMergeType where
653-
decodeVersioned V0 = do
674+
decodeVersioned _v = do
654675
tag <- decodeWord
655676
case tag of
656677
0 -> pure MR.MergeMidLevel
@@ -672,7 +693,7 @@ instance Encode MR.TreeMergeType where
672693
encode MR.MergeUnion = encodeWord 2
673694

674695
instance DecodeVersioned MR.TreeMergeType where
675-
decodeVersioned V0 = do
696+
decodeVersioned _v = do
676697
tag <- decodeWord
677698
case tag of
678699
1 -> pure MR.MergeLevel
@@ -689,7 +710,7 @@ instance Encode r => Encode (SnapMergingTree r) where
689710
encode (SnapMergingTree tState) = encode tState
690711

691712
instance DecodeVersioned r => DecodeVersioned (SnapMergingTree r) where
692-
decodeVersioned ver@V0 = SnapMergingTree <$> decodeVersioned ver
713+
decodeVersioned ver = SnapMergingTree <$> decodeVersioned ver
693714

694715
-- SnapMergingTreeState
695716

@@ -708,7 +729,7 @@ instance Encode r => Encode (SnapMergingTreeState r) where
708729
<> encode smrs
709730

710731
instance DecodeVersioned r => DecodeVersioned (SnapMergingTreeState r) where
711-
decodeVersioned v@V0 = do
732+
decodeVersioned v = do
712733
n <- decodeListLen
713734
tag <- decodeWord
714735
case (n, tag) of
@@ -731,7 +752,7 @@ instance Encode r => Encode (SnapPendingMerge r) where
731752
<> encodeList mts
732753

733754
instance DecodeVersioned r => DecodeVersioned (SnapPendingMerge r) where
734-
decodeVersioned v@V0 = do
755+
decodeVersioned v = do
735756
n <- decodeListLen
736757
tag <- decodeWord
737758
case (n, tag) of
@@ -752,7 +773,7 @@ instance Encode r => Encode (SnapPreExistingRun r) where
752773
<> encode smrs
753774

754775
instance DecodeVersioned r => DecodeVersioned (SnapPreExistingRun r) where
755-
decodeVersioned v@V0 = do
776+
decodeVersioned v = do
756777
n <- decodeListLen
757778
tag <- decodeWord
758779
case (n, tag) of
@@ -770,7 +791,7 @@ encodeMaybe = \case
770791
Just en -> encode en
771792

772793
decodeMaybe :: DecodeVersioned a => SnapshotVersion -> Decoder s (Maybe a)
773-
decodeMaybe v@V0 = do
794+
decodeMaybe v = do
774795
tok <- peekTokenType
775796
case tok of
776797
TypeNull -> Nothing <$ decodeNull

test/Test/Database/LSMTree/Internal/Snapshot/Codec.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,9 @@ testAll test = [
191191
-------------------------------------------------------------------------------}
192192

193193
instance Arbitrary SnapshotVersion where
194-
arbitrary = elements [V0]
194+
arbitrary = elements [V0, V1]
195195
shrink V0 = []
196+
shrink V1 = [V0]
196197

197198
deriving newtype instance Arbitrary a => Arbitrary (Versioned a)
198199

0 commit comments

Comments
 (0)