@@ -22,7 +22,6 @@ import Codec.CBOR.Decoding
2222import Codec.CBOR.Encoding
2323import Codec.CBOR.Read
2424import Codec.CBOR.Write
25- import Control.Monad (unless )
2625import Control.Monad.Class.MonadThrow (Exception (displayException ),
2726 MonadThrow (.. ))
2827import 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 "
6665prettySnapshotVersion :: SnapshotVersion -> String
6766prettySnapshotVersion V0 = " v0"
67+ prettySnapshotVersion V1 = " v1"
6868
6969-- >>> currentSnapshotVersion
7070-- V0
7171currentSnapshotVersion :: SnapshotVersion
72- currentSnapshotVersion = V0
72+ currentSnapshotVersion = V1
7373
7474isCompatible :: 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
202204instance 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
237249instance Encode SnapshotLabel where
238250 encode (SnapshotLabel s) = encodeString s
239251
240252instance DecodeVersioned SnapshotLabel where
241- decodeVersioned V0 = SnapshotLabel <$> decodeString
253+ decodeVersioned _v = SnapshotLabel <$> decodeString
242254
243255instance Encode SnapshotRun where
244256 encode SnapshotRun { snapRunNumber, snapRunCaching, snapRunIndex } =
@@ -249,7 +261,7 @@ instance Encode SnapshotRun where
249261 <> encode snapRunIndex
250262
251263instance 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
291303instance 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
313334instance 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
325346instance 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
340361instance 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
358379instance 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
373394instance 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
385406instance 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
403424instance 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
424445instance 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
457478instance 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
479500instance 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
495516instance 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
508529instance 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
520541instance 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
532553instance 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
550571instance 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
568589instance 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
585606instance 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
609630instance (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
625646instance DecodeVersioned NominalDebt where
626- decodeVersioned V0 = NominalDebt <$> decodeInt
647+ decodeVersioned _v = NominalDebt <$> decodeInt
627648
628649instance Encode NominalCredits where
629650 encode (NominalCredits x) = encodeInt x
630651
631652instance DecodeVersioned NominalCredits where
632- decodeVersioned V0 = NominalCredits <$> decodeInt
653+ decodeVersioned _v = NominalCredits <$> decodeInt
633654
634655instance Encode MergeDebt where
635656 encode (MergeDebt (MergeCredits x)) = encodeInt x
636657
637658instance DecodeVersioned MergeDebt where
638- decodeVersioned V0 = (MergeDebt . MergeCredits ) <$> decodeInt
659+ decodeVersioned _v = (MergeDebt . MergeCredits ) <$> decodeInt
639660
640661instance Encode MergeCredits where
641662 encode (MergeCredits x) = encodeInt x
642663
643664instance 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
652673instance 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
674695instance 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
691712instance 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
710731instance 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
733754instance 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
754775instance 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
772793decodeMaybe :: 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
0 commit comments