@@ -21,21 +21,21 @@ import Control.Monad.Class.MonadThrow (MonadMask)
21
21
import Control.Monad.Fix (MonadFix )
22
22
import Control.Monad.Primitive (PrimMonad )
23
23
import Control.TempRegistry
24
- import Data.Foldable (traverse_ )
24
+ import Data.Foldable (forM_ , traverse_ )
25
25
import Data.Primitive.PrimVar
26
26
import qualified Data.Vector as V
27
27
import Database.LSMTree.Internal.Config
28
28
import Database.LSMTree.Internal.Entry
29
29
import Database.LSMTree.Internal.Lookup (ResolveSerialisedValue )
30
- import Database.LSMTree.Internal.Merge (Merge )
31
30
import qualified Database.LSMTree.Internal.Merge as Merge
32
31
import Database.LSMTree.Internal.MergeSchedule
33
32
import Database.LSMTree.Internal.Paths (SessionRoot )
34
33
import qualified Database.LSMTree.Internal.Paths as Paths
35
34
import Database.LSMTree.Internal.Run (Run )
36
35
import qualified Database.LSMTree.Internal.Run as Run
37
- import qualified Database.LSMTree.Internal.RunBuilder as RunBuilder
38
36
import Database.LSMTree.Internal.RunNumber
37
+ import Database.LSMTree.Internal.UniqCounter (UniqCounter ,
38
+ incrUniqCounter , uniqueToRunNumber )
39
39
import System.FS.API (HasFS )
40
40
import System.FS.BlockIO.API (HasBlockIO )
41
41
@@ -49,8 +49,8 @@ numSnapRuns a = V.sum $ V.map go1 a
49
49
go1 (SnapLevel b c) = go2 b + V. length c
50
50
go2 (SnapMergingRun _ _ d) = go3 d
51
51
go2 (SnapSingleRun _) = 1
52
- go3 (SnapCompletedMerge _) = 1
53
- go3 (SnapOngoingMerge e _ _ _ ) = V. length e
52
+ go3 (SnapCompletedMerge _) = 1
53
+ go3 (SnapOngoingMerge e _ _) = V. length e
54
54
55
55
type SnapLevels = V. Vector SnapLevel
56
56
@@ -67,7 +67,7 @@ data SnapMergingRun =
67
67
68
68
data SnapMergingRunState =
69
69
SnapCompletedMerge ! RunNumber
70
- | SnapOngoingMerge ! (V. Vector RunNumber ) ! NumStepsDone {- merge -} !RunNumber ! Merge. Level
70
+ | SnapOngoingMerge ! (V. Vector RunNumber ) ! NumStepsDone {- merge -} !Merge. Level
71
71
deriving stock (Show , Eq , Read )
72
72
73
73
{- ------------------------------------------------------------------------------
@@ -104,14 +104,11 @@ snapMergingRunState ::
104
104
snapMergingRunState (CompletedMerge r) = pure (SnapCompletedMerge (runNumber r))
105
105
snapMergingRunState (OngoingMerge rs nsdVar m) = do
106
106
nsd <- readPrimVar nsdVar
107
- pure (SnapOngoingMerge (V. map runNumber rs) nsd (mergeNumber m) ( Merge. mergeLevel m))
107
+ pure (SnapOngoingMerge (V. map runNumber rs) nsd (Merge. mergeLevel m))
108
108
109
109
runNumber :: Run m h -> RunNumber
110
110
runNumber r = Paths. runNumber (Run. runRunFsPaths r)
111
111
112
- mergeNumber :: Merge m h -> RunNumber
113
- mergeNumber m = Paths. runNumber (RunBuilder. runBuilderFsPaths (Merge. mergeBuilder m))
114
-
115
112
{- ------------------------------------------------------------------------------
116
113
Opening from snapshot format
117
114
-------------------------------------------------------------------------------}
@@ -122,18 +119,20 @@ openLevels ::
122
119
-> HasFS m h
123
120
-> HasBlockIO m h
124
121
-> TableConfig
122
+ -> UniqCounter m
125
123
-> SessionRoot
126
124
-> ResolveSerialisedValue
127
125
-> SnapLevels
128
126
-> m (Levels m h )
129
- openLevels reg hfs hbio conf@ TableConfig {.. } sessionRoot resolve levels =
127
+ openLevels reg hfs hbio conf@ TableConfig {.. } uc sessionRoot resolve levels =
130
128
V. iforM levels $ \ i -> openLevel (LevelNo (i+ 1 ))
131
129
where
132
130
mkPath = Paths. RunFsPaths (Paths. activeDir sessionRoot)
133
131
134
132
openLevel :: LevelNo -> SnapLevel -> m (Level m h )
135
133
openLevel ln SnapLevel {.. } = do
136
- incomingRuns <- openMergingRun snapIncomingRuns
134
+ (mmmay, incomingRuns) <- openMergingRun snapIncomingRuns
135
+ forM_ mmmay $ \ c -> supplyMergeCredits c incomingRuns -- TODO: this part is leaky!
137
136
residentRuns <- V. forM snapResidentRuns $ \ rn ->
138
137
allocateTemp reg
139
138
(Run. openFromDisk hfs hbio caching (mkPath rn))
@@ -143,36 +142,37 @@ openLevels reg hfs hbio conf@TableConfig{..} sessionRoot resolve levels =
143
142
caching = diskCachePolicyForLevel confDiskCachePolicy ln
144
143
alloc = bloomFilterAllocForLevel conf ln
145
144
146
- openMergingRun :: SnapMergingRun -> m (MergingRun m h )
145
+ openMergingRun :: SnapMergingRun -> m (Maybe Int , MergingRun m h )
147
146
openMergingRun (SnapMergingRun mpfl nr smrs) = do
148
- mrs <- openMergingRunState smrs
149
- MergingRun mpfl nr <$> newMVar mrs
147
+ (n, mrs) <- openMergingRunState smrs
148
+ (n,) . MergingRun mpfl nr <$> newMVar mrs
150
149
openMergingRun (SnapSingleRun rn) =
151
- SingleRun <$>
150
+ ( Nothing ,) . SingleRun <$>
152
151
allocateTemp reg
153
152
(Run. openFromDisk hfs hbio caching (mkPath rn))
154
153
Run. removeReference
155
154
156
- openMergingRunState :: SnapMergingRunState -> m (MergingRunState m h )
155
+ openMergingRunState :: SnapMergingRunState -> m (Maybe Int , MergingRunState m h )
157
156
openMergingRunState (SnapCompletedMerge rn) =
158
- CompletedMerge <$>
157
+ ( Nothing ,) . CompletedMerge <$>
159
158
allocateTemp reg
160
159
(Run. openFromDisk hfs hbio caching (mkPath rn))
161
160
Run. removeReference
162
- openMergingRunState (SnapOngoingMerge rns nsd rnm mergeLast) = do
161
+ openMergingRunState (SnapOngoingMerge rns nsd mergeLast) = do
163
162
rs <- V. forM rns $ \ rn ->
164
163
allocateTemp reg
165
164
(Run. openFromDisk hfs hbio caching ((mkPath rn)))
166
165
Run. removeReference
167
166
nsdVar <- newPrimVar nsd
167
+ rn <- uniqueToRunNumber <$> incrUniqCounter uc
168
168
mergeMaybe <- allocateTemp reg
169
- (Merge. new hfs hbio caching alloc mergeLast resolve (mkPath rnm ) rs)
169
+ (Merge. new hfs hbio caching alloc mergeLast resolve (mkPath rn ) rs)
170
170
(traverse_ Merge. removeReference)
171
171
-- TODO: progress merge
172
172
-- TODO: write test that shows a failure because we are not progressing the merge
173
173
case mergeMaybe of
174
174
Nothing -> error " openLevels: merges can not be empty"
175
- Just m -> pure (OngoingMerge rs nsdVar m)
175
+ Just m -> pure (Just (unNumStepsDone nsd), OngoingMerge rs nsdVar m)
176
176
177
177
{- ------------------------------------------------------------------------------
178
178
Levels
0 commit comments