Safe HaskellNone



Rethrow policy for MuxConnectionHandler.

Connection manager has a centralised way of handling exceptions. RethrowPolicy is a way to decided wheather it is enough to shutdown connection or the node should shut down itself. Theis mechanism is affected by the design choices in the mutliplexer.

Whenever a mini-protocol throws an exception, the bearer is closed. There is no way to recover a bidirectional connection if one side failed, in such way that the other end could still re-use it, e.g. if the initiator throws, we cannot just restart it on the same bearer, since there might be unconsumed bytes on the other end.

RethrowPolicy is supplied to makeMuxConnectionHandler which creates both the action that runs on each connection and error handler. Error handler is attached by the connection manager (see Core). This error handler is using RethrowPolicy.

This mechanism is enough for both:

  • the server implemented in Server,
  • PeerStateActions used by peer-to-peer governor.

Since both start mini-protocols with runMiniProtocol they can also have access to the result / exception thrown of a mini-protocol. PeerStateActions are only using this to inform the governor that the peer transitioned to PeerCold or to deactivate the peer.



mkRethrowPolicy ∷ ∀ e. Exception e ⇒ (ErrorContext → e → ErrorCommand) → RethrowPolicy Source #

Smart constructor for RethrowPolicy.

data ErrorCommand Source #



Shutdown node.


Shutdown connection with the peer.


Instances details
Show ErrorCommand Source # 
Instance details

Defined in Ouroboros.Network.RethrowPolicy

Semigroup ErrorCommand Source #

ErrorCommand is a commutative semigroup with ShutdownNode being an absorbing element, and ShutdownPeer is the unit element.

Instance details

Defined in Ouroboros.Network.RethrowPolicy

Monoid ErrorCommand Source # 
Instance details

Defined in Ouroboros.Network.RethrowPolicy

data ErrorContext Source #

Weather an exception happend on outbound or inbound connection.

TODO: It would be more useful to have access weather the exception happend on initiator or responder. The easiest way to fix this is make mux throw the exception together with context. This allows to keep error handling be done only by the connection manager (rather than by server and PeerStateActions).


Instances details
Show ErrorContext Source # 
Instance details

Defined in Ouroboros.Network.RethrowPolicy

Example policies