Safe Haskell | Safe-Inferred |
---|---|
Language | GHC2021 |
Database.LSMTree.Internal.RunReaders
Contents
Synopsis
- data Readers m h = Readers {
- readersHeap :: !(MutableHeap (PrimState m) (ReadCtx m h))
- readersNext :: !(MutVar (PrimState m) (ReadCtx m h))
- data OffsetKey
- new :: forall m h. (MonadMask m, MonadST m, MonadSTM m) => OffsetKey -> Maybe (WriteBuffer, Ref (WriteBufferBlobs m h)) -> Vector (Ref (Run m h)) -> m (Maybe (Readers m h))
- close :: (MonadMask m, MonadSTM m, PrimMonad m) => Readers m h -> m ()
- peekKey :: PrimMonad m => Readers m h -> m SerialisedKey
- data HasMore
- pop :: (MonadMask m, MonadSTM m, MonadST m) => Readers m h -> m (SerialisedKey, Entry m h, HasMore)
- dropWhileKey :: (MonadMask m, MonadSTM m, MonadST m) => Readers m h -> SerialisedKey -> m (Int, HasMore)
- data Reader m h
- = ReadRun !(RunReader m h)
- | ReadBuffer !(MutVar (PrimState m) [KOp m h])
- newtype ReaderNumber = ReaderNumber Int
- data ReadCtx m h = ReadCtx {
- readCtxHeadKey :: !SerialisedKey
- readCtxHeadEntry :: !(Entry m h)
- readCtxNumber :: !ReaderNumber
- readCtxReader :: !(Reader m h)
Documentation
A collection of runs and write buffers being read from, yielding elements in order. More precisely, that means first ordered by their key, then by the input run they came from. This is important for resolving multiple entries with the same key into one.
Construct with new
, then keep calling pop
.
If aborting early, remember to call close
!
Creating a Readers
does not retain a reference to the input Run
s or the
WriteBufferBlobs
, but does retain an independent reference on their blob
files. It is not necessary to separately retain the Run
s or the
WriteBufferBlobs
for correct use of the Readers
. There is one important
caveat however: to preserve the validity of BlobRef
s then it is necessary
to separately retain a reference to the Run
or its BlobFile
to preserve
the validity of BlobRefs
.
TODO: do this more nicely by changing Reader
to preserve the BlobFile
ref until it is explicitly closed, and also retain the BlobFile
from the
WBB and release all of these BlobFiles
once the Readers
is itself closed.
Constructors
Readers | |
Fields
|
Constructors
NoOffsetKey | |
OffsetKey !SerialisedKey |
new :: forall m h. (MonadMask m, MonadST m, MonadSTM m) => OffsetKey -> Maybe (WriteBuffer, Ref (WriteBufferBlobs m h)) -> Vector (Ref (Run m h)) -> m (Maybe (Readers m h)) Source #
close :: (MonadMask m, MonadSTM m, PrimMonad m) => Readers m h -> m () Source #
Only call when aborting before all readers have been drained.
pop :: (MonadMask m, MonadSTM m, MonadST m) => Readers m h -> m (SerialisedKey, Entry m h, HasMore) Source #
Internals
Constructors
ReadRun !(RunReader m h) | |
ReadBuffer !(MutVar (PrimState m) [KOp m h]) |
newtype ReaderNumber Source #
Constructors
ReaderNumber Int |
Instances
Eq ReaderNumber Source # | |
Defined in Database.LSMTree.Internal.RunReaders | |
Ord ReaderNumber Source # | |
Defined in Database.LSMTree.Internal.RunReaders Methods compare :: ReaderNumber -> ReaderNumber -> Ordering # (<) :: ReaderNumber -> ReaderNumber -> Bool # (<=) :: ReaderNumber -> ReaderNumber -> Bool # (>) :: ReaderNumber -> ReaderNumber -> Bool # (>=) :: ReaderNumber -> ReaderNumber -> Bool # max :: ReaderNumber -> ReaderNumber -> ReaderNumber # min :: ReaderNumber -> ReaderNumber -> ReaderNumber # |
Each heap element needs some more context than just the reader.
E.g. the Eq
instance we need to be able to access the first key to be read
in a pure way.
TODO(optimisation): We allocate this record for each k/op. This might be avoidable, see ideas below.
Constructors
ReadCtx | |
Fields
|
Instances
Eq (ReadCtx m h) Source # | |
Ord (ReadCtx m h) Source # | Makes sure we resolve entries in the right order. |
Defined in Database.LSMTree.Internal.RunReaders |