| Safe Haskell | None | 
|---|---|
| Language | Haskell2010 | 
Control.Distributed.Process.Management.Internal.Agent
Synopsis
- type AgentConfig = (Tracer, Weak (CQueue Message), ((TChan Message, TChan Message) -> Process ()) -> IO ProcessId)
- mxAgentController :: Fork -> MVar AgentConfig -> Process ()
- mxStartAgent :: Fork -> TChan Message -> ((TChan Message, TChan Message) -> Process ()) -> IO ProcessId
- startTracing :: Fork -> IO Tracer
- startDeadLetterQueue :: TChan Message -> IO ()
Documentation
type AgentConfig = (Tracer, Weak (CQueue Message), ((TChan Message, TChan Message) -> Process ()) -> IO ProcessId) Source #
A triple containing a configured tracer, weak pointer to the agent controller's mailbox (CQueue) and an expression used to instantiate new agents on the current node.
mxAgentController :: Fork -> MVar AgentConfig -> Process () Source #
Starts a management agent for the current node. The agent process
 must not crash or be killed, so we generally avoid publishing its
 ProcessId where possible.
Our process is also responsible for forwarding messages to the trace
 controller, since having two special processes handled via the
 LocalNode would be inelegant. We forward messages directly to the
 trace controller's message queue, just as the MxEventBus that's
 set up on the LocalNode forwards messages directly to us. This
 optimises the code path for tracing and avoids overloading the node
 node controller's internal control plane with additional routing, at the
 cost of a little more complexity and two cases where we break
 encapsulation.
mxStartAgent :: Fork -> TChan Message -> ((TChan Message, TChan Message) -> Process ()) -> IO ProcessId Source #
Forks a new process in which an mxAgent is run.
startDeadLetterQueue :: TChan Message -> IO () Source #
Start a dead letter (agent) queue.
If no agents are registered on the system, the management event bus will fill up and its data won't be GC'ed until someone comes along and reads from the broadcast channel (via dupTChan of course). This is effectively a leak, so to mitigate it, we start a dead letter queue that drains the event bus continuously, thus ensuring if there are no other consumers that we won't use up heap space unnecessarily.