Skip to content

Commit 4bfd1cf

Browse files
committed
Generalise OverrideDiskCachePolicy to TableConfigOverride
And add MergeBatchSize to TableConfigOverride.
1 parent 15b43f9 commit 4bfd1cf

File tree

6 files changed

+95
-48
lines changed

6 files changed

+95
-48
lines changed

bench/macro/lsm-tree-bench-wp8.hs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,11 @@ mkTableConfigRun GlobalOpts{diskCachePolicy} conf = conf {
185185
LSM.confDiskCachePolicy = diskCachePolicy
186186
}
187187

188-
mkOverrideDiskCachePolicy :: GlobalOpts -> LSM.OverrideDiskCachePolicy
189-
mkOverrideDiskCachePolicy GlobalOpts{diskCachePolicy} = LSM.OverrideDiskCachePolicy diskCachePolicy
188+
mkOverrideDiskCachePolicy :: GlobalOpts -> LSM.TableConfigOverride
189+
mkOverrideDiskCachePolicy GlobalOpts{diskCachePolicy} =
190+
LSM.noTableConfigOverride {
191+
LSM.overrideDiskCachePolicy = Just diskCachePolicy
192+
}
190193

191194
mkTracer :: GlobalOpts -> Tracer IO LSM.LSMTreeTrace
192195
mkTracer gopts
@@ -582,8 +585,10 @@ doRun gopts opts = do
582585
-- reference version starts with empty (as it's not practical or
583586
-- necessary for testing to load the whole snapshot).
584587
tbl <- if check opts
585-
then LSM.newTableWith @IO @K @V @B (mkTableConfigRun gopts benchTableConfig) session
586-
else LSM.openTableFromSnapshotWith @IO @K @V @B (mkOverrideDiskCachePolicy gopts) session name label
588+
then let conf = mkTableConfigRun gopts benchTableConfig
589+
in LSM.newTableWith @IO @K @V @B conf session
590+
else let conf = mkOverrideDiskCachePolicy gopts
591+
in LSM.openTableFromSnapshotWith @IO @K @V @B conf session name label
587592

588593
-- In checking mode, compare each output against a pure reference.
589594
checkvar <- newIORef $ pureReference

