ouroboros-consensus-0.1.0.1: Consensus layer for the Ouroboros blockchain protocol
Safe Haskell None
Language Haskell2010

Ouroboros.Consensus.Storage.ImmutableDB.Impl.State

Synopsis

State types

data ImmutableDBEnv m blk Source #

The environment used by the immutable database.

data OpenState m blk h Source #

Internal state when the database is open.

Constructors

OpenState

Fields

Instances

Instances details
Generic ( OpenState m blk h) Source #
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.Impl.State

Associated Types

type Rep ( OpenState m blk h) :: Type -> Type Source #

StandardHash blk => NoThunks ( OpenState m blk h) Source #
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.Impl.State

type Rep ( OpenState m blk h) Source #
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.Impl.State

State helpers

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 :: forall 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 :: forall 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 :: forall m blk a. ( HasCallStack , IOLike m, StandardHash blk, Typeable blk) => ImmutableDBEnv m blk -> ( forall 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.

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 :: forall m blk r. ( HasCallStack , IOLike m, StandardHash blk, Typeable blk) => ImmutableDBEnv m blk -> ( forall 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.