Skip to content

Commit da231c8

Browse files
committed
Add assertions about keys to ordinary-index construction
1 parent 8f3ca3c commit da231c8

File tree

2 files changed

+31
-9
lines changed

2 files changed

+31
-9
lines changed

src/Database/LSMTree/Internal/Index/OrdinaryAcc.hs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
{-# LANGUAGE CPP #-}
2+
13
{- HLINT ignore "Avoid restricted alias" -}
24

35
{-|
@@ -31,7 +33,7 @@ import Database.LSMTree.Internal.Serialise
3133
import Database.LSMTree.Internal.Vector (byteVectorFromPrim)
3234
import Database.LSMTree.Internal.Vector.Growing (GrowingVector)
3335
import qualified Database.LSMTree.Internal.Vector.Growing as Growing (append,
34-
freeze, new)
36+
freeze, new, readMaybeLast)
3537

3638
{-|
3739
A general-purpose fence pointer index under incremental construction.
@@ -80,10 +82,15 @@ keyListElem (SerialisedKey' keyBytes) = [keySizeBytes, keyBytes] where
8082
appendSingle :: (SerialisedKey, SerialisedKey)
8183
-> IndexOrdinaryAcc s
8284
-> ST s (Maybe Chunk)
83-
appendSingle (_, key) (IndexOrdinaryAcc lastKeys baler)
84-
= do
85-
Growing.append lastKeys 1 key
86-
feedBaler (keyListElem key) baler
85+
appendSingle (firstKey, lastKey) (IndexOrdinaryAcc lastKeys baler)
86+
= assert (firstKey <= lastKey) $
87+
do
88+
#ifdef NO_IGNORE_ASSERTS
89+
maybeLastLastKey <- Growing.readMaybeLast lastKeys
90+
assert (all (< firstKey) maybeLastLastKey) $ return ()
91+
#endif
92+
Growing.append lastKeys 1 lastKey
93+
feedBaler (keyListElem lastKey) baler
8794

8895
{-|
8996
For a specification of this operation, see the documentation of [its
@@ -94,6 +101,10 @@ appendMulti :: (SerialisedKey, Word32)
94101
-> ST s [Chunk]
95102
appendMulti (key, overflowPageCount) (IndexOrdinaryAcc lastKeys baler)
96103
= do
104+
#ifdef NO_IGNORE_ASSERTS
105+
maybeLastLastKey <- Growing.readMaybeLast lastKeys
106+
assert (all (< key) maybeLastLastKey) $ return ()
107+
#endif
97108
Growing.append lastKeys pageCount key
98109
maybeToList <$> feedBaler keyListElems baler
99110
where

src/Database/LSMTree/Internal/Vector/Growing.hs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ module Database.LSMTree.Internal.Vector.Growing
88
GrowingVector (GrowingVector),
99
new,
1010
append,
11-
freeze
11+
freeze,
12+
readMaybeLast
1213
)
1314
where
1415

15-
import Prelude hiding (init, last, length)
16+
import Prelude hiding (init, last, length, read)
1617

1718
import Control.Monad (when)
1819
import Control.Monad.ST.Strict (ST)
@@ -22,8 +23,8 @@ import Data.STRef.Strict (STRef, newSTRef, readSTRef, writeSTRef)
2223
import Data.Vector (Vector)
2324
import qualified Data.Vector as Mutable (freeze)
2425
import Data.Vector.Mutable (MVector)
25-
import qualified Data.Vector.Mutable as Mutable (grow, length, new, set, slice,
26-
take)
26+
import qualified Data.Vector.Mutable as Mutable (grow, length, new, read, set,
27+
slice, take)
2728

2829
{-|
2930
A vector with support for appending elements.
@@ -118,3 +119,13 @@ freeze (GrowingVector bufferRef lengthRef) = do
118119
buffer <- readSTRef bufferRef
119120
length <- readPrimVar lengthRef
120121
Mutable.freeze (Mutable.take length buffer)
122+
123+
-- | Reads the last element of a growing vector if it exists.
124+
readMaybeLast :: GrowingVector s a -> ST s (Maybe a)
125+
readMaybeLast (GrowingVector bufferRef lengthRef) = do
126+
length <- readPrimVar lengthRef
127+
if length == 0
128+
then return Nothing
129+
else do
130+
buffer <- readSTRef bufferRef
131+
Just <$> Mutable.read buffer (pred length)

0 commit comments

Comments
 (0)