Skip to content

Commit bba3791

Browse files
committed
prototype: support and test blobs
They were partially supported, but could only be inserted through `updates` and were not tested.
1 parent 10c5d4c commit bba3791

File tree

3 files changed

+65
-60
lines changed

3 files changed

+65
-60
lines changed

prototypes/ScheduledMerges.hs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -430,12 +430,11 @@ new = do
430430
return (LSMHandle c lsm)
431431

432432

433-
inserts :: Tracer (ST s) Event -> LSM s -> [(Key, Value)] -> ST s ()
434-
inserts tr lsm kvs = updates tr lsm [ (k, Insert v Nothing) | (k,v) <- kvs ]
433+
inserts :: Tracer (ST s) Event -> LSM s -> [(Key, Value, Maybe Blob)] -> ST s ()
434+
inserts tr lsm kvbs = updates tr lsm [ (k, Insert v b) | (k, v, b) <- kvbs ]
435435

436-
-- TODO: support (and test!) blobs
437-
insert :: Tracer (ST s) Event -> LSM s -> Key -> Value -> ST s ()
438-
insert tr lsm k v = update tr lsm k (Insert v Nothing)
436+
insert :: Tracer (ST s) Event -> LSM s -> Key -> Value -> Maybe Blob -> ST s ()
437+
insert tr lsm k v b = update tr lsm k (Insert v b)
439438

440439
delete :: Tracer (ST s) Event -> LSM s -> Key -> ST s ()
441440
delete tr lsm k = update tr lsm k Delete
@@ -624,7 +623,6 @@ duplicate (LSMHandle _scr lsmr) = do
624623
-- it's that simple here, because we share all the pure value and all the
625624
-- STRefs and there's no ref counting to be done
626625

627-
628626
-------------------------------------------------------------------------------
629627
-- Measurements
630628
--
@@ -649,11 +647,11 @@ flattenIncomingRun (Merging (MergingRun _ _ mr)) = do
649647
CompletedMerge r -> return [r]
650648
OngoingMerge _ rs _ -> return rs
651649

652-
logicalValue :: LSM s -> ST s (Map Key Value)
650+
logicalValue :: LSM s -> ST s (Map Key (Value, Maybe Blob))
653651
logicalValue = fmap (Map.mapMaybe justInsert . Map.unions . concat)
654652
. allLayers
655653
where
656-
justInsert (Insert v _) = Just v
654+
justInsert (Insert v b) = Just (v, b)
657655
justInsert Delete = Nothing
658656

659657
dumpRepresentation :: LSM s

prototypes/ScheduledMergesTest.hs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
module ScheduledMergesTest (tests) where
22

3-
import Data.Foldable (traverse_)
4-
import Data.STRef
53
import Control.Exception
64
import Control.Monad (replicateM_, when)
75
import Control.Monad.ST
86
import Control.Tracer (Tracer (Tracer))
97
import qualified Control.Tracer as Tracer
8+
import Data.Foldable (traverse_)
9+
import Data.STRef
1010

1111
import ScheduledMerges as LSM
1212

@@ -25,7 +25,7 @@ test_regression_empty_run =
2525
runWithTracer $ \tracer -> do
2626
stToIO $ do
2727
lsm <- LSM.new
28-
let ins k = LSM.insert tracer lsm (K k) (V 0)
28+
let ins k = LSM.insert tracer lsm (K k) (V 0) Nothing
2929
let del k = LSM.delete tracer lsm (K k)
3030
-- run 1
3131
ins 0
@@ -80,7 +80,7 @@ test_merge_again_with_incoming =
8080
runWithTracer $ \tracer -> do
8181
stToIO $ do
8282
lsm <- LSM.new
83-
let ins k = LSM.insert tracer lsm (K k) (V 0)
83+
let ins k = LSM.insert tracer lsm (K k) (V 0) Nothing
8484
-- get something to 3rd level (so 2nd level is not levelling)
8585
-- (needs 5 runs to go to level 2 so the resulting run becomes too big)
8686
traverse_ ins [101..100+(5*16)]

prototypes/ScheduledMergesTestQLS.hs

Lines changed: 55 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44

55
module ScheduledMergesTestQLS (tests) where
66

7-
import Prelude hiding (lookup)
7+
import Control.Monad.ST
8+
import Control.Tracer (Tracer, nullTracer)
9+
import Data.Constraint (Dict (..))
810
import Data.Map.Strict (Map)
911
import qualified Data.Map.Strict as Map
10-
import Data.Constraint (Dict (..))
1112
import Data.Proxy
12-
import Control.Monad.ST
13-
import Control.Tracer (Tracer, nullTracer)
13+
import Prelude hiding (lookup)
1414

1515
import ScheduledMerges as LSM
1616

@@ -35,17 +35,17 @@ prop_LSM = Lockstep.runActions (Proxy :: Proxy Model)
3535

3636
type ModelLSM = Int
3737

38-
newtype Model = Model { mlsms :: Map ModelLSM (Map Key Value) }
38+
newtype Model = Model { mlsms :: Map ModelLSM (Map Key (Value, Maybe Blob)) }
3939
deriving stock (Show)
4040

