ouroboros-network-framework-0.1.0.1
Safe Haskell None
Language Haskell2010

Ouroboros.Network.Subscription.PeerState

Description

This module contains peer state management and error policies.

Synopsis

Documentation

data SuspendDecision t Source #

Semigroup of commands which acts on PeerState . The t variable might be initiated to DiffTime or Time m .

This semigroup allows to either suspend both consumer and producer or just the consumer part.

Constructors

SuspendPeer !t !t

peer is suspend; The first t is the time until which a local producer is suspended, the second one is the time until which a local consumer is suspended.

SuspendConsumer !t

suspend local consumer / initiator side until t (this mean we are not allowing to communicate with the producer / responder of a remote peer).

Throw

throw an error from the main thread.

Instances

Instances details
Functor SuspendDecision Source #
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

Eq t => Eq ( SuspendDecision t) Source #
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

Ord t => Ord ( SuspendDecision t) Source #
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

Show t => Show ( SuspendDecision t) Source #
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

Ord t => Semigroup ( SuspendDecision t) Source #

The semigroup instance. Note that composing SuspendPeer with SuspendConsumer gives SuspendPeer . SuspendPeer and SuspendConsumer form a sub-semigroup.

Instance details

Defined in Ouroboros.Network.Subscription.PeerState

SAct ( SuspendDecision Time ) ( Maybe ( PeerState m)) Source #

Action of SuspendDecision on Maybe PeerState . We use this action together with alter function.

Note: SuspendDecision does not act on PeerState , only the sub-semigroup generated by SuspendConsumer and SuspendPeer does.

Instance details

Defined in Ouroboros.Network.Subscription.PeerState

suspend :: Ord ( Async m ()) => Maybe ( PeerState m) -> SuspendDecision Time -> ( Set ( Async m ()), Maybe ( PeerState m)) Source #

Action of SuspendDecision on Maybe PeerState . Action laws are only satisfied for the submonoid form by SuspendPeer and SuspendConsumer .

PeerStates and its operations

data PeerState m Source #

Constructors

HotPeer !( Set ( Async m ())) !( Set ( Async m ()))

active peer with its producers and consumer threads

SuspendedConsumer !( Set ( Async m ())) ! Time

suspended consumer: with producer threads and time until the consumer is suspended

SuspendedPeer ! Time ! Time

suspended peer: producer & consumer suspend time

ColdPeer

peer with no opened connections in either direction

Instances

Instances details
Eq ( Async m ()) => Eq ( PeerState m) Source #
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

Ord ( Async m ()) => Ord ( PeerState m) Source #
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

( MonadAsync m, Show ( ThreadId m), Ord ( ThreadId m)) => Show ( PeerState m) Source #
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

SAct ( SuspendDecision Time ) ( Maybe ( PeerState m)) Source #

Action of SuspendDecision on Maybe PeerState . We use this action together with alter function.

Note: SuspendDecision does not act on PeerState , only the sub-semigroup generated by SuspendConsumer and SuspendPeer does.

Instance details

Defined in Ouroboros.Network.Subscription.PeerState

threadsToCancel :: Ord ( Async m ()) => PeerState m -> SuspendDecision diffTime -> Set ( Async m ()) Source #

Threads which needs to be cancelled when updating the PeerState with SuspendDecision .

data PeerStates m addr where Source #

Map from addresses to PeerState s; it will be be shared in a StrictTVar .

Abstracting t is useful for tests, the IO version will use Time IO .

Constructors

PeerStates :: !( Map addr ( PeerState m)) -> PeerStates m addr

Map of peer states

ThrowException :: Exception e => e -> PeerStates m addr

Or an exception to throw

runSuspendDecision :: forall m addr e. ( Ord addr, Ord ( Async m ()), Exception e) => Time -> addr -> e -> SuspendDecision DiffTime -> PeerStates m addr -> ( PeerStates m addr, Set ( Async m ())) Source #

Update PeerStates for a given addr , using suspend , and return threads which must be cancelled.

This is more efficient that using the action of SuspendDecision on PeerStates , since it only uses a single dictionary lookup to update the state and return the set of threads to be cancelled.

registerConsumer :: forall m addr. ( Ord addr, Ord ( Async m ())) => addr -> Async m () -> PeerStates m addr -> PeerStates m addr Source #

