Skip to content

Commit 45212f0

Browse files
committed
Make the snapshot codec CBOR encoding more regular
Use utils for maybe, list and vector. And use a single-item encoding for Maybe, rather than it being a pair of things. The pair style means one has to remember to count it as two when setting the tuple lengths.
1 parent 5cbb822 commit 45212f0

File tree

1 file changed

+47
-44
lines changed
  • src/Database/LSMTree/Internal/Snapshot

1 file changed

+47
-44
lines changed

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

Lines changed: 47 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,11 @@ import Codec.CBOR.Decoding
2020
import Codec.CBOR.Encoding
2121
import Codec.CBOR.Read
2222
import Codec.CBOR.Write
23-
import Control.Monad (replicateM, when)
23+
import Control.Monad (when)
2424
import Control.Monad.Class.MonadThrow (MonadThrow (..))
2525
import Data.Bifunctor
2626
import qualified Data.ByteString.Char8 as BSC
2727
import Data.ByteString.Lazy (ByteString)
28-
import Data.Foldable (fold)
2928
import qualified Data.Map.Strict as Map
3029
import qualified Data.Vector as V
3130
import Database.LSMTree.Internal.Config
@@ -223,7 +222,7 @@ instance Decode SnapshotVersion where
223222

224223
instance Encode SnapshotMetaData where
225224
encode (SnapshotMetaData label tableType config writeBuffer levels mergingTree) =
226-
encodeListLen 7
225+
encodeListLen 6
227226
<> encode label
228227
<> encode tableType
229228
<> encode config
@@ -233,7 +232,7 @@ instance Encode SnapshotMetaData where
233232

234233
instance DecodeVersioned SnapshotMetaData where
235234
decodeVersioned ver@V0 = do
236-
_ <- decodeListLenOf 7
235+
_ <- decodeListLenOf 6
237236
SnapshotMetaData
238237
<$> decodeVersioned ver
239238
<*> decodeVersioned ver
@@ -523,14 +522,10 @@ instance DecodeVersioned MergeSchedule where
523522
-- SnapLevels
524523

525524
instance Encode r => Encode (SnapLevels r) where
526-
encode (SnapLevels levels) =
527-
encodeListLen (fromIntegral (V.length levels))
528-
<> V.foldMap encode levels
525+
encode (SnapLevels levels) = encode levels
529526

530527
instance DecodeVersioned r => DecodeVersioned (SnapLevels r) where
531-
decodeVersioned v@V0 = do
532-
n <- decodeListLen
533-
SnapLevels <$> V.replicateM n (decodeVersioned v)
528+
decodeVersioned v@V0 = SnapLevels <$> decodeVersioned v
534529

535530
-- SnapLevel
536531

@@ -549,14 +544,10 @@ instance DecodeVersioned r => DecodeVersioned (SnapLevel r) where
549544
-- Vector
550545

551546
instance Encode r => Encode (V.Vector r) where
552-
encode rns =
553-
encodeListLen (fromIntegral (V.length rns))
554-
<> V.foldMap encode rns
547+
encode = encodeVector
555548

556549
instance DecodeVersioned r => DecodeVersioned (V.Vector r) where
557-
decodeVersioned v@V0 = do
558-
n <- decodeListLen
559-
V.replicateM n (decodeVersioned v)
550+
decodeVersioned = decodeVector
560551

561552
-- RunNumber
562553

@@ -745,34 +736,23 @@ instance DecodeVersioned r => DecodeVersioned (SnapMergingTreeState r) where
745736
-- SnapPendingMerge
746737

747738
instance Encode r => Encode (SnapPendingMerge r) where
748-
encode (SnapPendingLevelMerge pe mt) = fold
749-
[ encodeListLen 4
750-
, encodeWord 0
751-
, encodeMaybe mt
752-
, encodeListLen . toEnum $ length pe
753-
, foldMap encode pe
754-
]
739+
encode (SnapPendingLevelMerge pe mt) =
740+
encodeListLen 3
741+
<> encodeWord 0
742+
<> encodeList pe
743+
<> encodeMaybe mt
755744
encode (SnapPendingUnionMerge mts) =
756-
encodeListLen 2
757-
<> encodeWord 1
758-
<> encodeListLen (toEnum $ length mts)
759-
<> foldMap encode mts
745+
encodeListLen 2
746+
<> encodeWord 1
747+
<> encodeList mts
760748

761749
instance DecodeVersioned r => DecodeVersioned (SnapPendingMerge r) where
762750
decodeVersioned v@V0 = do
763751
n <- decodeListLen
764752
tag <- decodeWord
765753
case (n, tag) of
766-
(4, 0) -> do
767-
-- Get the whether or not the levels merge exists
768-
peLvls <- decodeMaybe v
769-
peLen <- decodeListLen
770-
peRuns <- replicateM peLen (decodeVersioned v)
771-
pure $ SnapPendingLevelMerge peRuns peLvls
772-
(2, 1) -> do
773-
-- Get the number of pre-existsing unions to read
774-
peLen <- decodeListLen
775-
SnapPendingUnionMerge <$> replicateM peLen (decodeVersioned v)
754+
(3, 0) -> SnapPendingLevelMerge <$> decodeList v <*> decodeMaybe v
755+
(2, 1) -> SnapPendingUnionMerge <$> decodeList v
776756
_ -> fail ("[SnapPendingMerge] Unexpected combination of list length and tag: " <> show (n, tag))
777757

778758
-- SnapPreExistingRun
@@ -798,14 +778,37 @@ instance DecodeVersioned r => DecodeVersioned (SnapPreExistingRun r) where
798778

799779
-- Utilities for encoding/decoding Maybe values
800780

781+
--Note: the Maybe encoding cannot be nested like (Maybe (Maybe a)), but it is
782+
-- ok for fields of records.
801783
encodeMaybe :: Encode a => Maybe a -> Encoding
802784
encodeMaybe = \case
803-
Nothing -> encodeBool False <> encodeNull
804-
Just en -> encodeBool True <> encode en
805-
785+
Nothing -> encodeNull
786+
Just en -> encode en
806787

807788
decodeMaybe :: DecodeVersioned a => SnapshotVersion -> Decoder s (Maybe a)
808-
decodeMaybe v@V0 = decodeBool >>= \exist ->
809-
if exist
810-
then Just <$> decodeVersioned v
811-
else Nothing <$ decodeNull
789+
decodeMaybe v@V0 = do
790+
tok <- peekTokenType
791+
case tok of
792+
TypeNull -> Nothing <$ decodeNull
793+
_ -> Just <$> decodeVersioned v
794+
795+
encodeList :: Encode a => [a] -> Encoding
796+
encodeList xs =
797+
encodeListLen (fromIntegral (length xs))
798+
<> foldr (\x r -> encode x <> r) mempty xs
799+
800+
decodeList :: DecodeVersioned a => SnapshotVersion -> Decoder s [a]
801+
decodeList v = do
802+
n <- decodeListLen
803+
decodeSequenceLenN (flip (:)) [] reverse n (decodeVersioned v)
804+
805+
encodeVector :: Encode a => V.Vector a -> Encoding
806+
encodeVector xs =
807+
encodeListLen (fromIntegral (V.length xs))
808+
<> foldr (\x r -> encode x <> r) mempty xs
809+
810+
decodeVector :: DecodeVersioned a => SnapshotVersion -> Decoder s (V.Vector a)
811+
decodeVector v = do
812+
n <- decodeListLen
813+
decodeSequenceLenN (flip (:)) [] (V.reverse . V.fromList)
814+
n (decodeVersioned v)

0 commit comments

Comments
 (0)