| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Ouroboros.Consensus.Storage.ImmutableDB.Impl.State
Contents
Synopsis
- data ImmutableDBEnv (m ∷ Type → Type) blk = 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 ∷ Type → Type) blk h
- data OpenState (m ∷ Type → Type) 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 ∷ ∀ (m ∷ Type → Type) blk h. InternalState m blk h → Bool
- type ModifyOpenState (m ∷ Type → Type) 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 ∷ Type → Type) blk. (HasCallStack, IOLike m, StandardHash blk, Typeable blk) ⇒ ImmutableDBEnv m blk → STM m (SomePair (HasFS m) (OpenState m blk))
- mkOpenState ∷ ∀ (m ∷ Type → Type) 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 ∷ (HasCallStack, IOLike m, StandardHash blk, Typeable blk) ⇒ ImmutableDBEnv m blk → (∀ h. Eq h ⇒ HasFS m h → ModifyOpenState m blk h a) → m a
- withOpenState ∷ (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 ∷ Type → Type) blk Source #
The environment used by the immutable database.
Constructors
| Eq h ⇒ ImmutableDBEnv | |
Fields
| |
data InternalState (m ∷ Type → Type) blk h Source #
Instances
data OpenState (m ∷ Type → Type) blk h Source #
Internal state when the database is open.
Constructors
| OpenState | |
Fields
| |
Instances
| Generic (OpenState m blk h) Source # | |||||
Defined in Ouroboros.Consensus.Storage.ImmutableDB.Impl.State Associated Types
| |||||
| StandardHash blk ⇒ NoThunks (OpenState m blk h) Source # | |||||
| type Rep (OpenState m blk h) Source # | |||||
Defined in Ouroboros.Consensus.Storage.ImmutableDB.Impl.State type Rep (OpenState m blk h) = D1 ('MetaData "OpenState" "Ouroboros.Consensus.Storage.ImmutableDB.Impl.State" "ouroboros-consensus-0.28.0.0-inplace" 'False) (C1 ('MetaCons "OpenState" 'PrefixI 'True) (((S1 ('MetaSel ('Just "currentChunk") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 ChunkNo) :*: S1 ('MetaSel ('Just "currentChunkOffset") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 BlockOffset)) :*: (S1 ('MetaSel ('Just "currentSecondaryOffset") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 SecondaryOffset) :*: S1 ('MetaSel ('Just "currentChunkHandle") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Handle h)))) :*: ((S1 ('MetaSel ('Just "currentPrimaryHandle") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Handle h)) :*: S1 ('MetaSel ('Just "currentSecondaryHandle") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Handle h))) :*: (S1 ('MetaSel ('Just "currentTip") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (WithOrigin (Tip blk))) :*: S1 ('MetaSel ('Just "currentIndex") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Index m blk h)))))) | |||||
State helpers
type ModifyOpenState (m ∷ Type → Type) 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 ∷ Type → Type) 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 ∷ Type → Type) 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 ∷ (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 UnexpectedFailure 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 ∷ (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 UnexpectedFailure is thrown while the action is being run, the
database is closed to prevent further appending to a database in a
potentially inconsistent state.