Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Synopsis
- data ImmutableDBEnv m blk = ∀ h.Eq h ⇒ ImmutableDBEnv {
- hasFS ∷ !(HasFS m h)
- varInternalState ∷ !(StrictSVar m (InternalState m blk h))
- checkIntegrity ∷ !(blk → Bool)
- chunkInfo ∷ !ChunkInfo
- tracer ∷ !(Tracer m (TraceEvent blk))
- cacheConfig ∷ !CacheConfig
- codecConfig ∷ !(CodecConfig blk)
- data InternalState m blk h
- data OpenState m blk h = OpenState {
- currentChunk ∷ !ChunkNo
- currentChunkOffset ∷ !BlockOffset
- currentSecondaryOffset ∷ !SecondaryOffset
- currentChunkHandle ∷ !(Handle h)
- currentPrimaryHandle ∷ !(Handle h)
- currentSecondaryHandle ∷ !(Handle h)
- currentTip ∷ !(WithOrigin (Tip blk))
- currentIndex ∷ !(Index m blk h)
- dbIsOpen ∷ InternalState m blk h → Bool
- type ModifyOpenState m blk h = StateT (OpenState m blk h) (WithTempRegistry (OpenState m blk h) m)
- cleanUp ∷ Monad m ⇒ HasFS m h → OpenState m blk h → m ()
- closeOpenHandles ∷ Monad m ⇒ HasFS m h → OpenState m blk h → m ()
- getOpenState ∷ ∀ m blk. (HasCallStack, IOLike m, StandardHash blk, Typeable blk) ⇒ ImmutableDBEnv m blk → STM m (SomePair (HasFS m) (OpenState m blk))
- mkOpenState ∷ ∀ m blk h. (HasCallStack, IOLike m, Eq h) ⇒ HasFS m h → Index m blk h → ChunkNo → WithOrigin (Tip blk) → AllowExisting → WithTempRegistry (OpenState m blk h) m (OpenState m blk h)
- modifyOpenState ∷ ∀ m blk a. (HasCallStack, IOLike m, StandardHash blk, Typeable blk) ⇒ ImmutableDBEnv m blk → (∀ h. Eq h ⇒ HasFS m h → ModifyOpenState m blk h a) → m a
- withOpenState ∷ ∀ m blk r. (HasCallStack, IOLike m, StandardHash blk, Typeable blk) ⇒ ImmutableDBEnv m blk → (∀ h. HasFS m h → OpenState m blk h → m r) → m r
State types
data ImmutableDBEnv m blk Source #
The environment used by the immutable database.
∀ h.Eq h ⇒ ImmutableDBEnv | |
|
data InternalState m blk h Source #
Instances
Generic (InternalState m blk h) Source # | |
Defined in Ouroboros.Consensus.Storage.ImmutableDB.Impl.State type Rep (InternalState m blk h) ∷ Type → Type # from ∷ InternalState m blk h → Rep (InternalState m blk h) x # to ∷ Rep (InternalState m blk h) x → InternalState m blk h # | |
StandardHash blk ⇒ NoThunks (InternalState m blk h) Source # | |
type Rep (InternalState m blk h) Source # | |
Defined in Ouroboros.Consensus.Storage.ImmutableDB.Impl.State type Rep (InternalState m blk h) = D1 ('MetaData "InternalState" "Ouroboros.Consensus.Storage.ImmutableDB.Impl.State" "ouroboros-consensus-0.21.0.0-inplace" 'False) (C1 ('MetaCons "DbClosed" 'PrefixI 'False) (U1 ∷ Type → Type) :+: C1 ('MetaCons "DbOpen" 'PrefixI 'False) (S1 ('MetaSel ('Nothing ∷ Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (OpenState m blk h)))) |
data OpenState m blk h Source #
Internal state when the database is open.
OpenState | |
|
Instances
dbIsOpen ∷ InternalState m blk h → Bool Source #
State helpers
type ModifyOpenState m blk h = StateT (OpenState m blk h) (WithTempRegistry (OpenState m blk h) m) Source #
Shorthand
cleanUp ∷ Monad m ⇒ HasFS m h → OpenState m blk h → m () Source #
Clean up the OpenState
: closeOpenHandles
+ close the index (i.e.,
shut down its background thread)
closeOpenHandles ∷ Monad m ⇒ HasFS m h → OpenState m blk h → m () Source #
Close the handles in the OpenState
.
Idempotent, as closing a handle is idempotent.
getOpenState ∷ ∀ m blk. (HasCallStack, IOLike m, StandardHash blk, Typeable blk) ⇒ ImmutableDBEnv m blk → STM m (SomePair (HasFS m) (OpenState m blk)) Source #
Get the OpenState
of the given database, throw a ClosedDBError
in
case it is closed.
NOTE: Since the OpenState
is parameterized over a type parameter h
of
handles, which is not visible from the type of the ImmutableDBEnv
,
we return a SomePair
here that returns the open state along with a HasFS
instance for the same type parameter h
. Note that it would be impossible
to use an existing HasFS
instance already in scope otherwise, since the
h
parameters would not be known to match.
mkOpenState ∷ ∀ m blk h. (HasCallStack, IOLike m, Eq h) ⇒ HasFS m h → Index m blk h → ChunkNo → WithOrigin (Tip blk) → AllowExisting → WithTempRegistry (OpenState m blk h) m (OpenState m blk h) Source #
Create the internal open state for the given chunk.
modifyOpenState ∷ ∀ m blk a. (HasCallStack, IOLike m, StandardHash blk, Typeable blk) ⇒ ImmutableDBEnv m blk → (∀ h. Eq h ⇒ HasFS m h → ModifyOpenState m blk h a) → m a Source #
Modify the internal state of an open database.
In case the database is closed, a ClosedDBError
is thrown.
In case an ImmutableDBError
is thrown, the database is closed to prevent
further appending to a database in a potentially inconsistent state.
The action is run in the ModifyOpenState
monad, which is a StateT
transformer (of the OpenState
) over the WithTempRegistry
monad. This
monad can be used to allocate resources in that will be transferred to the
returned OpenState
that is safely stored in the ImmutableDBEnv
. This
approach makes sure that no resources are leaked when an exception is
thrown while running the action modifying the state.
TODO: update this comment
Note: This takes the TMVar
, then runs the action (which might be
in IO
), and then puts the TMVar
back, just like
modifyMVar
does. Consequently, it has the same
gotchas that modifyMVar
does; the effects are observable and it is
susceptible to deadlock.
withOpenState ∷ ∀ m blk r. (HasCallStack, IOLike m, StandardHash blk, Typeable blk) ⇒ ImmutableDBEnv m blk → (∀ h. HasFS m h → OpenState m blk h → m r) → m r Source #
Perform an action that accesses the internal state of an open database.
In case the database is closed, a ClosedDBError
is thrown.
In case an ImmutableDBError
is thrown while the action is being run, the
database is closed to prevent further appending to a database in a
potentially inconsistent state.