ouroboros-network-framework-0.1.0.0
Safe HaskellNone
LanguageHaskell2010

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

Methods

fmap ∷ (a → b) → SuspendDecision a → SuspendDecision b Source #

(<$) ∷ a → SuspendDecision b → SuspendDecision a Source #

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

Methods

(<|)Maybe (PeerState m) → SuspendDecision Time → Maybe (PeerState m)

suspendOrd (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

Methods

(==)PeerState m → PeerState m → Bool Source #

(/=)PeerState m → PeerState m → Bool Source #

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

Methods

(<|)Maybe (PeerState m) → SuspendDecision Time → Maybe (PeerState m)

threadsToCancelOrd (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 PeerStates; 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

ThrowExceptionException e ⇒ e → PeerStates m addr

Or an exception to throw

Instances

Instances details
Eq addr ⇒ Eq (PeerStates IO addr) Source # 
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

Methods

(==)PeerStates IO addr → PeerStates IO addr → Bool Source #

(/=)PeerStates IO addr → PeerStates IO addr → Bool Source #

Show addr ⇒ Show (PeerStates IO addr) Source # 
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

Methods

showsPrecIntPeerStates IO addr → ShowS Source #

showPeerStates IO addr → String Source #

showList ∷ [PeerStates IO addr] → ShowS Source #

newPeerStatesVar ∷ MonadSTM m ⇒ m (StrictTVar m (PeerStates m addr)) Source #

newPeerStatesVarSTM ∷ MonadSTM m ⇒ STM m (StrictTVar m (PeerStates m addr)) Source #

cleanPeerStates ∷ (MonadSTM m, MonadAsync m, MonadTime m, MonadTimer m) ⇒ DiffTime → StrictTVar m (PeerStates m addr) → m () Source #

Periodically clean PeerState. It will stop when PeerState becomes ThrowException.

runSuspendDecision ∷ ∀ m addr e. (Ord addr, Ord (Async m ()), Exception e) ⇒ Time → addr → e → SuspendDecision DiffTimePeerStates 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 ∷ ∀ 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 ∷ ∀ m addr. (Ord addr, Ord (Async m ())) ⇒ addr → Async m () → PeerStates m addr → PeerStates m addr Source #

Unregister consumer from a PeerState.

registerProducer ∷ ∀ 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 ∷ ∀ 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.

Constructors

AllowConnection !s 
DisallowConnection !s 

Instances

Instances details
Functor ConnectDecision Source # 
Instance details

Defined in Ouroboros.Network.Subscription.PeerState

Methods

fmap ∷ (a → b) → ConnectDecision a → ConnectDecision b Source #

(<$) ∷ a → ConnectDecision b → ConnectDecision a Source #

runBeforeConnect ∷ (MonadSTM m, MonadTime m) ⇒ StrictTVar m s → BeforeConnect m s addr → addr → m Bool Source #

Run BeforeConnect callback in a MonadTime monad.

beforeConnectTx ∷ ∀ 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 ∷ (∀ d b. Data d ⇒ c (d → b) → d → c b) → (∀ g. g → c g) → DiffTime → c DiffTime Source #

gunfold ∷ (∀ b r. Data b ⇒ c (b → r) → c r) → (∀ r. r → c r) → Constr → c DiffTime Source #

toConstrDiffTimeConstr Source #

dataTypeOfDiffTimeDataType Source #

dataCast1Typeable t ⇒ (∀ d. Data d ⇒ c (t d)) → Maybe (c DiffTime) Source #

dataCast2Typeable t ⇒ (∀ d e. (Data d, Data e) ⇒ c (t d e)) → Maybe (c DiffTime) Source #

gmapT ∷ (∀ b. Data b ⇒ b → b) → DiffTimeDiffTime Source #

gmapQl ∷ (r → r' → r) → r → (∀ d. Data d ⇒ d → r') → DiffTime → r Source #

gmapQr ∷ ∀ r r'. (r' → r → r) → r → (∀ d. Data d ⇒ d → r') → DiffTime → r Source #

gmapQ ∷ (∀ d. Data d ⇒ d → u) → DiffTime → [u] Source #

gmapQiInt → (∀ d. Data d ⇒ d → u) → DiffTime → u Source #

gmapMMonad m ⇒ (∀ d. Data d ⇒ d → m d) → DiffTime → m DiffTime Source #

gmapMpMonadPlus m ⇒ (∀ d. Data d ⇒ d → m d) → DiffTime → m DiffTime Source #

gmapMoMonadPlus m ⇒ (∀ 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

Methods

properFractionIntegral b ⇒ DiffTime → (b, DiffTime) Source #

truncateIntegral b ⇒ DiffTime → b Source #

roundIntegral b ⇒ DiffTime → b Source #

ceilingIntegral b ⇒ DiffTime → b Source #

floorIntegral b ⇒ DiffTime → b Source #

Show DiffTime 
Instance details

Defined in Data.Time.Clock.Internal.DiffTime

NFData DiffTime 
Instance details

Defined in Data.Time.Clock.Internal.DiffTime

Methods

rnfDiffTime → () Source #

NoThunks DiffTime 
Instance details

Defined in NoThunks.Class

Methods

noThunks ∷ Context → DiffTimeIO (Maybe ThunkInfo)

wNoThunks ∷ Context → DiffTimeIO (Maybe ThunkInfo)

showTypeOfProxy DiffTimeString

Auxiliary functions

alterAndLookup ∷ ∀ k s a. Ord k ⇒ (Maybe a → (s, Maybe a)) → k → Map k a → (Map k a, Maybe s) Source #