4141
type ModelOp r = Model -> (r, Model)
4242

43-
modelNew :: ModelOp ModelLSM
44-
modelInsert :: ModelLSM -> Key -> Value -> ModelOp ()
45-
modelDelete :: ModelLSM -> Key -> ModelOp ()
46-
modelLookup :: ModelLSM -> Key -> ModelOp (Maybe Value)
47-
modelDuplicate :: ModelLSM -> ModelOp ModelLSM
48-
modelDump :: ModelLSM -> ModelOp (Map Key Value)
43+
modelNew :: ModelOp ModelLSM
44+
modelInsert :: ModelLSM -> Key -> Value -> Maybe Blob -> ModelOp ()
45+
modelDelete :: ModelLSM -> Key -> ModelOp ()
46+
modelLookup :: ModelLSM -> Key -> ModelOp (LookupResult Value Blob)
47+
modelDuplicate :: ModelLSM -> ModelOp ModelLSM
48+
modelDump :: ModelLSM -> ModelOp (Map Key (Value, Maybe Blob))
4949

5050
initModel :: Model
5151
initModel = Model { mlsms = Map.empty }
@@ -55,8 +55,8 @@ modelNew Model {mlsms} =
5555
where
5656
mlsm = Map.size mlsms
5757

58-
modelInsert mlsm k v Model {mlsms} =
59-
((), Model { mlsms = Map.adjust (Map.insert k v) mlsm mlsms })
58+
modelInsert mlsm k v b Model {mlsms} =
59+
((), Model { mlsms = Map.adjust (Map.insert k (v, b)) mlsm mlsms })
6060

6161
modelDelete mlsm k Model {mlsms} =
6262
((), Model { mlsms = Map.adjust (Map.delete k) mlsm mlsms })
@@ -65,7 +65,10 @@ modelLookup mlsm k model@Model {mlsms} =
6565
(result, model)
6666
where
6767
Just mval = Map.lookup mlsm mlsms
68-
result = Map.lookup k mval
68+
result = case Map.lookup k mval of
69+
Nothing -> NotFound
70+
Just (v, Nothing) -> Found v
71+
Just (v, Just b) -> FoundWithBlob v b
6972

7073
modelDuplicate mlsm Model {mlsms} =
7174
(mlsm', Model { mlsms = Map.insert mlsm' mval mlsms })
@@ -85,6 +88,7 @@ instance StateModel (Lockstep Model) where
8588
AInsert :: ModelVar Model (LSM RealWorld)
8689
-> Either (ModelVar Model Key) Key -- to refer to a prior key
8790
-> Value
91+
-> Maybe Blob
8892
-> Action (Lockstep Model) (Key)
8993

9094
ADelete :: ModelVar Model (LSM RealWorld)
@@ -93,13 +97,13 @@ instance StateModel (Lockstep Model) where
9397

9498
ALookup :: ModelVar Model (LSM RealWorld)
9599
-> Either (ModelVar Model Key) Key
96-
-> Action (Lockstep Model) (Maybe Value)
100+
-> Action (Lockstep Model) (LookupResult Value Blob)
97101

98102
ADuplicate :: ModelVar Model (LSM RealWorld)
99103
-> Action (Lockstep Model) (LSM RealWorld)
100104

101105
ADump :: ModelVar Model (LSM RealWorld)
102-
-> Action (Lockstep Model) (Map Key Value)
106+
-> Action (Lockstep Model) (Map Key (Value, Maybe Blob))
103107

104108
initialState = Lockstep.initialState initModel
105109
nextState = Lockstep.nextState
@@ -114,11 +118,16 @@ instance RunModel (Lockstep Model) IO where
114118

115119
instance InLockstep Model where
116120
data ModelValue Model a where
117-
MLSM :: ModelLSM -> ModelValue Model (LSM RealWorld)
118-
MUnit :: () -> ModelValue Model ()
119-
MInsert :: Key -> ModelValue Model (Key)
120-
MLookup :: Maybe Value -> ModelValue Model (Maybe Value)
121-
MDump :: Map Key Value -> ModelValue Model (Map Key Value)
121+
MLSM :: ModelLSM
122+
-> ModelValue Model (LSM RealWorld)
123+
MUnit :: ()
124+
-> ModelValue Model ()
125+
MInsert :: Key
126+
-> ModelValue Model Key
127+
MLookup :: LookupResult Value Blob
128+
-> ModelValue Model (LookupResult Value Blob)
129+
MDump :: Map Key (Value, Maybe Blob)
130+
-> ModelValue Model (Map Key (Value, Maybe Blob))
122131

123132
data Observable Model a where
124133
ORef :: Observable Model (LSM RealWorld)
@@ -130,15 +139,15 @@ instance InLockstep Model where
130139
observeModel (MLookup x) = OId x
131140
observeModel (MDump x) = OId x
132141