Register consumer in PeerState . This is a partial function which assumes that the PeerState is HotPeer .

unregisterConsumer :: forall m addr. ( Ord addr, Ord ( Async m ())) => addr -> Async m () -> PeerStates m addr -> PeerStates m addr Source #

Unregister consumer from a PeerState .

registerProducer :: forall m addr. ( Ord addr, Ord ( Async m ())) => addr -> Async m () -> PeerStates m addr -> PeerStates m addr Source #

Register producer in PeerStates. This is a partial function which assumes that the PeerState is either HotPeer or SuspendedConsumer .

unregisterProducer :: forall m addr. ( Ord addr, Ord ( Async m ())) => addr -> Async m () -> PeerStates m addr -> PeerStates m addr Source #

type BeforeConnect m s addr = Time -> addr -> s -> STM m ( ConnectDecision s) Source #

Check state before connecting to a remote peer. We will connect only if it retuns True .

data ConnectDecision s Source #

Before connectin with a peer we make a decision to either connect to it or not.

beforeConnectTx :: forall m addr. ( MonadSTM m, Ord addr) => BeforeConnect m ( PeerStates m addr) addr Source #

BeforeConnect callback: it updates peer state and return boolean value wheather to connect to it or not. If a peer hasn't been recorded in PeerStates , we add it and try to connect to it.

Re-exports

data DiffTime Source #

This is a length of time, as measured by a clock. Conversion functions will treat it as seconds. It has a precision of 10^-12 s.

Instances

Instances details
Enum DiffTime
Instance details

Defined in Data.Time.Clock.Internal.DiffTime

Eq DiffTime
Instance details

Defined in Data.Time.Clock.Internal.DiffTime

Fractional DiffTime
Instance details

Defined in Data.Time.Clock.Internal.DiffTime

Data DiffTime
Instance details

Defined in Data.Time.Clock.Internal.DiffTime

Methods

gfoldl :: ( forall d b. Data d => c (d -> b) -> d -> c b) -> ( forall g. g -> c g) -> DiffTime -> c DiffTime Source #

gunfold :: ( forall b r. Data b => c (b -> r) -> c r) -> ( forall r. r -> c r) -> Constr -> c DiffTime Source #

toConstr :: DiffTime -> Constr Source #

dataTypeOf :: DiffTime -> DataType Source #

dataCast1 :: Typeable t => ( forall d. Data d => c (t d)) -> Maybe (c DiffTime ) Source #

dataCast2 :: Typeable t => ( forall d e. ( Data d, Data e) => c (t d e)) -> Maybe (c DiffTime ) Source #

gmapT :: ( forall b. Data b => b -> b) -> DiffTime -> DiffTime Source #

gmapQl :: (r -> r' -> r) -> r -> ( forall d. Data d => d -> r') -> DiffTime -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> ( forall d. Data d => d -> r') -> DiffTime -> r Source #

gmapQ :: ( forall d. Data d => d -> u) -> DiffTime -> [u] Source #

gmapQi :: Int -> ( forall d. Data d => d -> u) -> DiffTime -> u Source #

gmapM :: Monad m => ( forall d. Data d => d -> m d) -> DiffTime -> m DiffTime Source #

gmapMp :: MonadPlus m => ( forall d. Data d => d -> m d) -> DiffTime -> m DiffTime Source #

gmapMo :: MonadPlus m => ( forall d. Data d => d -> m d) -> DiffTime -> m DiffTime Source #

Num DiffTime
Instance details

Defined in Data.Time.Clock.Internal.DiffTime

Ord DiffTime
Instance details

Defined in Data.Time.Clock.Internal.DiffTime

Real DiffTime
Instance details

Defined in Data.Time.Clock.Internal.DiffTime

RealFrac DiffTime
Instance details

Defined in Data.Time.Clock.Internal.DiffTime

Show DiffTime
Instance details

Defined in Data.Time.Clock.Internal.DiffTime

NFData DiffTime
Instance details

Defined in Data.Time.Clock.Internal.DiffTime

NoThunks DiffTime
Instance details

Defined in NoThunks.Class

Auxiliary functions

alterAndLookup :: forall k s a. Ord k => ( Maybe a -> (s, Maybe a)) -> k -> Map k a -> ( Map k a, Maybe s) Source #