Safe Haskell | Safe-Inferred |
---|---|
Language | GHC2021 |
Database.LSMTree.Internal.Merge
Description
The Merge
type and its functions are not intended for concurrent use.
Concurrent access should therefore be sequentialised using a suitable
concurrency primitive, such as an MVar
.
Synopsis
- data Merge t m h = Merge {
- mergeType :: !t
- mergeIsLastLevel :: !Bool
- mergeIsUnion :: !Bool
- mergeMappend :: !Mappend
- mergeReaders :: !(Readers m h)
- mergeBuilder :: !(RunBuilder m h)
- mergeState :: !(MutVar (PrimState m) MergeState)
- mergeHasFS :: !(HasFS m h)
- mergeHasBlockIO :: !(HasBlockIO m h)
- data MergeType
- class IsMergeType t where
- isLastLevel :: t -> Bool
- isUnion :: t -> Bool
- data LevelMergeType
- data TreeMergeType
- type Mappend = SerialisedValue -> SerialisedValue -> SerialisedValue
- data MergeState
- data RunParams = RunParams {}
- new :: (IsMergeType t, MonadMask m, MonadSTM m, MonadST m) => HasFS m h -> HasBlockIO m h -> RunParams -> t -> Mappend -> RunFsPaths -> Vector (Ref (Run m h)) -> m (Maybe (Merge t m h))
- abort :: (MonadMask m, MonadSTM m, MonadST m) => Merge t m h -> m ()
- complete :: (MonadSTM m, MonadST m, MonadMask m) => Merge t m h -> m (Ref (Run m h))
- stepsToCompletion :: (MonadMask m, MonadSTM m, MonadST m) => Merge t m h -> Int -> m (Ref (Run m h))
- stepsToCompletionCounted :: (MonadMask m, MonadSTM m, MonadST m) => Merge t m h -> Int -> m (Int, Ref (Run m h))
- data StepResult
- steps :: (MonadMask m, MonadSTM m, MonadST m) => Merge t m h -> Int -> m (Int, StepResult)
- mergeRunParams :: Merge t m h -> RunParams
Documentation
An in-progress incremental k-way merge of Run
s.
Since we always resolve all entries of the same key in one go, there is no need to store incompletely-resolved entries.
Constructors
Merge | |
Fields
|
Fully general merge type, mainly useful for testing.
Constructors
MergeTypeMidLevel | |
MergeTypeLastLevel | |
MergeTypeUnion |
class IsMergeType t where Source #
Merges can either exist on a level of the LSM, or be a union merge of two tables.
Methods
isLastLevel :: t -> Bool Source #
A last level merge behaves differently from a mid-level merge: last level merges can actually remove delete operations, whereas mid-level merges must preserve them.
Union merges follow the semantics of Data.Map.unionWith (<>)
. Since the
input runs are semantically treated like Data.Map
s, deletes are ignored
and inserts act like mupserts, so they need to be merged monoidally using
resolveValue
.
Instances
data LevelMergeType Source #
Different types of merges created as part of a regular (non-union) level.
A last level merge behaves differently from a mid-level merge: last level
merges can actually remove delete operations, whereas mid-level merges must
preserve them. This is orthogonal to the MergePolicy
.
Constructors
MergeMidLevel | |
MergeLastLevel |
Instances
Show LevelMergeType Source # | |
Defined in Database.LSMTree.Internal.Merge Methods showsPrec :: Int -> LevelMergeType -> ShowS # show :: LevelMergeType -> String # showList :: [LevelMergeType] -> ShowS # | |
NFData LevelMergeType Source # | |
Defined in Database.LSMTree.Internal.Merge Methods rnf :: LevelMergeType -> () # | |
Eq LevelMergeType Source # | |
Defined in Database.LSMTree.Internal.Merge Methods (==) :: LevelMergeType -> LevelMergeType -> Bool # (/=) :: LevelMergeType -> LevelMergeType -> Bool # | |
IsMergeType LevelMergeType Source # | |
Defined in Database.LSMTree.Internal.Merge | |
DecodeVersioned LevelMergeType Source # | |
Defined in Database.LSMTree.Internal.Snapshot.Codec Methods decodeVersioned :: SnapshotVersion -> Decoder s LevelMergeType Source # | |
Encode LevelMergeType Source # | |
Defined in Database.LSMTree.Internal.Snapshot.Codec Methods encode :: LevelMergeType -> Encoding Source # |
data TreeMergeType Source #
Different types of merges created as part of the merging tree.
Constructors
MergeLevel | |
MergeUnion |
Instances
Show TreeMergeType Source # | |
Defined in Database.LSMTree.Internal.Merge Methods showsPrec :: Int -> TreeMergeType -> ShowS # show :: TreeMergeType -> String # showList :: [TreeMergeType] -> ShowS # | |
NFData TreeMergeType Source # | |
Defined in Database.LSMTree.Internal.Merge Methods rnf :: TreeMergeType -> () # | |
Eq TreeMergeType Source # | |
Defined in Database.LSMTree.Internal.Merge Methods (==) :: TreeMergeType -> TreeMergeType -> Bool # (/=) :: TreeMergeType -> TreeMergeType -> Bool # | |
IsMergeType TreeMergeType Source # | |
Defined in Database.LSMTree.Internal.Merge | |
DecodeVersioned TreeMergeType Source # | |
Defined in Database.LSMTree.Internal.Snapshot.Codec Methods decodeVersioned :: SnapshotVersion -> Decoder s TreeMergeType Source # | |
Encode TreeMergeType Source # | We start the tags for these merge types at an offset. This way, if we
serialise However, |
Defined in Database.LSMTree.Internal.Snapshot.Codec Methods encode :: TreeMergeType -> Encoding Source # |
type Mappend = SerialisedValue -> SerialisedValue -> SerialisedValue Source #
data MergeState Source #
The current state of the merge.
Constructors
Merging | There is still merging work to be done |
MergingDone | There is no more merging work to be done, but the merge still has to be completed to yield a new run. |
Completed | A run was yielded as the result of a merge. The merge is implicitly closed. |
Closed | The merge was closed before it was completed. |
Constructors
RunParams | |
Fields |
Instances
Show RunParams Source # | |
NFData RunParams Source # | |
Defined in Database.LSMTree.Internal.RunBuilder | |
Eq RunParams Source # | |
DecodeVersioned RunParams Source # | |
Defined in Database.LSMTree.Internal.Snapshot.Codec Methods decodeVersioned :: SnapshotVersion -> Decoder s RunParams Source # | |
Encode RunParams Source # | |
new :: (IsMergeType t, MonadMask m, MonadSTM m, MonadST m) => HasFS m h -> HasBlockIO m h -> RunParams -> t -> Mappend -> RunFsPaths -> Vector (Ref (Run m h)) -> m (Maybe (Merge t m h)) Source #
complete :: (MonadSTM m, MonadST m, MonadMask m) => Merge t m h -> m (Ref (Run m h)) Source #
Complete a Merge
, returning a new Run
as the result of merging the
input runs.
All resources held by the merge are released, so do not use the it any more!
This function will not do any merging work if there is any remaining. That
is, if not enough steps
were performed to exhaust the input Readers
, this
function will throw an error.
Returns an error if the merge was not yet done, if it was already completed before, or if it was already closed.
Note: this function creates new Run
resources, so it is recommended to run
this function with async exceptions masked. Otherwise, these resources can
leak. And it must eventually be released with releaseRef
.
stepsToCompletion :: (MonadMask m, MonadSTM m, MonadST m) => Merge t m h -> Int -> m (Ref (Run m h)) Source #
stepsToCompletionCounted :: (MonadMask m, MonadSTM m, MonadST m) => Merge t m h -> Int -> m (Int, Ref (Run m h)) Source #
data StepResult Source #
Constructors
MergeInProgress | |
MergeDone |
Instances
Eq StepResult Source # | |
Defined in Database.LSMTree.Internal.Merge |
Arguments
:: (MonadMask m, MonadSTM m, MonadST m) | |
=> Merge t m h | |
-> Int | How many input entries to consume (at least) |
-> m (Int, StepResult) |
Do at least a given number of steps of merging. Each step reads a single entry, then either resolves the previous entry with the new one or writes it out to the run being created. Since we always finish resolving a key we started, we might do slightly more work than requested.
Returns the number of input entries read, which is guaranteed to be at least as many as requested (unless the merge is complete).
Returns an error if the merge was already completed or closed.
mergeRunParams :: Merge t m h -> RunParams Source #