133-
usedVars ANew = []
134-
usedVars (AInsert v evk _) = SomeGVar v
135-
: case evk of Left vk -> [SomeGVar vk]; _ -> []
136-
usedVars (ADelete v evk) = SomeGVar v
137-
: case evk of Left vk -> [SomeGVar vk]; _ -> []
138-
usedVars (ALookup v evk) = SomeGVar v
139-
: case evk of Left vk -> [SomeGVar vk]; _ -> []
140-
usedVars (ADuplicate v) = [SomeGVar v]
141-
usedVars (ADump v) = [SomeGVar v]
142+
usedVars ANew = []
143+
usedVars (AInsert v evk _ _) = SomeGVar v
144+
: case evk of Left vk -> [SomeGVar vk]; _ -> []
145+
usedVars (ADelete v evk) = SomeGVar v
146+
: case evk of Left vk -> [SomeGVar vk]; _ -> []
147+
usedVars (ALookup v evk) = SomeGVar v
148+
: case evk of Left vk -> [SomeGVar vk]; _ -> []
149+
usedVars (ADuplicate v) = [SomeGVar v]
150+
usedVars (ADump v) = [SomeGVar v]
142151

143152
modelNextState = runModel
144153

@@ -154,13 +163,15 @@ instance InLockstep Model where
154163
[ (3, fmap Some $
155164
AInsert <$> elements vars
156165
<*> freshKey
157-
<*> arbitrary @Value)
166+
<*> arbitrary @Value
167+
<*> arbitrary @(Maybe Blob))
158168
]
159169
-- inserts of the same keys as used earlier
160170
++ [ (1, fmap Some $
161171
AInsert <$> elements vars
162172
<*> existingKey
163-
<*> arbitrary @Value)
173+
<*> arbitrary @Value
174+
<*> arbitrary @(Maybe Blob))
164175
| not (null kvars)
165176
]
166177
-- deletes of arbitrary keys:
@@ -192,11 +203,11 @@ instance InLockstep Model where
192203
ADuplicate <$> elements vars)
193204
]
194205

195-
shrinkWithVars _ctx _model (AInsert var (Right k) v) =
196-
[ Some $ AInsert var (Right k') v' | (k', v') <- shrink (k, v) ]
206+
shrinkWithVars _ctx _model (AInsert var (Right k) v b) =
207+
[ Some $ AInsert var (Right k') v' b' | (k', v', b') <- shrink (k, v, b) ]
197208

198-
shrinkWithVars _ctx _model (AInsert var (Left _kv) v) =
199-
[ Some $ AInsert var (Right k) v | k <- shrink (K 100) ]
209+
shrinkWithVars _ctx _model (AInsert var (Left _kv) v b) =
210+
[ Some $ AInsert var (Right k') v' b' | (k', v', b') <- shrink (K 100, v, b) ]
200211

201212
shrinkWithVars _ctx _model (ADelete var (Right k)) =
202213
[ Some $ ADelete var (Right k') | k' <- shrink k ]
@@ -239,23 +250,19 @@ runActionIO :: Action (Lockstep Model) a
239250
runActionIO action lookUp =
240251
stToIO $
241252
case action of
242-
ANew -> new
243-
AInsert var evk v -> insert tr (lookUpVar var) k v >> return k
253+
ANew -> new
254+
AInsert var evk v b -> insert tr (lookUpVar var) k v b >> return k
244255
where k = either lookUpVar id evk
245-
ADelete var evk -> delete tr (lookUpVar var) k >> return ()
256+
ADelete var evk -> delete tr (lookUpVar var) k >> return ()
246257
where k = either lookUpVar id evk
247-
ALookup var evk -> lookupResultValue <$> lookup (lookUpVar var) k
258+
ALookup var evk -> lookup (lookUpVar var) k
248259
where k = either lookUpVar id evk
249-
ADuplicate var -> duplicate (lookUpVar var)
250-
ADump var -> logicalValue (lookUpVar var)
260+
ADuplicate var -> duplicate (lookUpVar var)
261+
ADump var -> logicalValue (lookUpVar var)
251262
where
252263
lookUpVar :: ModelVar Model a -> a
253264
lookUpVar = lookUpGVar (Proxy :: Proxy IO) lookUp
254265

255-
lookupResultValue NotFound = Nothing
256-
lookupResultValue (Found v) = Just v
257-
lookupResultValue (FoundWithBlob v _b) = Just v
258-
259266
tr :: Tracer (ST RealWorld) Event
260267
tr = nullTracer
261268

@@ -268,8 +275,8 @@ runModel action ctx m =
268275
ANew -> (MLSM mlsm, m')
269276
where (mlsm, m') = modelNew m
270277

271-
AInsert var evk v -> (MInsert k, m')
272-
where ((), m') = modelInsert (lookUpLsMVar var) k v m
278+
AInsert var evk v b -> (MInsert k, m')
279+
where ((), m') = modelInsert (lookUpLsMVar var) k v b m
273280
k = either lookUpKeyVar id evk
274281

275282
ADelete var evk -> (MUnit (), m')

0 commit comments

Comments
 (0)