Skip to content

Commit c6dbd9f

Browse files
authored
Merge pull request #612 from IntersectMBO/jeltsch/ordinary-index-key-assertions
Add assertions about keys to ordinary-index construction
2 parents ae355ab + 565b9b1 commit c6dbd9f

File tree

2 files changed

+34
-8
lines changed

2 files changed

+34
-8
lines changed

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

Lines changed: 19 additions & 4 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
{-|
@@ -32,6 +34,10 @@ 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,
3436
freeze, new)
37+
#ifdef NO_IGNORE_ASSERTS
38+
import qualified Database.LSMTree.Internal.Vector.Growing as Growing
39+
(readMaybeLast)
40+
#endif
3541

3642
{-|
3743
A general-purpose fence pointer index under incremental construction.
@@ -80,10 +86,15 @@ keyListElem (SerialisedKey' keyBytes) = [keySizeBytes, keyBytes] where
8086
appendSingle :: (SerialisedKey, SerialisedKey)
8187
-> IndexOrdinaryAcc s
8288
-> ST s (Maybe Chunk)
83-
appendSingle (_, key) (IndexOrdinaryAcc lastKeys baler)
84-
= do
85-
Growing.append lastKeys 1 key
86-
feedBaler (keyListElem key) baler
89+
appendSingle (firstKey, lastKey) (IndexOrdinaryAcc lastKeys baler)
90+
= assert (firstKey <= lastKey) $
91+
do
92+
#ifdef NO_IGNORE_ASSERTS
93+
maybeLastLastKey <- Growing.readMaybeLast lastKeys
94+
assert (all (< firstKey) maybeLastLastKey) $ return ()
95+
#endif
96+
Growing.append lastKeys 1 lastKey
97+
feedBaler (keyListElem lastKey) baler
8798

8899
{-|
89100
For a specification of this operation, see the documentation of [its
@@ -94,6 +105,10 @@ appendMulti :: (SerialisedKey, Word32)
94105
-> ST s [Chunk]
95106
appendMulti (key, overflowPageCount) (IndexOrdinaryAcc lastKeys baler)
96107
= do
108+
#ifdef NO_IGNORE_ASSERTS
109+
maybeLastLastKey <- Growing.readMaybeLast lastKeys
110+
assert (all (< key) maybeLastLastKey) $ return ()
111+
#endif
97112
Growing.append lastKeys pageCount key
98113
maybeToList <$> feedBaler keyListElems baler
99114
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)