@@ -22,7 +22,6 @@ import Codec.CBOR.Decoding
22
22
import Codec.CBOR.Encoding
23
23
import Codec.CBOR.Read
24
24
import Codec.CBOR.Write
25
- import Control.Monad (unless )
26
25
import Control.Monad.Class.MonadThrow (Exception (displayException ),
27
26
MonadThrow (.. ))
28
27
import Data.Bifunctor (Bifunctor (.. ))
@@ -58,23 +57,25 @@ import Text.Printf
58
57
-- for more. Forwards compatibility is not provided at all: snapshots with a
59
58
-- later version than the current version for the library release will always
60
59
-- fail.
61
- data SnapshotVersion = V0
62
- deriving stock (Show , Eq )
60
+ data SnapshotVersion = V0 | V1
61
+ deriving stock (Show , Eq , Ord )
63
62
64
63
-- >>> prettySnapshotVersion currentSnapshotVersion
65
- -- "v0 "
64
+ -- "1 "
66
65
prettySnapshotVersion :: SnapshotVersion -> String
67
66
prettySnapshotVersion V0 = " v0"
67
+ prettySnapshotVersion V1 = " v1"
68
68
69
69
-- >>> currentSnapshotVersion
70
70
-- V0
71
71
currentSnapshotVersion :: SnapshotVersion
72
- currentSnapshotVersion = V0
72
+ currentSnapshotVersion = V1
73
73
74
74
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"
78
79
79
80
{- ------------------------------------------------------------------------------
80
81
Writing and reading files
@@ -198,13 +199,15 @@ instance Encode SnapshotVersion where
198
199
encodeListLen 1
199
200
<> case ver of
200
201
V0 -> encodeWord 0
202
+ V1 -> encodeWord 1
201
203
202
204
instance Decode SnapshotVersion where
203
205
decode = do
204
206
_ <- decodeListLenOf 1
205
207
ver <- decodeWord
206
208
case ver of
207
209
0 -> pure V0
210
+ 1 -> pure V1
208
211
_ -> fail (" Unknown snapshot format version number: " <> show ver)
209
212
210
213
{- ------------------------------------------------------------------------------
@@ -232,13 +235,22 @@ instance DecodeVersioned SnapshotMetaData where
232
235
<*> decodeVersioned ver
233
236
<*> decodeMaybe ver
234
237
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
+
235
247
-- SnapshotLabel
236
248
237
249
instance Encode SnapshotLabel where
238
250
encode (SnapshotLabel s) = encodeString s
239
251
240
252
instance DecodeVersioned SnapshotLabel where
241
- decodeVersioned V0 = SnapshotLabel <$> decodeString
253
+ decodeVersioned _v = SnapshotLabel <$> decodeString
242
254
243
255
instance Encode SnapshotRun where
244
256
encode SnapshotRun { snapRunNumber, snapRunCaching, snapRunIndex } =
@@ -249,7 +261,7 @@ instance Encode SnapshotRun where
249
261
<> encode snapRunIndex
250
262
251
263
instance DecodeVersioned SnapshotRun where
252
- decodeVersioned v@ V0 = do
264
+ decodeVersioned v = do
253
265
n <- decodeListLen
254
266
tag <- decodeWord
255
267
case (n, tag) of
@@ -290,19 +302,28 @@ instance Encode TableConfig where
290
302
291
303
instance DecodeVersioned TableConfig where
292
304
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
296
319
confMergePolicy <- decodeVersioned v
297
320
confMergeSchedule <- decodeVersioned v
298
321
confSizeRatio <- decodeVersioned v
299
322
confWriteBufferAlloc <- decodeVersioned v
300
323
confBloomFilterAlloc <- decodeVersioned v
301
324
confFencePointerIndex <- decodeVersioned v
302
325
confDiskCachePolicy <- decodeVersioned v
303
- confMergeBatchSize <- if n == 8
304
- then decodeVersioned v
305
- else pure (confMergeBatchSize defaultTableConfig)
326
+ confMergeBatchSize <- decodeVersioned v
306
327
pure TableConfig {.. }
307
328
308
329
-- MergePolicy
@@ -311,7 +332,7 @@ instance Encode MergePolicy where
311
332
encode LazyLevelling = encodeWord 0
312
333
313
334
instance DecodeVersioned MergePolicy where
314
- decodeVersioned V0 = do
335
+ decodeVersioned _v = do
315
336
tag <- decodeWord
316
337
case tag of
317
338
0 -> pure LazyLevelling
@@ -323,7 +344,7 @@ instance Encode SizeRatio where
323
344
encode Four = encodeInt 4
324
345
325
346
instance DecodeVersioned SizeRatio where
326
- decodeVersioned V0 = do
347
+ decodeVersioned _v = do
327
348
x <- decodeWord64
328
349
case x of
329
350
4 -> pure Four
@@ -338,7 +359,7 @@ instance Encode WriteBufferAlloc where
338
359
<> encodeInt numEntries
339
360
340
361
instance DecodeVersioned WriteBufferAlloc where
341
- decodeVersioned V0 = do
362
+ decodeVersioned _v = do
342
363
_ <- decodeListLenOf 2
343
364
tag <- decodeWord
344
365
case tag of
@@ -356,7 +377,7 @@ instance Encode RunParams where
356
377
<> encode runParamIndex
357
378
358
379
instance DecodeVersioned RunParams where
359
- decodeVersioned v@ V0 = do
380
+ decodeVersioned v = do
360
381
n <- decodeListLen
361
382
tag <- decodeWord
362
383
case (n, tag) of
@@ -371,7 +392,7 @@ instance Encode RunDataCaching where
371
392
encode NoCacheRunData = encodeWord 1
372
393
373
394
instance DecodeVersioned RunDataCaching where
374
- decodeVersioned V0 = do
395
+ decodeVersioned _v = do
375
396
tag <- decodeWord
376
397
case tag of
377
398
0 -> pure CacheRunData
@@ -383,7 +404,7 @@ instance Encode IndexType where
383
404
encode Compact = encodeWord 1
384
405
385
406
instance DecodeVersioned IndexType where
386
- decodeVersioned V0 = do
407
+ decodeVersioned _v = do
387
408
tag <- decodeWord
388
409
case tag of
389
410
0 -> pure Ordinary
@@ -401,7 +422,7 @@ instance Encode RunBloomFilterAlloc where
401
422
<> encodeDouble fpr
402
423
403
424
instance DecodeVersioned RunBloomFilterAlloc where
404
- decodeVersioned V0 = do
425
+ decodeVersioned _v = do
405
426
n <- decodeListLen
406
427
tag <- decodeWord
407
428
case (n, tag) of
@@ -422,7 +443,7 @@ instance Encode BloomFilterAlloc where
422
443
<> encodeDouble x
423
444
424
445
instance DecodeVersioned BloomFilterAlloc where
425
- decodeVersioned V0 = do
446
+ decodeVersioned _v = do
426
447
n <- decodeListLen
427
448
tag <- decodeWord
428
449
case (n, tag) of
@@ -455,7 +476,7 @@ instance Encode FencePointerIndexType where
455
476
encode OrdinaryIndex = encodeWord 1
456
477
457
478
instance DecodeVersioned FencePointerIndexType where
458
- decodeVersioned V0 = do
479
+ decodeVersioned _v = do
459
480
tag <- decodeWord
460
481
case tag of
461
482
0 -> pure CompactIndex
@@ -477,7 +498,7 @@ instance Encode DiskCachePolicy where
477
498
<> encodeWord 2
478
499
479
500
instance DecodeVersioned DiskCachePolicy where
480
- decodeVersioned V0 = do
501
+ decodeVersioned _v = do
481
502
n <- decodeListLen
482
503
tag <- decodeWord
483
504
case (n, tag) of
@@ -493,7 +514,7 @@ instance Encode MergeSchedule where
493
514
encode Incremental = encodeWord 1
494
515
495
516
instance DecodeVersioned MergeSchedule where
496
- decodeVersioned V0 = do
517
+ decodeVersioned _v = do
497
518
tag <- decodeWord
498
519
case tag of
499
520
0 -> pure OneShot
@@ -506,7 +527,7 @@ instance Encode MergeBatchSize where
506
527
encode (MergeBatchSize n) = encodeInt n
507
528
508
529
instance DecodeVersioned MergeBatchSize where
509
- decodeVersioned V0 = MergeBatchSize <$> decodeInt
530
+ decodeVersioned _v = MergeBatchSize <$> decodeInt
510
531
511
532
{- ------------------------------------------------------------------------------
512
533
Encoding and decoding: SnapLevels
@@ -518,7 +539,7 @@ instance Encode r => Encode (SnapLevels r) where
518
539
encode (SnapLevels levels) = encode levels
519
540
520
541
instance DecodeVersioned r => DecodeVersioned (SnapLevels r ) where
521
- decodeVersioned v@ V0 = SnapLevels <$> decodeVersioned v
542
+ decodeVersioned v = SnapLevels <$> decodeVersioned v
522
543
523
544
-- SnapLevel
524
545
@@ -530,7 +551,7 @@ instance Encode r => Encode (SnapLevel r) where
530
551
531
552
532
553
instance DecodeVersioned r => DecodeVersioned (SnapLevel r ) where
533
- decodeVersioned v@ V0 = do
554
+ decodeVersioned v = do
534
555
_ <- decodeListLenOf 2
535
556
SnapLevel <$> decodeVersioned v <*> decodeVersioned v
536
557
@@ -548,7 +569,7 @@ instance Encode RunNumber where
548
569
encode (RunNumber x) = encodeInt x
549
570
550
571
instance DecodeVersioned RunNumber where
551
- decodeVersioned V0 = RunNumber <$> decodeInt
572
+ decodeVersioned _v = RunNumber <$> decodeInt
552
573
553
574
-- SnapIncomingRun
554
575
@@ -566,7 +587,7 @@ instance Encode r => Encode (SnapIncomingRun r) where
566
587
<> encode x
567
588
568
589
instance DecodeVersioned r => DecodeVersioned (SnapIncomingRun r ) where
569
- decodeVersioned v@ V0 = do
590
+ decodeVersioned v = do
570
591
n <- decodeListLen
571
592
tag <- decodeWord
572
593
case (n, tag) of
@@ -583,7 +604,7 @@ instance Encode MergePolicyForLevel where
583
604
encode LevelLevelling = encodeWord 1
584
605
585
606
instance DecodeVersioned MergePolicyForLevel where
586
- decodeVersioned V0 = do
607
+ decodeVersioned _v = do
587
608
tag <- decodeWord
588
609
case tag of
589
610
0 -> pure LevelTiering
@@ -607,7 +628,7 @@ instance (Encode t, Encode r) => Encode (SnapMergingRun t r) where
607
628
<> encode mt
608
629
609
630
instance (DecodeVersioned t , DecodeVersioned r ) => DecodeVersioned (SnapMergingRun t r ) where
610
- decodeVersioned v@ V0 = do
631
+ decodeVersioned v = do
611
632
n <- decodeListLen
612
633
tag <- decodeWord
613
634
case (n, tag) of
@@ -623,25 +644,25 @@ instance Encode NominalDebt where
623
644
encode (NominalDebt x) = encodeInt x
624
645
625
646
instance DecodeVersioned NominalDebt where
626
- decodeVersioned V0 = NominalDebt <$> decodeInt
647
+ decodeVersioned _v = NominalDebt <$> decodeInt
627
648
628
649
instance Encode NominalCredits where
629
650
encode (NominalCredits x) = encodeInt x
630
651
631
652
instance DecodeVersioned NominalCredits where
632
- decodeVersioned V0 = NominalCredits <$> decodeInt
653
+ decodeVersioned _v = NominalCredits <$> decodeInt
633
654
634
655
instance Encode MergeDebt where
635
656
encode (MergeDebt (MergeCredits x)) = encodeInt x
636
657
637
658
instance DecodeVersioned MergeDebt where
638
- decodeVersioned V0 = (MergeDebt . MergeCredits ) <$> decodeInt
659
+ decodeVersioned _v = (MergeDebt . MergeCredits ) <$> decodeInt
639
660
640
661
instance Encode MergeCredits where
641
662
encode (MergeCredits x) = encodeInt x
642
663
643
664
instance DecodeVersioned MergeCredits where
644
- decodeVersioned V0 = MergeCredits <$> decodeInt
665
+ decodeVersioned _v = MergeCredits <$> decodeInt
645
666
646
667
-- MergeType
647
668
@@ -650,7 +671,7 @@ instance Encode MR.LevelMergeType where
650
671
encode MR. MergeLastLevel = encodeWord 1
651
672
652
673
instance DecodeVersioned MR. LevelMergeType where
653
- decodeVersioned V0 = do
674
+ decodeVersioned _v = do
654
675
tag <- decodeWord
655
676
case tag of
656
677
0 -> pure MR. MergeMidLevel
@@ -672,7 +693,7 @@ instance Encode MR.TreeMergeType where
672
693
encode MR. MergeUnion = encodeWord 2
673
694
674
695
instance DecodeVersioned MR. TreeMergeType where
675
- decodeVersioned V0 = do
696
+ decodeVersioned _v = do
676
697
tag <- decodeWord
677
698
case tag of
678
699
1 -> pure MR. MergeLevel
@@ -689,7 +710,7 @@ instance Encode r => Encode (SnapMergingTree r) where
689
710
encode (SnapMergingTree tState) = encode tState
690
711
691
712
instance DecodeVersioned r => DecodeVersioned (SnapMergingTree r ) where
692
- decodeVersioned ver@ V0 = SnapMergingTree <$> decodeVersioned ver
713
+ decodeVersioned ver = SnapMergingTree <$> decodeVersioned ver
693
714
694
715
-- SnapMergingTreeState
695
716
@@ -708,7 +729,7 @@ instance Encode r => Encode (SnapMergingTreeState r) where
708
729
<> encode smrs
709
730
710
731
instance DecodeVersioned r => DecodeVersioned (SnapMergingTreeState r ) where
711
- decodeVersioned v@ V0 = do
732
+ decodeVersioned v = do
712
733
n <- decodeListLen
713
734
tag <- decodeWord
714
735
case (n, tag) of
@@ -731,7 +752,7 @@ instance Encode r => Encode (SnapPendingMerge r) where
731
752
<> encodeList mts
732
753
733
754
instance DecodeVersioned r => DecodeVersioned (SnapPendingMerge r ) where
734
- decodeVersioned v@ V0 = do
755
+ decodeVersioned v = do
735
756
n <- decodeListLen
736
757
tag <- decodeWord
737
758
case (n, tag) of
@@ -752,7 +773,7 @@ instance Encode r => Encode (SnapPreExistingRun r) where
752
773
<> encode smrs
753
774
754
775
instance DecodeVersioned r => DecodeVersioned (SnapPreExistingRun r ) where
755
- decodeVersioned v@ V0 = do
776
+ decodeVersioned v = do
756
777
n <- decodeListLen
757
778
tag <- decodeWord
758
779
case (n, tag) of
@@ -770,7 +791,7 @@ encodeMaybe = \case
770
791
Just en -> encode en
771
792
772
793
decodeMaybe :: DecodeVersioned a => SnapshotVersion -> Decoder s (Maybe a )
773
- decodeMaybe v@ V0 = do
794
+ decodeMaybe v = do
774
795
tok <- peekTokenType
775
796
case tok of
776
797
TypeNull -> Nothing <$ decodeNull
0 commit comments