src/Database/LSMTree.hs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ module Database.LSMTree (
122122
MergeBatchSize (..),
123123

124124
-- ** Table Configuration Overrides #table_configuration_overrides#
125-
OverrideDiskCachePolicy (..),
125+
TableConfigOverride (..),
126+
noTableConfigOverride,
126127

127128
-- * Ranges #ranges#
128129
Range (..),
@@ -220,7 +221,7 @@ import Database.LSMTree.Internal.Config
220221
WriteBufferAlloc (..), defaultTableConfig,
221222
serialiseKeyMinimalSize)
222223
import Database.LSMTree.Internal.Config.Override
223-
(OverrideDiskCachePolicy (..))
224+
(TableConfigOverride (..), noTableConfigOverride)
224225
import Database.LSMTree.Internal.Entry (NumEntries (..))
225226
import qualified Database.LSMTree.Internal.Entry as Entry
226227
import Database.LSMTree.Internal.Merge (LevelMergeType (..))
@@ -2402,7 +2403,7 @@ Variant of 'withTableFromSnapshot' that accepts [table configuration overrides](
24022403
withTableFromSnapshotWith ::
24032404
forall k v b a.
24042405
(ResolveValue v) =>
2405-
OverrideDiskCachePolicy ->
2406+
TableConfigOverride ->
24062407
Session IO ->
24072408
SnapshotName ->
24082409
SnapshotLabel ->
@@ -2413,7 +2414,7 @@ withTableFromSnapshotWith ::
24132414
forall m k v b a.
24142415
(IOLike m) =>
24152416
(ResolveValue v) =>
2416-
OverrideDiskCachePolicy ->
2417+
TableConfigOverride ->
24172418
Session m ->
24182419
SnapshotName ->
24192420
SnapshotLabel ->
@@ -2477,7 +2478,7 @@ openTableFromSnapshot ::
24772478
SnapshotLabel ->
24782479
m (Table m k v b)
24792480
openTableFromSnapshot session snapName snapLabel =
2480-
openTableFromSnapshotWith NoOverrideDiskCachePolicy session snapName snapLabel
2481+
openTableFromSnapshotWith noTableConfigOverride session snapName snapLabel
24812482

24822483
{- |
24832484
Variant of 'openTableFromSnapshot' that accepts [table configuration overrides](#g:table_configuration_overrides).
@@ -2486,7 +2487,7 @@ Variant of 'openTableFromSnapshot' that accepts [table configuration overrides](
24862487
openTableFromSnapshotWith ::
24872488
forall k v b.
24882489
(ResolveValue v) =>
2489-
OverrideDiskCachePolicy ->
2490+
TableConfigOverride ->
24902491
Session IO ->
24912492
SnapshotName ->
24922493
SnapshotLabel ->
@@ -2496,7 +2497,7 @@ openTableFromSnapshotWith ::
24962497
forall m k v b.
24972498
(IOLike m) =>
24982499
(ResolveValue v) =>
2499-
OverrideDiskCachePolicy ->
2500+
TableConfigOverride ->
25002501
Session m ->
25012502
SnapshotName ->
25022503
SnapshotLabel ->

src/Database/LSMTree/Internal/Config/Override.hs

Lines changed: 59 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
module Database.LSMTree.Internal.Config.Override (
66
-- $override-policy
77

8-
-- * Override disk cache policy
9-
OverrideDiskCachePolicy (..)
10-
, overrideDiskCachePolicy
8+
-- * Override table config
9+
TableConfigOverride (..)
10+
, noTableConfigOverride
11+
, overrideTableConfig
1112
) where
1213

1314
import qualified Data.Vector as V
@@ -45,32 +46,71 @@ import Database.LSMTree.Internal.Snapshot
4546
-- now, changing only the disk cache policy offline should work fine.
4647

4748
{-------------------------------------------------------------------------------
48-
Override disk cache policy
49+
Helper class
50+
-------------------------------------------------------------------------------}
51+
52+
-- | This class is only here so that we can recursively call 'override' on all
53+
-- fields of a datatype, instead of having to invent a new name for each type
54+
-- that the function is called on such as @overrideTableConfig@,
55+
-- @overrideSnapshotRun@, etc.
56+
class Override o a where
57+
override :: o -> a -> a
58+
59+
instance Override a c => Override (Maybe a) c where
60+
override = maybe id override
61+
62+
{-------------------------------------------------------------------------------
63+
Override table config
4964
-------------------------------------------------------------------------------}
5065

5166
{- |
52-
The 'OverrideDiskCachePolicy' can be used to override the 'DiskCachePolicy'
67+
The 'TableConfigOverride' can be used to override the 'TableConfig'
5368
when opening a table from a snapshot.
5469
-}
55-
data OverrideDiskCachePolicy =
56-
NoOverrideDiskCachePolicy
57-
| OverrideDiskCachePolicy DiskCachePolicy
70+
data TableConfigOverride = TableConfigOverride {
71+
overrideDiskCachePolicy :: Maybe DiskCachePolicy,
72+
overrideMergeBatchSize :: Maybe MergeBatchSize
73+
}
5874
deriving stock (Show, Eq)
5975

60-
-- | Override the disk cache policy that is stored in snapshot metadata.
76+
-- | No override of the 'TableConfig'. You can use this as a default value and
77+
-- record update to override some parameters, while being future-proof to new
78+
-- parameters, e.g.
79+
--
80+
-- > noTableConfigOverride { overrideDiskCachePolicy = DiskCacheNone }
81+
--
82+
noTableConfigOverride :: TableConfigOverride
83+
noTableConfigOverride = TableConfigOverride Nothing Nothing
84+
85+
-- | Override the a subset of the table configuration parameters that are
86+
-- stored in snapshot metadata.
6187
--
6288
-- Tables opened from the new 'SnapshotMetaData' will use the new value for the
63-
-- disk cache policy.
64-
overrideDiskCachePolicy :: OverrideDiskCachePolicy -> SnapshotMetaData -> SnapshotMetaData
65-
overrideDiskCachePolicy (OverrideDiskCachePolicy dcp) = override dcp
66-
overrideDiskCachePolicy NoOverrideDiskCachePolicy = id
89+
-- table configuration.
90+
overrideTableConfig :: TableConfigOverride
91+
-> SnapshotMetaData -> SnapshotMetaData
92+
overrideTableConfig = override
6793

68-
-- | This class is only here so that we can recursively call 'override' on all
69-
-- fields of a datatype, instead of having to invent a new name for each type
70-
-- that the function is called on such as 'overrideTableConfig',
71-
-- 'overrideSnapshotRun', etc.
72-
class Override o a where
73-
override :: o -> a -> a
94+
instance Override TableConfigOverride SnapshotMetaData where
95+
override TableConfigOverride {..} =
96+
override overrideMergeBatchSize
97+
. override overrideDiskCachePolicy
98+
99+
{-------------------------------------------------------------------------------
100+
Override merge batch size
101+
-------------------------------------------------------------------------------}
102+
103+
instance Override MergeBatchSize SnapshotMetaData where
104+
override mbs smd =
105+
smd { snapMetaConfig = override mbs (snapMetaConfig smd) }
106+
107+
instance Override MergeBatchSize TableConfig where
108+
override confMergeBatchSize' tc =
109+
tc { confMergeBatchSize = confMergeBatchSize' }
110+
111+
{-------------------------------------------------------------------------------
112+
Override disk cache policy
113+
-------------------------------------------------------------------------------}
74114

75115
-- NOTE: the instances below explicitly pattern match on the types of
76116
-- constructor fields. This makes the code more verbose, but it also makes the

src/Database/LSMTree/Internal/Unsafe.hs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ import Database.LSMTree.Internal.Arena (ArenaManager, newArenaManager)
109109
import Database.LSMTree.Internal.BlobRef (WeakBlobRef (..))
110110
import qualified Database.LSMTree.Internal.BlobRef as BlobRef
111111
import Database.LSMTree.Internal.Config
112-
import Database.LSMTree.Internal.Config.Override
113-
(OverrideDiskCachePolicy, overrideDiskCachePolicy)
112+
import Database.LSMTree.Internal.Config.Override (TableConfigOverride,
113+
overrideTableConfig)
114114
import Database.LSMTree.Internal.CRC32C (FileCorruptedError (..),
115115
FileFormat (..))
116116
import qualified Database.LSMTree.Internal.Cursor as Cursor
@@ -159,7 +159,7 @@ data LSMTreeTrace =
159159
| TraceCloseSession
160160
-- Table
161161
| TraceNewTable
162-
| TraceOpenTableFromSnapshot SnapshotName OverrideDiskCachePolicy
162+
| TraceOpenTableFromSnapshot SnapshotName TableConfigOverride
163163
| TraceTable TableId TableTrace
164164
| TraceDeleteSnapshot SnapshotName
165165
| TraceListSnapshots
@@ -1287,7 +1287,7 @@ data SnapshotNotCompatibleError
12871287
deriving anyclass (Exception)
12881288

12891289
{-# SPECIALISE openTableFromSnapshot ::
1290-
OverrideDiskCachePolicy
1290+
TableConfigOverride
12911291
-> Session IO h
12921292
-> SnapshotName
12931293
-> SnapshotLabel
@@ -1296,7 +1296,7 @@ data SnapshotNotCompatibleError
12961296
-- | See 'Database.LSMTree.openTableFromSnapshot'.
12971297
openTableFromSnapshot ::
12981298
(MonadMask m, MonadMVar m, MonadST m, MonadSTM m)
1299-
=> OverrideDiskCachePolicy
1299+
=> TableConfigOverride
13001300
-> Session m h
13011301
-> SnapshotName
13021302
-> SnapshotLabel -- ^ Expected label
@@ -1322,7 +1322,7 @@ openTableFromSnapshot policyOveride sesh snap label resolve =
13221322
snapMetaData <- readFileSnapshotMetaData hfs contentPath checksumPath
13231323

13241324
let SnapshotMetaData label' conf snapWriteBuffer snapLevels mTreeOpt
1325-
= overrideDiskCachePolicy policyOveride snapMetaData
1325+
= overrideTableConfig policyOveride snapMetaData
13261326

13271327
unless (label == label') $
13281328
throwIO (ErrSnapshotWrongLabel snap label label')

src/Database/LSMTree/Simple.hs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ module Database.LSMTree.Simple (
114114
MergeBatchSize (..),
115115

116116
-- ** Table Configuration Overrides #table_configuration_overrides#
117-
OverrideDiskCachePolicy (..),
117+
TableConfigOverride (..),
118+
noTableConfigOverride,
118119

119120
-- * Ranges #ranges#
120121
Range (..),
@@ -167,17 +168,17 @@ import Data.Void (Void)
167168
import Database.LSMTree (BloomFilterAlloc, CursorClosedError (..),
168169
DiskCachePolicy, FencePointerIndexType,
169170
InvalidSnapshotNameError (..), MergeBatchSize, MergePolicy,
170-
MergeSchedule, OverrideDiskCachePolicy (..), Range (..),
171-
RawBytes, ResolveAsFirst (..), SerialiseKey (..),
172-
SerialiseKeyOrderPreserving, SerialiseValue (..),
173-
SessionClosedError (..), SizeRatio,
171+
MergeSchedule, Range (..), RawBytes, ResolveAsFirst (..),
172+
SerialiseKey (..), SerialiseKeyOrderPreserving,
173+
SerialiseValue (..), SessionClosedError (..), SizeRatio,
174174
SnapshotCorruptedError (..),
175175
SnapshotDoesNotExistError (..), SnapshotExistsError (..),
176176
SnapshotLabel (..), SnapshotName,
177177
SnapshotNotCompatibleError (..), TableClosedError (..),
178-
TableConfig (..), TableCorruptedError (..),
179-
TableTooLargeError (..), UnionCredits (..), UnionDebt (..),
180-
WriteBufferAlloc, isValidSnapshotName, packSlice,
178+
TableConfig (..), TableConfigOverride (..),
179+
TableCorruptedError (..), TableTooLargeError (..),
180+
UnionCredits (..), UnionDebt (..), WriteBufferAlloc,
181+
isValidSnapshotName, noTableConfigOverride, packSlice,
181182
serialiseKeyIdentity, serialiseKeyIdentityUpToSlicing,
182183
serialiseKeyMinimalSize, serialiseKeyPreservesOrdering,
183184
serialiseValueIdentity, serialiseValueIdentityUpToSlicing,
@@ -1425,7 +1426,7 @@ Variant of 'withTableFromSnapshot' that accepts [table configuration overrides](
14251426
-}
14261427
withTableFromSnapshotWith ::
14271428
forall k v a.
1428-
OverrideDiskCachePolicy ->
1429+
TableConfigOverride ->
14291430
Session ->
14301431
SnapshotName ->
14311432
SnapshotLabel ->
@@ -1468,7 +1469,7 @@ Variant of 'openTableFromSnapshot' that accepts [table configuration overrides](
14681469
-}
14691470
openTableFromSnapshotWith ::
14701471
forall k v.
1471-
OverrideDiskCachePolicy ->
1472+
TableConfigOverride ->
14721473
Session ->
14731474
SnapshotName ->
14741475
SnapshotLabel ->

test/Test/Database/LSMTree/Internal/Snapshot/FS.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import Database.LSMTree.Extras (showPowersOf10)
1313
import Database.LSMTree.Extras.Generators ()
1414
import Database.LSMTree.Internal.Config
1515
import Database.LSMTree.Internal.Config.Override
16-
(OverrideDiskCachePolicy (..))
16+
(noTableConfigOverride)
1717
import Database.LSMTree.Internal.Entry
1818
import Database.LSMTree.Internal.Paths
1919
import Database.LSMTree.Internal.Serialise
@@ -221,6 +221,6 @@ prop_flipSnapshotBit (Positive (Small bufferSize)) es pickFileBit =
221221
saveSnapshot snapName snapLabel t
222222

223223
openSnap s =
224-
openTableFromSnapshot NoOverrideDiskCachePolicy s snapName snapLabel resolve
224+
openTableFromSnapshot noTableConfigOverride s snapName snapLabel resolve
225225

226226
getConstructorName e = takeWhile (/= ' ') (show e)

0 commit comments

Comments
 (0)