git.iko.soy/distributed-process
on master help sign in
Management Agent API Improvements
commit4957534aa559f98364d3fb3f6ad1f4bd55656268 authorTim Watson <watson.timothy@gmail.com> dateFri 20 Sep 2013, 17:44 (13 years ago) parent0d2e609
15 files changed+341−268
distributed-process.cabal+1 src/Control/Distributed/Process/Debug.hs+3−2 src/Control/Distributed/Process/Internal/Primitives.hs+13−7 src/Control/Distributed/Process/Internal/Types.hs+11−5 src/Control/Distributed/Process/Management.hs+73−29 src/Control/Distributed/Process/Management/Agent.hs+12−7 src/Control/Distributed/Process/Management/Bus.hs+13−7 src/Control/Distributed/Process/Management/Table.hs+3−6 src/Control/Distributed/Process/Management/Trace/Primitives.hs+9−9 src/Control/Distributed/Process/Management/Trace/Remote.hs+1−2 src/Control/Distributed/Process/Management/Trace/Tracer.hs+4−2 src/Control/Distributed/Process/Management/Trace/Types.hs+47−153 src/Control/Distributed/Process/Management/Types.hs+108−3 src/Control/Distributed/Process/Node.hs+40−36 tests/TestTracing.hs+3
distributed-process.cabal+1
@@ -81,6 +81,7 @@ Library
8181 Control.Distributed.Process.Internal.StrictContainerAccessors,
8282 Control.Distributed.Process.Management.Bus,
8383 Control.Distributed.Process.Management.Table,
84+ Control.Distributed.Process.Management.Types,
8485 Control.Distributed.Process.Management.Trace.Primitives,
8586 Control.Distributed.Process.Management.Trace.Remote,
8687 Control.Distributed.Process.Management.Trace.Types,
src/Control/Distributed/Process/Debug.hs+3−2
@@ -92,7 +92,6 @@
9292module Control.Distributed.Process.Debug
9393 ( -- * Exported Data Types
9494 TraceArg(..)
95− , MxEvent(..)
9695 , TraceFlags(..)
9796 , TraceSubject(..)
9897 -- * Configuring Tracing
@@ -145,9 +144,11 @@ import Control.Distributed.Process.Internal.Types
145144 , LocalProcess(..)
146145 , ProcessMonitorNotification(..)
147146 )
147+import Control.Distributed.Process.Management.Types
148+ ( MxEvent(..)
149+ )
148150import Control.Distributed.Process.Management.Trace.Types
149151 ( TraceArg(..)
150− , MxEvent(..)
151152 , TraceFlags(..)
152153 , TraceSubject(..)
153154 , defaultTraceFlags
src/Control/Distributed/Process/Internal/Primitives.hs+13−7
@@ -191,9 +191,14 @@ import Control.Distributed.Process.Internal.Messaging
191191 , disconnect
192192 , sendCtrlMsg
193193 )
194+import qualified Control.Distributed.Process.Management.Bus as Mx
195+ ( publishEvent
196+ )
197+import Control.Distributed.Process.Management.Types
198+ ( MxEvent(..)
199+ )
194200import Control.Distributed.Process.Management.Trace.Types
195201 ( traceEvent
196− , MxEvent(..)
197202 )
198203import Control.Distributed.Process.Internal.WeakTQueue
199204 ( newTQueueIO
@@ -224,10 +229,11 @@ send them msg = do
224229 (ProcessIdentifier them)
225230 NoImplicitReconnect
226231 msg
227− -- We do not fire the trace event until after the sending is complete;
228− -- In the remote case, 'sendMessage' can block in the networking stack.
229− liftIO $ traceEvent (localEventBus node)
230− (MxSent them us (createUnencodedMessage msg))
232+ -- We do not fire the trace event until after sending completes, since
233+ -- in the remote case, 'sendMessage' can block in the networking stack.
234+ liftIO $ do
235+ let msg = createUnencodedMessage $ (MxSent them us (createUnencodedMessage msg))
236+ Mx.publishEvent (localEventBus node) msg
231237
232238-- | /Unsafe/ variant of 'send'. This function makes /no/ attempt to serialize
233239-- and (in the case when the destination process resides on the same local
@@ -410,8 +416,8 @@ forward msg them = do
410416 (messageToPayload msg)
411417 -- We do not fire the trace event until after the sending is complete;
412418 -- In the remote case, 'sendMessage' can block in the networking stack.
413− liftIO $ traceEvent (localEventBus node)
414− (MxSent them us msg)
419+ liftIO $ Mx.publishEvent (localEventBus node)
420+ (createUnencodedMessage (MxSent them us msg))
415421
416422
417423-- | Wrap a 'Serializable' value in a 'Message'. Note that 'Message's are
src/Control/Distributed/Process/Internal/Types.hs+11−5
@@ -200,22 +200,26 @@ nullProcessId nid =
200200-- Local nodes and processes --
201201--------------------------------------------------------------------------------
202202
203−-- | Provides access to the trace controller.
203+-- | Provides access to the trace controller
204204data Tracer = Tracer
205205 {
206+ -- | Process id for the currently active trace handler
206207 tracerPid :: !ProcessId
208+ -- | Weak reference to the tracer controller's mailbox
207209 , weakQ :: !(Weak (CQueue Message))
208210 }
209211
210−-- | Required for the system management and tracing facilities.
212+-- | Local system management event bus state
211213data MxEventBus =
212214 MxEventBusInitialising
213215 | MxEventBus
214216 {
217+ -- | Process id of the management agent controller process
215218 agent :: !ProcessId
216− , tracer :: !Tracer
219+ -- | Weak reference to the management agent controller's mailbox
217220 , evbuss :: !(Weak (CQueue Message))
218− , mxNew :: !((TChan Message -> Process ()) -> IO ProcessId)
221+ -- | API for adding management agents to a running node
222+ , mxNew :: !(((TChan Message, TChan Message) -> Process ()) -> IO ProcessId)
219223-- , mxReg :: !(StrictMVar (Map MxAgentId ))
220224 }
221225
@@ -229,11 +233,13 @@ data LocalNode = LocalNode
229233 , localState :: !(StrictMVar LocalNodeState)
230234 -- | Channel for the node controller
231235 , localCtrlChan :: !(Chan NCMsg)
232− -- | Current active system debug/trace log
236+ -- | Internal management event bus
233237 , localEventBus :: !MxEventBus
234238 -- | Runtime lookup table for supporting closures
235239 -- TODO: this should be part of the CH state, not the local endpoint state
236240 , remoteTable :: !RemoteTable
241+ -- | Active local tracer process. This is our only non-strict field.
242+ , localTracer :: Tracer
237243 }
238244
239245data ImplicitReconnect = WithImplicitReconnect | NoImplicitReconnect
src/Control/Distributed/Process/Management.hs+73−29
@@ -3,7 +3,6 @@
33{-# LANGUAGE StandaloneDeriving #-}
44{-# LANGUAGE ExistentialQuantification #-}
55{-# LANGUAGE ScopedTypeVariables #-}
6−{-# LANGUAGE PatternGuards #-}
76{-# LANGUAGE RecordWildCards #-}
87{-# LANGUAGE FlexibleInstances #-}
98{-# LANGUAGE UndecidableInstances #-}
@@ -40,20 +39,24 @@
4039-----------------------------------------------------------------------------
4140module Control.Distributed.Process.Management
4241 (
43− MxAction()
44− , MxAgentId
45− -- * Firing /mx events/
42+ MxEvent(..)
43+ -- * Firing Arbitrary /Mx Events/
4644 , mxNotify
47− -- * Constructing Agents
45+ -- * Constructing Mx Agents
46+ , MxAction()
47+ , MxAgentId
48+ , MxAgent()
4849 , mxAgent
49− , mxAgentDeactivate
50− , mxAgentReady
51− , mxAgentPublish
50+ , MxSink
51+ , mxSink
52+ , mxGetId
53+ , mxDeactivate
54+ , mxReady
55+ , mxBroadcast
5256 , mxSetLocal
5357 , mxGetLocal
54− -- * Lifting
55− , liftP
56− -- * Management Data API
58+ , mxLift
59+ -- * Mx Data API
5760 , mxPublish
5861 , mxSet
5962 , mxGet
@@ -63,12 +66,14 @@ import Control.Applicative ((<$>))
6366import Control.Concurrent.STM (atomically)
6467import Control.Concurrent.STM.TChan
6568 ( readTChan
69+ , writeTChan
6670 )
6771import Control.Distributed.Process.Internal.Primitives
6872 ( newChan
6973 , nsend
7074 , receiveWait
7175 , matchChan
76+ , unwrapMessage
7277 )
7378import Control.Distributed.Process.Internal.Types
7479 ( Process
@@ -84,8 +89,11 @@ import qualified Control.Distributed.Process.Management.Table as Table
8489import Control.Distributed.Process.Management.Types
8590 ( MxAgentId(..)
8691 , MxAgent(..)
92+ , MxAction(..)
8793 , MxAgentState(..)
8894 , MxAgentStart(..)
95+ , MxSink
96+ , MxEvent(..)
8997 )
9098import Control.Distributed.Process.Serializable (Serializable)
9199import Control.Monad.IO.Class (liftIO)
@@ -99,10 +107,6 @@ import qualified Control.Monad.State as ST
99107 , runStateT
100108 )
101109
102−data MxAction =
103− MxAgentDeactivate !String
104− | MxAgentReady
105−
106110-- | Publishes an arbitrary @Serializable@ message to the management event bus.
107111-- Note that /no attempt is made to force the argument/, therefore it is very
108112-- important that you do not pass unevaluated thunks that might crash the
@@ -141,16 +145,23 @@ mxGet mxId = Table.fetch (Table.MxForAgent mxId)
141145-- API for writing user defined management extensions (i.e., agents) --
142146--------------------------------------------------------------------------------
143147
144−mxAgentPublish = undefined
148+mxGetId :: MxAgent s MxAgentId
149+mxGetId = ST.get >>= return . mxAgentId
145150
146−mxAgentDeactivate :: forall s. String -> MxAgent s MxAction
147−mxAgentDeactivate = return . MxAgentDeactivate
151+mxBroadcast :: (Serializable m) => m -> MxAgent s ()
152+mxBroadcast msg = do
153+ state <- ST.get
154+ mxLift $ liftIO $ atomically $ do
155+ writeTChan (mxBus state) (unsafeCreateUnencodedMessage msg)
148156
149−mxAgentReady :: forall s. MxAgent s MxAction
150−mxAgentReady = return MxAgentReady
157+mxDeactivate :: forall s. String -> MxAgent s MxAction
158+mxDeactivate = return . MxAgentDeactivate
151159
152−liftP :: Process a -> MxAgent s a
153−liftP p = MxAgent $ ST.lift p
160+mxReady :: forall s. MxAgent s MxAction
161+mxReady = return MxAgentReady
162+
163+mxLift :: Process a -> MxAgent s a
164+mxLift p = MxAgent $ ST.lift p
154165
155166mxSetLocal :: s -> MxAgent s ()
156167mxSetLocal s = ST.modify $ \st -> st { mxLocalState = s }
@@ -158,31 +169,64 @@ mxSetLocal s = ST.modify $ \st -> st { mxLocalState = s }
158169mxGetLocal :: MxAgent s s
159170mxGetLocal = ST.get >>= return . mxLocalState
160171
172+mxSink :: forall s m . (Serializable m)
173+ => (m -> MxAgent s MxAction)
174+ -> MxSink s
175+mxSink act msg = do
176+ msg' <- mxLift $ (unwrapMessage msg :: Process (Maybe m))
177+ case msg' of
178+ Nothing -> return Nothing
179+ Just m -> act m >>= return . Just
180+
181+data MxPipeline s =
182+ MxPipeline
183+ {
184+ current :: !(MxSink s)
185+ , next :: !(MxPipeline s)
186+ } | MxStop
187+
161188-- | Activates a new agent.
162189--
163190mxAgent :: MxAgentId
164191 -> s
165− -> (Message -> MxAgent s MxAction)
192+ -> [MxSink s]
166193 -> Process ProcessId
167−mxAgent mxId initState handler = do
194+mxAgent mxId initState handlers = do
168195 node <- processNode <$> ask
169196 pid <- liftIO $ mxNew (localEventBus node) $ start
170197 return pid
171198 where
172− start chan = do
199+ start (sendTChan, recvTChan) = do
173200 (sp, rp) <- newChan
174201 nsend Table.mxTableCoordinator (MxAgentStart sp mxId)
175202 tablePid <- receiveWait [ matchChan rp (\(p :: ProcessId) -> return p) ]
176− runAgent handler chan $ MxAgentState mxId tablePid initState
203+ runAgent handlers recvTChan $ MxAgentState mxId sendTChan tablePid initState
177204
178− runAgent h c s = do
205+ runAgent hs c s = do
179206 msg <- (liftIO $ atomically $ readTChan c)
180− (action, state) <- runAgentST s $ h msg
207+ (action, state) <- runPipeline msg s $ pipeline hs
181208 case action of
182− MxAgentReady -> runAgent h c state
209+ MxAgentReady -> runAgent hs c state
183210 MxAgentDeactivate _ -> {- TODO: log r -} return ()
184211-- MxAgentBecome h' -> runAgent h' c state
185212
213+ pipeline :: forall s . [MxSink s] -> MxPipeline s
214+ pipeline [] = MxStop
215+ pipeline (sink:sinks) = MxPipeline sink (pipeline sinks)
216+
217+ runPipeline :: forall s .
218+ Message
219+ -> MxAgentState s
220+ -> MxPipeline s
221+ -> Process (MxAction, MxAgentState s)
222+ runPipeline _ state MxStop = return (MxAgentReady, state)
223+ runPipeline msg state MxPipeline{..} = do
224+ let act = current msg
225+ (pass, state') <- ST.runStateT (unAgent act) state
226+ case pass of
227+ Nothing -> runPipeline msg state next
228+ Just result -> return (result, state')
229+
186230 runAgentST :: MxAgentState s
187231 -> MxAgent s MxAction
188232 -> Process (MxAction, MxAgentState s)
src/Control/Distributed/Process/Management/Agent.hs+12−7
@@ -46,16 +46,16 @@ import GHC.Weak (Weak, deRefWeak)
4646-- Agent Controller Implementation --
4747--------------------------------------------------------------------------------
4848
49−
5049-- | A triple containing a configured tracer, weak pointer to the
5150-- agent controller's mailbox (CQueue) and an expression used to
5251-- instantiate new agents on the current node.
5352type AgentConfig =
54− (Tracer, Weak (CQueue Message), ((TChan Message -> Process ()) -> IO ProcessId))
53+ (Tracer, Weak (CQueue Message),
54+ (((TChan Message, TChan Message) -> Process ()) -> IO ProcessId))
5555
5656-- | Starts a management agent for the current node. The agent process
5757-- must not crash or be killed, so we generally avoid publishing its
58−-- 'ProcessId' where possible.
58+-- @ProcessId@ where possible.
5959--
6060-- Our process is also responsible for forwarding messages to the trace
6161-- controller, since having two /special processes/ handled via the
@@ -76,9 +76,9 @@ mxAgentController forkProcess mv = do
7676 sigbus <- liftIO $ newBroadcastTChanIO
7777 weakQueue <- processWeakQ <$> ask
7878 liftIO $ putMVar mv (trc, weakQueue, mxStartAgent forkProcess sigbus)
79− go sigbus trc forkProcess
79+ go sigbus trc
8080 where
81− go bus tracer fork = forever' $ do
81+ go bus tracer = forever' $ do
8282 void $ receiveWait [
8383 -- This is exactly what it appears to be: a "catch all" handler.
8484 -- Since mxNotify can potentially pass an unevaluated thunk to
@@ -115,8 +115,13 @@ mxAgentController forkProcess mv = do
115115 liftIO $ atomically $ enqueueSTM q msg >> writeTChan ch msg
116116
117117-- | Forks a new process in which an mxAgent is run.
118−mxStartAgent :: Fork -> TChan Message -> (TChan Message -> Process ()) -> IO ProcessId
119−mxStartAgent fork chan handler = (atomically (dupTChan chan)) >>= fork . handler
118+mxStartAgent :: Fork
119+ -> TChan Message
120+ -> ((TChan Message, TChan Message) -> Process ())
121+ -> IO ProcessId
122+mxStartAgent fork chan handler = do
123+ chan' <- atomically (dupTChan chan)
124+ let proc = handler (chan, chan') in fork proc
120125
121126startTracing :: Fork -> IO Tracer
122127startTracing forkProcess = do
src/Control/Distributed/Process/Management/Bus.hs+13−7
@@ -1,13 +1,16 @@
11-- | Interface to the management event bus.
22module Control.Distributed.Process.Management.Bus
33 ( publishEvent
4+ , enqueueEvent
45 ) where
56
67import Control.Distributed.Process.Internal.CQueue
7− ( enqueue
8+ ( CQueue
9+ , enqueue
810 )
911import Control.Distributed.Process.Internal.Types
10− ( MxEventBus(..)
12+ ( LocalNode(..)
13+ , MxEventBus(..)
1114 , Message
1215 , ProcessId
1316 , DiedReason
@@ -19,11 +22,14 @@ import Network.Transport
1922 ( ConnectionId
2023 , EndPointAddress
2124 )
22−import System.Mem.Weak (deRefWeak)
25+import System.Mem.Weak (Weak, deRefWeak)
2326
2427publishEvent :: MxEventBus -> Message -> IO ()
25−publishEvent MxEventBusInitialising _ = return ()
26−publishEvent (MxEventBus _ _ wqRef _) msg = do
27− mQueue <- deRefWeak wqRef
28− forM_ mQueue $ \queue -> enqueue queue msg
28+publishEvent MxEventBusInitialising _ = return ()
29+publishEvent (MxEventBus _ wqRef _) msg = enqueueEvent wqRef msg
30+
31+enqueueEvent :: Weak (CQueue Message) -> Message -> IO ()
32+enqueueEvent wqRef msg = do
33+ mQueue <- deRefWeak wqRef
34+ forM_ mQueue $ \queue -> enqueue queue msg
2935
src/Control/Distributed/Process/Management/Table.hs+3−6
@@ -72,11 +72,8 @@ data MxTableRequest =
7272 deriving (Typeable, Generic)
7373instance Binary MxTableRequest where
7474
75−data MxTableState = MxTableState
76− {
77− _name :: !String
78− , _entries :: !(Map String Message)
79− }
75+data MxTableState =
76+ MxTableState { _name :: !String, _entries :: !(Map String Message) }
8077
8178type MxTables = Map MxAgentId ProcessId
8279
@@ -187,7 +184,7 @@ startTableCoordinator fork = run Map.empty
187184
188185 spawnSup proc = do
189186 us <- getSelfPid
190− -- we need to used that passed in "fork", in order to
187+ -- we need to use that passed in "fork", in order to
191188 -- break an import cycle with Node.hs via the management
192189 -- agent, management API and the tracing modules
193190 them <- liftIO $ fork $ link us >> proc
src/Control/Distributed/Process/Management/Trace/Primitives.hs+9−9
@@ -6,10 +6,8 @@
66-- This module is also used by the management agent, which relies on the
77-- tracing infrastructure's messaging fabric.
88module Control.Distributed.Process.Management.Trace.Primitives
9− ( Tracer
10− , MxEvent(..)
11− -- * Sending Trace Data
12− , traceLog
9+ ( -- * Sending Trace Data
10+ traceLog
1311 , traceLogFmt
1412 , traceMessage
1513 -- * Configuring A Tracer
@@ -34,9 +32,11 @@ import Control.Distributed.Process.Internal.Primitives
3432 , newChan
3533 , receiveChan
3634 )
35+import Control.Distributed.Process.Management.Types
36+ ( MxEvent(..)
37+ )
3738import Control.Distributed.Process.Management.Trace.Types
3839 ( TraceArg(..)
39− , MxEvent(..)
4040 , TraceFlags(..)
4141 , TraceOk(..)
4242 , TraceSubject(..)
@@ -60,7 +60,7 @@ import Control.Distributed.Process.Internal.Types
6060 , Process
6161 , ProcessId
6262 , LocalProcess(..)
63− , LocalNode(localEventBus)
63+ , LocalNode(localEventBus, localTracer)
6464 , SendPort
6565 , MxEventBus(..)
6666 )
@@ -152,12 +152,12 @@ traceLogFmt d ls = withLocalTracer $ \t -> liftIO $ Tracer.traceLogFmt t d ls
152152traceMessage :: Serializable m => m -> Process ()
153153traceMessage msg = withLocalTracer $ \t -> liftIO $ Tracer.traceMessage t msg
154154
155−withLocalTracer :: (MxEventBus -> Process ()) -> Process ()
155+withLocalTracer :: (Tracer -> Process ()) -> Process ()
156156withLocalTracer act = do
157157 node <- processNode <$> ask
158− act (localEventBus node)
158+ act (localTracer node)
159159
160−withLocalTracerSync :: (MxEventBus -> SendPort TraceOk -> IO ()) -> Process ()
160+withLocalTracerSync :: (Tracer -> SendPort TraceOk -> IO ()) -> Process ()
161161withLocalTracerSync act = do
162162 (sp, rp) <- newChan
163163 withLocalTracer $ \t -> liftIO $ (act t sp)
src/Control/Distributed/Process/Management/Trace/Remote.hs+1−2
@@ -1,5 +1,5 @@
11module Control.Distributed.Process.Management.Trace.Remote
2− ( -- * Configuring A Tracer
2+ ( -- * Configuring A Remote Tracer
33 setTraceFlagsRemote
44 , startTraceRelay
55 -- * Remote Table
@@ -50,7 +50,6 @@ enableTraceRemote pid =
5050startTraceRelay :: NodeId -> Process ProcessId
5151startTraceRelay nodeId = do
5252 withRegisteredTracer $ \pid ->
53− -- TODO: move cpEnableTraceRemote here?
5453 spawn nodeId $ cpEnableTraceRemote pid
5554
5655-- | Set the given flags for a remote node (asynchronous).
src/Control/Distributed/Process/Management/Trace/Tracer.hs+4−2
@@ -31,10 +31,12 @@ import Control.Distributed.Process.Internal.Primitives
3131 , handleMessage
3232 , matchUnknown
3333 )
34−import Control.Distributed.Process.Management.Trace.Types
34+import Control.Distributed.Process.Management.Types
3535 ( MxEvent(..)
36− , SetTrace(..)
3736 , Addressable(..)
37+ )
38+import Control.Distributed.Process.Management.Trace.Types
39+ ( SetTrace(..)
3840 , TraceSubject(..)
3941 , TraceFlags(..)
4042 , TraceOk(..)
src/Control/Distributed/Process/Management/Trace/Types.hs+47−153
@@ -1,9 +1,8 @@
1+{-# LANGUAGE DeriveGeneric #-}
2+
13-- | Tracing/Debugging support - Types
24module Control.Distributed.Process.Management.Trace.Types
3− ( MxEventBus(..)
4− , MxEvent(..)
5− , SetTrace(..)
6− , Addressable(..)
5+ ( SetTrace(..)
76 , TraceSubject(..)
87 , TraceFlags(..)
98 , TraceArg(..)
@@ -27,6 +26,7 @@ import Control.Applicative ((<$>), (<*>))
2726import Control.Distributed.Process.Internal.CQueue (enqueue)
2827import Control.Distributed.Process.Internal.Types
2928 ( MxEventBus(..)
29+ , Tracer(..)
3030 , NodeId
3131 , ProcessId
3232 , DiedReason
@@ -35,7 +35,11 @@ import Control.Distributed.Process.Internal.Types
3535 , unsafeCreateUnencodedMessage
3636 )
3737import Control.Distributed.Process.Management.Bus
38− ( publishEvent
38+ ( enqueueEvent
39+ )
40+import Control.Distributed.Process.Management.Types
41+ ( MxEvent(..)
42+ , Addressable(..)
3943 )
4044import Control.Distributed.Process.Serializable
4145import Data.Binary
@@ -44,6 +48,7 @@ import Data.List (intersperse)
4448import Data.Set (Set)
4549import qualified Data.Set as Set (fromList)
4650import Data.Typeable
51+import GHC.Generics
4752import System.Mem.Weak (deRefWeak)
4853import Network.Transport
4954 ( ConnectionId
@@ -55,51 +60,8 @@ import Network.Transport
5560--------------------------------------------------------------------------------
5661
5762data SetTrace = TraceEnable !ProcessId | TraceDisable
58− deriving (Typeable, Eq, Show)
59−
60−-- TODO: MOVE the whole Trace namespace into C.D.Process.Management
61−
62−-- | An event that is fired when something /interesting/ happens.
63−-- Trace events are forwarded to a trace listener process, of which
64−-- at most one can be registered per-node.
65−data MxEvent =
66− MxSpawned ProcessId
67− -- ^ fired whenever a local process is spawned
68− | MxRegistered ProcessId String
69− -- ^ fired whenever a process/name is registered (locally)
70− | MxUnRegistered ProcessId String
71− -- ^ fired whenever a process/name is unregistered (locally)
72− | MxProcessDied ProcessId DiedReason
73− -- ^ fired whenever a process dies
74− | MxNodeDied NodeId DiedReason
75− -- ^ fired whenever a node /dies/ (i.e., the connection is broken/disconnected)
76− | MxSent ProcessId ProcessId Message
77− -- ^ fired whenever a message is sent from a local process
78− | MxReceived ProcessId Message
79− -- ^ fired whenever a message is received by a local process
80− | MxConnected ConnectionId EndPointAddress
81− -- ^ fired when a network-transport connection is first established
82− | MxDisconnected ConnectionId EndPointAddress
83− -- ^ fired when a network-transport connection is broken/disconnected
84− | MxUser Message
85− -- ^ a user defined trace event (see 'traceMessage')
86− | MxLog String
87− -- ^ a /logging/ event - used for debugging purposes only
88− | MxTraceTakeover ProcessId
89− -- ^ notifies a trace listener that all subsequent traces will be sent to /pid/
90− | MxTraceDisable
91− -- ^ notifies a trace listener that it has been disabled/removed
92− deriving (Typeable, Show)
93−
94−class Addressable a where
95− resolveToPid :: a -> Maybe ProcessId
96−
97−instance Addressable MxEvent where
98− resolveToPid (MxSpawned p) = Just p
99− resolveToPid (MxProcessDied p _) = Just p
100− resolveToPid (MxSent _ p _) = Just p
101− resolveToPid (MxReceived p _) = Just p
102− resolveToPid _ = Nothing
63+ deriving (Typeable, Generic, Eq, Show)
64+instance Binary SetTrace where
10365
10466-- | Defines which processes will be traced by a given 'TraceFlag',
10567-- either by name, or @ProcessId@. Choosing @TraceAll@ is /by far/
@@ -110,7 +72,8 @@ data TraceSubject =
11072 TraceAll -- enable tracing for all running processes
11173 | TraceProcs !(Set ProcessId) -- enable tracing for a set of processes
11274 | TraceNames !(Set String) -- enable tracing for a set of named/registered processes
113− deriving (Show)
75+ deriving (Typeable, Generic, Show)
76+instance Binary TraceSubject where
11477
11578-- | Defines /what/ will be traced. Flags that control tracing of
11679-- @Process@ events, take a 'TraceSubject' controlling which processes
@@ -124,7 +87,8 @@ data TraceFlags = TraceFlags {
12487 , traceRecv :: !(Maybe TraceSubject) -- filter process/message tracing by receiver
12588 , traceNodes :: !Bool -- enable node status trace events
12689 , traceConnections :: !Bool -- enable connection status trace events
127− } deriving (Typeable, Show)
90+ } deriving (Typeable, Generic, Show)
91+instance Binary TraceFlags where
12892
12993defaultTraceFlags :: TraceFlags
13094defaultTraceFlags =
@@ -145,16 +109,17 @@ data TraceArg =
145109
146110-- | A generic 'ok' response from the trace coordinator.
147111data TraceOk = TraceOk
148− deriving (Typeable)
112+ deriving (Typeable, Generic)
113+instance Binary TraceOk where
149114
150115--------------------------------------------------------------------------------
151116-- Internal/Common API --
152117--------------------------------------------------------------------------------
153118
154−traceLog :: MxEventBus -> String -> IO ()
155−traceLog tr s = publishEvent tr (unsafeCreateUnencodedMessage $ MxLog s)
119+traceLog :: Tracer -> String -> IO ()
120+traceLog (Tracer _ wqRef) s = enqueueEvent wqRef (unsafeCreateUnencodedMessage $ MxLog s)
156121
157−traceLogFmt :: MxEventBus
122+traceLogFmt :: Tracer
158123 -> String
159124 -> [TraceArg]
160125 -> IO ()
@@ -164,43 +129,43 @@ traceLogFmt t d ls =
164129 toS (TraceStr s) = s
165130 toS (Trace a) = show a
166131
167−traceEvent :: MxEventBus -> MxEvent -> IO ()
168−traceEvent tr ev = publishEvent tr (unsafeCreateUnencodedMessage ev)
132+traceEvent :: Tracer -> MxEvent -> IO ()
133+traceEvent (Tracer _ wqRef) ev = enqueueEvent wqRef (unsafeCreateUnencodedMessage ev)
169134
170−traceMessage :: Serializable m => MxEventBus -> m -> IO ()
135+traceMessage :: Serializable m => Tracer -> m -> IO ()
171136traceMessage tr msg = traceEvent tr (MxUser (unsafeCreateUnencodedMessage msg))
172137
173−enableTrace :: MxEventBus -> ProcessId -> IO ()
174−enableTrace t p =
175− publishEvent t (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)),
176− (TraceEnable p)))
138+enableTrace :: Tracer -> ProcessId -> IO ()
139+enableTrace (Tracer _ wqRef) p =
140+ enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)),
141+ (TraceEnable p)))
177142
178−enableTraceSync :: MxEventBus -> SendPort TraceOk -> ProcessId -> IO ()
179−enableTraceSync t s p =
180− publishEvent t (unsafeCreateUnencodedMessage (Just s, TraceEnable p))
143+enableTraceSync :: Tracer -> SendPort TraceOk -> ProcessId -> IO ()
144+enableTraceSync (Tracer _ wqRef) s p =
145+ enqueueEvent wqRef (unsafeCreateUnencodedMessage (Just s, TraceEnable p))
181146
182−disableTrace :: MxEventBus -> IO ()
183−disableTrace t =
184− publishEvent t (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)),
147+disableTrace :: Tracer -> IO ()
148+disableTrace (Tracer _ wqRef) =
149+ enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)),
185150 TraceDisable))
186151
187−disableTraceSync :: MxEventBus -> SendPort TraceOk -> IO ()
188−disableTraceSync t s =
189− publishEvent t (unsafeCreateUnencodedMessage ((Just s), TraceDisable))
152+disableTraceSync :: Tracer -> SendPort TraceOk -> IO ()
153+disableTraceSync (Tracer _ wqRef) s =
154+ enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Just s), TraceDisable))
190155
191−setTraceFlags :: MxEventBus -> TraceFlags -> IO ()
192−setTraceFlags t f =
193− publishEvent t (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)), f))
156+setTraceFlags :: Tracer -> TraceFlags -> IO ()
157+setTraceFlags (Tracer _ wqRef) f =
158+ enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)), f))
194159
195−setTraceFlagsSync :: MxEventBus -> SendPort TraceOk -> TraceFlags -> IO ()
196−setTraceFlagsSync t s f =
197− publishEvent t (unsafeCreateUnencodedMessage ((Just s), f))
160+setTraceFlagsSync :: Tracer -> SendPort TraceOk -> TraceFlags -> IO ()
161+setTraceFlagsSync (Tracer _ wqRef) s f =
162+ enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Just s), f))
198163
199−getTraceFlags :: MxEventBus -> SendPort TraceFlags -> IO ()
200−getTraceFlags t s = publishEvent t (unsafeCreateUnencodedMessage s)
164+getTraceFlags :: Tracer -> SendPort TraceFlags -> IO ()
165+getTraceFlags (Tracer _ wqRef) s = enqueueEvent wqRef (unsafeCreateUnencodedMessage s)
201166
202−getCurrentTraceClient :: MxEventBus -> SendPort (Maybe ProcessId) -> IO ()
203−getCurrentTraceClient t s = publishEvent t (unsafeCreateUnencodedMessage s)
167+getCurrentTraceClient :: Tracer -> SendPort (Maybe ProcessId) -> IO ()
168+getCurrentTraceClient (Tracer _ wqRef) s = enqueueEvent wqRef (unsafeCreateUnencodedMessage s)
204169
205170class Traceable a where
206171 uod :: [a] -> TraceSubject
@@ -211,74 +176,3 @@ instance Traceable ProcessId where
211176instance Traceable String where
212177 uod = TraceNames . Set.fromList
213178
214−--------------------------------------------------------------------------------
215−-- Binary Instances --
216−--------------------------------------------------------------------------------
217−
218−instance Binary SetTrace where
219− put (TraceEnable pid) = putWord8 1 >> put pid
220− put TraceDisable = putWord8 2
221−
222− get = do
223− header <- getWord8
224− case header of
225− 1 -> TraceEnable <$> get
226− 2 -> return TraceDisable
227− _ -> error "SetTrace.get - invalid header"
228−
229−instance Binary MxEvent where
230− put (MxSpawned pid) = putWord8 1 >> put pid
231− put (MxRegistered pid str) = putWord8 2 >> put pid >> put str
232− put (MxUnRegistered pid str) = putWord8 3 >> put pid >> put str
233− put (MxProcessDied pid res) = putWord8 4 >> put pid >> put res
234− put (MxNodeDied nid res) = putWord8 5 >> put nid >> put res
235− put (MxSent to from msg) = putWord8 6 >> put to >> put from >> put msg
236− put (MxReceived pid msg) = putWord8 7 >> put pid >> put msg
237− put (MxConnected cid epid) = putWord8 8 >> put cid >> put epid
238− put (MxDisconnected cid epid) = putWord8 9 >> put cid >> put epid
239− put (MxUser msg) = putWord8 10 >> put msg
240− put (MxLog msg) = putWord8 11 >> put msg
241− put (MxTraceTakeover pid) = putWord8 12 >> put pid
242− put MxTraceDisable = putWord8 13
243−
244− get = do
245− header <- getWord8
246− case header of
247− 1 -> MxSpawned <$> get
248− 2 -> MxRegistered <$> get <*> get
249− 3 -> MxUnRegistered <$> get <*> get
250− 4 -> MxProcessDied <$> get <*> get
251− 5 -> MxNodeDied <$> get <*> get
252− 6 -> MxSent <$> get <*> get <*> get
253− 7 -> MxReceived <$> get <*> get
254− 8 -> MxConnected <$> get <*> get
255− 9 -> MxDisconnected <$> get <*> get
256− 10 -> MxUser <$> get
257− 11 -> MxLog <$> get
258− 12 -> MxTraceTakeover <$> get
259− 13 -> return MxTraceDisable
260− _ -> error "MxEvent.get - invalid header"
261−
262−instance Binary TraceSubject where
263− put TraceAll = putWord8 1
264− put (TraceProcs pids) = putWord8 2 >> put pids
265− put (TraceNames names) = putWord8 3 >> put names
266−
267− get = do
268− header <- getWord8
269− case header of
270− 1 -> return TraceAll
271− 2 -> TraceProcs <$> get
272− 3 -> TraceNames <$> get
273− _ -> error "TraceSubject.get - invalid header"
274−
275−instance Binary TraceFlags where
276− put (TraceFlags s d g u m r n c) =
277− put s >> put d >> put g >> put u >> put m >> put r >> put n >> put c
278− get =
279− TraceFlags <$> get <*> get <*> get <*> get <*> get <*> get <*> get <*> get
280−
281−instance Binary TraceOk where
282− put _ = return ()
283− get = return TraceOk
284−
src/Control/Distributed/Process/Management/Types.hs+108−3
@@ -4,16 +4,25 @@ module Control.Distributed.Process.Management.Types
44 , MxTableId(..)
55 , MxAgentState(..)
66 , MxAgent(..)
7+ , MxAction(..)
78 , MxAgentStart(..)
89 , Fork
10+ , MxSink
11+ , MxEvent(..)
12+ , Addressable(..)
913 ) where
1014
11−import Control.Applicative (Applicative)
15+import Control.Applicative ((<$>), (<*>), Applicative)
16+import Control.Concurrent.STM
17+ ( TChan
18+ )
1219import Control.Distributed.Process.Internal.Types
1320 ( Process
1421 , ProcessId
1522 , Message
1623 , SendPort
24+ , DiedReason
25+ , NodeId
1726 )
1827import Control.Monad.IO.Class (MonadIO)
1928import qualified Control.Monad.State as ST
@@ -23,10 +32,95 @@ import qualified Control.Monad.State as ST
2332 , lift
2433 , runStateT
2534 )
26−import Data.Binary (Binary)
35+import Data.Binary
2736import Data.Map.Strict (Map)
2837import Data.Typeable (Typeable)
2938import GHC.Generics
39+import Network.Transport
40+ ( ConnectionId
41+ , EndPointAddress
42+ )
43+
44+
45+-- TODO: consider factoring out MxEvent's tracing specific constructors
46+
47+-- | This is the /default/ management event, fired for various internal
48+-- events around the NT connection and Process lifecycle. All published
49+-- events that conform to this type, are eligible for tracing - i.e.,
50+-- they will be delivered to the trace controller.
51+--
52+data MxEvent =
53+ MxSpawned ProcessId
54+ -- ^ fired whenever a local process is spawned
55+ | MxRegistered ProcessId String
56+ -- ^ fired whenever a process/name is registered (locally)
57+ | MxUnRegistered ProcessId String
58+ -- ^ fired whenever a process/name is unregistered (locally)
59+ | MxProcessDied ProcessId DiedReason
60+ -- ^ fired whenever a process dies
61+ | MxNodeDied NodeId DiedReason
62+ -- ^ fired whenever a node /dies/ (i.e., the connection is broken/disconnected)
63+ | MxSent ProcessId ProcessId Message
64+ -- ^ fired whenever a message is sent from a local process
65+ | MxReceived ProcessId Message
66+ -- ^ fired whenever a message is received by a local process
67+ | MxConnected ConnectionId EndPointAddress
68+ -- ^ fired when a network-transport connection is first established
69+ | MxDisconnected ConnectionId EndPointAddress
70+ -- ^ fired when a network-transport connection is broken/disconnected
71+ | MxUser Message
72+ -- ^ a user defined trace event
73+ | MxLog String
74+ -- ^ a /logging/ event - used for debugging purposes only
75+ | MxTraceTakeover ProcessId
76+ -- ^ notifies a trace listener that all subsequent traces will be sent to /pid/
77+ | MxTraceDisable
78+ -- ^ notifies a trace listener that it has been disabled/removed
79+ deriving (Typeable, Generic, Show)
80+
81+instance Binary MxEvent where
82+
83+ -- put (MxSpawned pid) = putWord8 1 >> put pid
84+ -- put (MxRegistered pid str) = putWord8 2 >> put pid >> put str
85+ -- put (MxUnRegistered pid str) = putWord8 3 >> put pid >> put str
86+ -- put (MxProcessDied pid res) = putWord8 4 >> put pid >> put res
87+ -- put (MxNodeDied nid res) = putWord8 5 >> put nid >> put res
88+ -- put (MxSent to fro msg) = putWord8 6 >> put to >> put fro >> put msg
89+ -- put (MxReceived pid msg) = putWord8 7 >> put pid >> put msg
90+ -- put (MxConnected cid epid) = putWord8 8 >> put cid >> put epid
91+ -- put (MxDisconnected cid epid) = putWord8 9 >> put cid >> put epid
92+ -- put (MxUser msg) = putWord8 10 >> put msg
93+ -- put (MxLog msg) = putWord8 11 >> put msg
94+ -- put (MxTraceTakeover pid) = putWord8 12 >> put pid
95+ -- put MxTraceDisable = putWord8 13
96+
97+ -- get = do
98+ -- header <- getWord8
99+ -- case header of
100+ -- 1 -> MxSpawned <$> get
101+ -- 2 -> MxRegistered <$> get <*> get
102+ -- 3 -> MxUnRegistered <$> get <*> get
103+ -- 4 -> MxProcessDied <$> get <*> get
104+ -- 5 -> MxNodeDied <$> get <*> get
105+ -- 6 -> MxSent <$> get <*> get <*> get
106+ -- 7 -> MxReceived <$> get <*> get
107+ -- 8 -> MxConnected <$> get <*> get
108+ -- 9 -> MxDisconnected <$> get <*> get
109+ -- 10 -> MxUser <$> get
110+ -- 11 -> MxLog <$> get
111+ -- 12 -> MxTraceTakeover <$> get
112+ -- 13 -> return MxTraceDisable
113+ -- _ -> error "MxEvent.get - invalid header"
114+
115+class Addressable a where
116+ resolveToPid :: a -> Maybe ProcessId
117+
118+instance Addressable MxEvent where
119+ resolveToPid (MxSpawned p) = Just p
120+ resolveToPid (MxProcessDied p _) = Just p
121+ resolveToPid (MxSent _ p _) = Just p
122+ resolveToPid (MxReceived p _) = Just p
123+ resolveToPid _ = Nothing
30124
31125-- | Gross though it is, this synonym represents a function
32126-- used to forking new processes, which has to be passed as a HOF
@@ -41,15 +135,19 @@ newtype MxAgentId = MxAgentId { agentId :: String }
41135data MxTableId =
42136 MxForAgent !MxAgentId
43137 | MxForPid !ProcessId
138+ deriving (Typeable, Generic)
139+instance Binary MxTableId where
44140
45141data MxAgentState s = MxAgentState
46142 {
47143 mxAgentId :: !MxAgentId
48− -- , mxBus :: !(TChan Message)
144+ , mxBus :: !(TChan Message)
49145 , mxSharedTable :: !ProcessId
50146 , mxLocalState :: !s
51147 }
52148
149+-- | Monad for management agents, encapsulting the
150+-- agent's state and private
53151newtype MxAgent s a =
54152 MxAgent
55153 {
@@ -70,3 +168,10 @@ data MxAgentStart = MxAgentStart
70168 deriving (Typeable, Generic)
71169instance Binary MxAgentStart where
72170
171+data MxAction =
172+ MxAgentDeactivate !String
173+ | MxAgentReady
174+
175+-- | Type of a management agent's event sink.
176+type MxSink s = Message -> MxAgent s (Maybe MxAction)
177+
src/Control/Distributed/Process/Node.hs+40−36
@@ -1,3 +1,5 @@
1+{-# LANGUAGE RecordWildCards #-}
2+
13-- | Local nodes
24--
35module Control.Distributed.Process.Node
@@ -145,22 +147,31 @@ import Control.Distributed.Process.Internal.Types
145147 , WhereIsReply(..)
146148 , payloadToMessage
147149 , createUnencodedMessage
150+ , unsafeCreateUnencodedMessage
148151 , runLocalProcess
149152 , firstNonReservedProcessId
150153 , ImplicitReconnect(WithImplicitReconnect)
151154 )
155+import Control.Distributed.Process.Management.Agent
156+ ( mxAgentController
157+ )
158+import qualified Control.Distributed.Process.Management.Bus as Mx
159+ ( publishEvent
160+ )
152161import qualified Control.Distributed.Process.Management.Trace.Remote as Trace
153162 ( remoteTable
154163 )
164+import Control.Distributed.Process.Management.Trace.Tracer
165+ ( defaultTracer
166+ )
155167import Control.Distributed.Process.Management.Trace.Types
156168 ( TraceArg(..)
157− , MxEvent(..)
158169 , traceEvent
159170 , traceLogFmt
160171 , enableTrace
161172 )
162−import Control.Distributed.Process.Management.Trace.Tracer
163− ( defaultTracer
173+import Control.Distributed.Process.Management.Types
174+ ( MxEvent(..)
164175 )
165176import Control.Distributed.Process.Serializable (Serializable)
166177import Control.Distributed.Process.Internal.Messaging
@@ -185,9 +196,6 @@ import qualified Control.Distributed.Process.Internal.StrictContainerAccessors a
185196 ( mapMaybe
186197 , mapDefault
187198 )
188−import Control.Distributed.Process.Management.Agent
189− ( mxAgentController
190− )
191199import Unsafe.Coerce
192200
193201--------------------------------------------------------------------------------
@@ -251,18 +259,17 @@ startMxAgent node = do
251259 mv <- MVar.newEmptyMVar
252260 pid <- fork $ mxAgentController fork mv
253261 (tracer', wqRef, mxNew') <- MVar.takeMVar mv
254− return node { localEventBus = (MxEventBus pid tracer' wqRef mxNew') }
262+ return $ node { localEventBus = (MxEventBus pid wqRef mxNew')
263+ , localTracer = tracer'
264+ }
255265
256266startDefaultTracer :: LocalNode -> IO ()
257267startDefaultTracer node' = do
258− let t = localEventBus node'
259− case t of
260− MxEventBus _ (Tracer pid _) _ _ -> do
261− runProcess node' $ register "trace.controller" pid
262− pid' <- forkProcess node' defaultTracer
263− enableTrace (localEventBus node') pid'
264− runProcess node' $ register "tracer.initial" pid'
265− _ -> return ()
268+ let (Tracer pid _) = localTracer node'
269+ runProcess node' $ register "trace.controller" pid
270+ pid' <- forkProcess node' defaultTracer
271+ enableTrace (localTracer node') pid'
272+ runProcess node' $ register "tracer.initial" pid'
266273
267274-- | Start and register the service processes on a node
268275startServiceProcesses :: LocalNode -> IO ()
@@ -353,7 +360,7 @@ forkProcess node proc = modifyMVar (localState node) startProcess
353360 return (tid', lproc)
354361
355362 -- see note [tracer/forkProcess races]
356− trace node (MxSpawned pid)
363+ mxNotify node (MxSpawned pid)
357364
358365 if lpidCounter lpid == maxBound
359366 then do
@@ -435,7 +442,7 @@ handleIncomingMessages node = go initConnectionState
435442 NT.ConnectionOpened cid rel theirAddr ->
436443 if rel == NT.ReliableOrdered
437444 then
438− trace node (MxConnected cid theirAddr)
445+ mxNotify node (MxConnected cid theirAddr)
439446 >> go (
440447 (incomingAt cid ^= Just (theirAddr, Uninit))
441448 . (incomingFrom theirAddr ^: Set.insert cid)
@@ -451,7 +458,7 @@ handleIncomingMessages node = go initConnectionState
451458 -- it from the NC state? (and same for channels, below)
452459 let msg = payloadToMessage payload
453460 enqueue queue msg -- 'enqueue' is strict
454− trace node (MxReceived pid msg)
461+ mxNotify node (MxReceived pid msg)
455462 go st
456463 Just (_, ToChan (TypedChannel chan')) -> do
457464 mChan <- deRefWeak chan'
@@ -495,12 +502,13 @@ handleIncomingMessages node = go initConnectionState
495502 else invalidRequest cid st
496503 Nothing ->
497504 invalidRequest cid st
498− NT.ConnectionClosed cid ->
505+ NT.ConnectionClosed cid -> do
506+ putStrLn "connection closed..."
499507 case st ^. incomingAt cid of
500508 Nothing ->
501509 invalidRequest cid st
502510 Just (src, _) -> do
503− trace node (MxDisconnected cid src)
511+ mxNotify node (MxDisconnected cid src)
504512 go ( (incomingAt cid ^= Nothing)
505513 . (incomingFrom src ^: Set.delete cid)
506514 $ st
@@ -596,25 +604,21 @@ instance Show ProcessKillException where
596604
597605traceNotifyDied :: LocalNode -> Identifier -> DiedReason -> NC ()
598606traceNotifyDied node ident reason =
599− -- TODO: sendPortDied notifications
600− liftIO $ withLocalTracer node $ \t ->
601− case ident of
602− (NodeIdentifier nid) -> traceEvent t (MxNodeDied nid reason)
603− (ProcessIdentifier pid) -> traceEvent t (MxProcessDied pid reason)
604− _ -> return ()
607+ -- TODO: SendPortDied notifications
608+ case ident of
609+ (NodeIdentifier nid) -> liftIO $ mxNotify node (MxNodeDied nid reason)
610+ (ProcessIdentifier pid) -> liftIO $ mxNotify node (MxProcessDied pid reason)
611+ _ -> return ()
605612
606613traceEventFmtIO :: LocalNode
607614 -> String
608615 -> [TraceArg]
609616 -> IO ()
610−traceEventFmtIO node fmt args =
611− withLocalTracer node $ \t -> traceLogFmt t fmt args
612−
613−trace :: LocalNode -> MxEvent -> IO ()
614−trace node ev = withLocalTracer node $ \t -> traceEvent t ev
617+traceEventFmtIO LocalNode{..} fmt args = traceLogFmt localTracer fmt args
615618
616−withLocalTracer :: LocalNode -> (MxEventBus -> IO ()) -> IO ()
617−withLocalTracer node act = act (localEventBus node)
619+mxNotify :: LocalNode -> MxEvent -> IO ()
620+mxNotify LocalNode{..} ev =
621+ Mx.publishEvent localEventBus $ unsafeCreateUnencodedMessage ev
618622
619623--------------------------------------------------------------------------------
620624-- Core functionality --
@@ -813,8 +817,8 @@ ncEffectRegister from label atnode mPid reregistration = do
813817 do modify' $ registeredHereFor label ^= mPid
814818 updateRemote node currentVal mPid
815819 case mPid of
816− (Just p) -> liftIO $ trace node (MxRegistered p label)
817− Nothing -> liftIO $ trace node (MxUnRegistered (fromJust currentVal) label)
820+ (Just p) -> liftIO $ mxNotify node (MxRegistered p label)
821+ Nothing -> liftIO $ mxNotify node (MxUnRegistered (fromJust currentVal) label)
818822 liftIO $ sendMessage node
819823 (NodeIdentifier (localNodeId node))
820824 (ProcessIdentifier from)
@@ -882,7 +886,7 @@ ncEffectLocalSend :: LocalNode -> ProcessId -> Message -> NC ()
882886ncEffectLocalSend node to msg =
883887 liftIO $ withLocalProc node to $ \p -> do
884888 enqueue (processQueue p) msg
885− trace node (MxReceived to msg)
889+ mxNotify node (MxReceived to msg)
886890
887891-- [Issue #DP-20]
888892ncEffectLocalPortSend :: SendPortId -> Message -> NC ()
tests/TestTracing.hs+3
@@ -12,6 +12,9 @@ import Control.Concurrent.MVar
1212 )
1313import Control.Distributed.Process
1414import Control.Distributed.Process.Debug
15+import Control.Distributed.Process.Management
16+ ( MxEvent(..)
17+ )
1518import Control.Distributed.Process.Node
1619 ( forkProcess
1720 , newLocalNode