git.iko.soy/distributed-process
on master help sign in
Back out of the split between tracer and local mx event bus
commitad1c63b0f8ec7d646edd9dc56d65f114b0ba2201 authorTim Watson <watson.timothy@gmail.com> dateSat 21 Sep 2013, 14:42 (13 years ago) parent4957534
6 files changed+77−81
src/Control/Distributed/Process/Internal/Primitives.hs+6−10 src/Control/Distributed/Process/Internal/Types.hs+2−2 src/Control/Distributed/Process/Management/Bus.hs+5−9 src/Control/Distributed/Process/Management/Trace/Primitives.hs+4−4 src/Control/Distributed/Process/Management/Trace/Types.hs+30−30 src/Control/Distributed/Process/Node.hs+30−26
src/Control/Distributed/Process/Internal/Primitives.hs+6−10
@@ -191,9 +191,6 @@ import Control.Distributed.Process.Internal.Messaging
191191 , disconnect
192192 , sendCtrlMsg
193193 )
194−import qualified Control.Distributed.Process.Management.Bus as Mx
195− ( publishEvent
196− )
197194import Control.Distributed.Process.Management.Types
198195 ( MxEvent(..)
199196 )
@@ -229,11 +226,10 @@ send them msg = do
229226 (ProcessIdentifier them)
230227 NoImplicitReconnect
231228 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
229+ -- We do not fire the trace event until after the sending is complete;
230+ -- In the remote case, 'sendMessage' can block in the networking stack.
231+ liftIO $ traceEvent (localEventBus node)
232+ (MxSent them us (createUnencodedMessage msg))
237233
238234-- | /Unsafe/ variant of 'send'. This function makes /no/ attempt to serialize
239235-- and (in the case when the destination process resides on the same local
@@ -416,8 +412,8 @@ forward msg them = do
416412 (messageToPayload msg)
417413 -- We do not fire the trace event until after the sending is complete;
418414 -- In the remote case, 'sendMessage' can block in the networking stack.
419− liftIO $ Mx.publishEvent (localEventBus node)
420− (createUnencodedMessage (MxSent them us msg))
415+ liftIO $ traceEvent (localEventBus node)
416+ (MxSent them us msg)
421417
422418
423419-- | Wrap a 'Serializable' value in a 'Message'. Note that 'Message's are
src/Control/Distributed/Process/Internal/Types.hs+2−2
@@ -216,6 +216,8 @@ data MxEventBus =
216216 {
217217 -- | Process id of the management agent controller process
218218 agent :: !ProcessId
219+ -- | Configuration for the local trace controller
220+ , tracer :: !Tracer
219221 -- | Weak reference to the management agent controller's mailbox
220222 , evbuss :: !(Weak (CQueue Message))
221223 -- | API for adding management agents to a running node
@@ -238,8 +240,6 @@ data LocalNode = LocalNode
238240 -- | Runtime lookup table for supporting closures
239241 -- TODO: this should be part of the CH state, not the local endpoint state
240242 , remoteTable :: !RemoteTable
241− -- | Active local tracer process. This is our only non-strict field.
242− , localTracer :: Tracer
243243 }
244244
245245data ImplicitReconnect = WithImplicitReconnect | NoImplicitReconnect
src/Control/Distributed/Process/Management/Bus.hs+5−9
@@ -1,7 +1,6 @@
11-- | Interface to the management event bus.
22module Control.Distributed.Process.Management.Bus
33 ( publishEvent
4− , enqueueEvent
54 ) where
65
76import Control.Distributed.Process.Internal.CQueue
@@ -22,14 +21,11 @@ import Network.Transport
2221 ( ConnectionId
2322 , EndPointAddress
2423 )
25−import System.Mem.Weak (Weak, deRefWeak)
24+import System.Mem.Weak (deRefWeak)
2625
2726publishEvent :: MxEventBus -> Message -> IO ()
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
27+publishEvent MxEventBusInitialising _ = return ()
28+publishEvent (MxEventBus _ _ wqRef _) msg = do
29+ mQueue <- deRefWeak wqRef
30+ forM_ mQueue $ \queue -> enqueue queue msg
3531
src/Control/Distributed/Process/Management/Trace/Primitives.hs+4−4
@@ -60,7 +60,7 @@ import Control.Distributed.Process.Internal.Types
6060 , Process
6161 , ProcessId
6262 , LocalProcess(..)
63− , LocalNode(localEventBus, localTracer)
63+ , LocalNode(localEventBus)
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 :: (Tracer -> Process ()) -> Process ()
155+withLocalTracer :: (MxEventBus -> Process ()) -> Process ()
156156withLocalTracer act = do
157157 node <- processNode <$> ask
158− act (localTracer node)
158+ act (localEventBus node)
159159
160−withLocalTracerSync :: (Tracer -> SendPort TraceOk -> IO ()) -> Process ()
160+withLocalTracerSync :: (MxEventBus -> SendPort TraceOk -> IO ()) -> Process ()
161161withLocalTracerSync act = do
162162 (sp, rp) <- newChan
163163 withLocalTracer $ \t -> liftIO $ (act t sp)
src/Control/Distributed/Process/Management/Trace/Types.hs+30−30
@@ -35,7 +35,7 @@ import Control.Distributed.Process.Internal.Types
3535 , unsafeCreateUnencodedMessage
3636 )
3737import Control.Distributed.Process.Management.Bus
38− ( enqueueEvent
38+ ( publishEvent
3939 )
4040import Control.Distributed.Process.Management.Types
4141 ( MxEvent(..)
@@ -116,10 +116,10 @@ instance Binary TraceOk where
116116-- Internal/Common API --
117117--------------------------------------------------------------------------------
118118
119−traceLog :: Tracer -> String -> IO ()
120−traceLog (Tracer _ wqRef) s = enqueueEvent wqRef (unsafeCreateUnencodedMessage $ MxLog s)
119+traceLog :: MxEventBus -> String -> IO ()
120+traceLog tr s = publishEvent tr (unsafeCreateUnencodedMessage $ MxLog s)
121121
122−traceLogFmt :: Tracer
122+traceLogFmt :: MxEventBus
123123 -> String
124124 -> [TraceArg]
125125 -> IO ()
@@ -129,43 +129,43 @@ traceLogFmt t d ls =
129129 toS (TraceStr s) = s
130130 toS (Trace a) = show a
131131
132−traceEvent :: Tracer -> MxEvent -> IO ()
133−traceEvent (Tracer _ wqRef) ev = enqueueEvent wqRef (unsafeCreateUnencodedMessage ev)
132+traceEvent :: MxEventBus -> MxEvent -> IO ()
133+traceEvent tr ev = publishEvent tr (unsafeCreateUnencodedMessage ev)
134134
135−traceMessage :: Serializable m => Tracer -> m -> IO ()
135+traceMessage :: Serializable m => MxEventBus -> m -> IO ()
136136traceMessage tr msg = traceEvent tr (MxUser (unsafeCreateUnencodedMessage msg))
137137
138−enableTrace :: Tracer -> ProcessId -> IO ()
139−enableTrace (Tracer _ wqRef) p =
140− enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)),
141− (TraceEnable p)))
138+enableTrace :: MxEventBus -> ProcessId -> IO ()
139+enableTrace t p =
140+ publishEvent t (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)),
141+ (TraceEnable p)))
142142
143−enableTraceSync :: Tracer -> SendPort TraceOk -> ProcessId -> IO ()
144−enableTraceSync (Tracer _ wqRef) s p =
145− enqueueEvent wqRef (unsafeCreateUnencodedMessage (Just s, TraceEnable p))
143+enableTraceSync :: MxEventBus -> SendPort TraceOk -> ProcessId -> IO ()
144+enableTraceSync t s p =
145+ publishEvent t (unsafeCreateUnencodedMessage (Just s, TraceEnable p))
146146
147−disableTrace :: Tracer -> IO ()
148−disableTrace (Tracer _ wqRef) =
149− enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)),
147+disableTrace :: MxEventBus -> IO ()
148+disableTrace t =
149+ publishEvent t (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)),
150150 TraceDisable))
151151
152−disableTraceSync :: Tracer -> SendPort TraceOk -> IO ()
153−disableTraceSync (Tracer _ wqRef) s =
154− enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Just s), TraceDisable))
152+disableTraceSync :: MxEventBus -> SendPort TraceOk -> IO ()
153+disableTraceSync t s =
154+ publishEvent t (unsafeCreateUnencodedMessage ((Just s), TraceDisable))
155155
156−setTraceFlags :: Tracer -> TraceFlags -> IO ()
157−setTraceFlags (Tracer _ wqRef) f =
158− enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)), f))
156+setTraceFlags :: MxEventBus -> TraceFlags -> IO ()
157+setTraceFlags t f =
158+ publishEvent t (unsafeCreateUnencodedMessage ((Nothing :: Maybe (SendPort TraceOk)), f))
159159
160−setTraceFlagsSync :: Tracer -> SendPort TraceOk -> TraceFlags -> IO ()
161−setTraceFlagsSync (Tracer _ wqRef) s f =
162− enqueueEvent wqRef (unsafeCreateUnencodedMessage ((Just s), f))
160+setTraceFlagsSync :: MxEventBus -> SendPort TraceOk -> TraceFlags -> IO ()
161+setTraceFlagsSync t s f =
162+ publishEvent t (unsafeCreateUnencodedMessage ((Just s), f))
163163
164−getTraceFlags :: Tracer -> SendPort TraceFlags -> IO ()
165−getTraceFlags (Tracer _ wqRef) s = enqueueEvent wqRef (unsafeCreateUnencodedMessage s)
164+getTraceFlags :: MxEventBus -> SendPort TraceFlags -> IO ()
165+getTraceFlags t s = publishEvent t (unsafeCreateUnencodedMessage s)
166166
167−getCurrentTraceClient :: Tracer -> SendPort (Maybe ProcessId) -> IO ()
168−getCurrentTraceClient (Tracer _ wqRef) s = enqueueEvent wqRef (unsafeCreateUnencodedMessage s)
167+getCurrentTraceClient :: MxEventBus -> SendPort (Maybe ProcessId) -> IO ()
168+getCurrentTraceClient t s = publishEvent t (unsafeCreateUnencodedMessage s)
169169
170170class Traceable a where
171171 uod :: [a] -> TraceSubject
src/Control/Distributed/Process/Node.hs+30−26
@@ -259,17 +259,18 @@ startMxAgent node = do
259259 mv <- MVar.newEmptyMVar
260260 pid <- fork $ mxAgentController fork mv
261261 (tracer', wqRef, mxNew') <- MVar.takeMVar mv
262− return $ node { localEventBus = (MxEventBus pid wqRef mxNew')
263− , localTracer = tracer'
264− }
262+ return node { localEventBus = (MxEventBus pid tracer' wqRef mxNew') }
265263
266264startDefaultTracer :: LocalNode -> IO ()
267265startDefaultTracer node' = do
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'
266+ let t = localEventBus node'
267+ case t of
268+ MxEventBus _ (Tracer pid _) _ _ -> do
269+ runProcess node' $ register "trace.controller" pid
270+ pid' <- forkProcess node' defaultTracer
271+ enableTrace (localEventBus node') pid'
272+ runProcess node' $ register "tracer.initial" pid'
273+ _ -> return ()
273274
274275-- | Start and register the service processes on a node
275276startServiceProcesses :: LocalNode -> IO ()
@@ -360,7 +361,7 @@ forkProcess node proc = modifyMVar (localState node) startProcess
360361 return (tid', lproc)
361362
362363 -- see note [tracer/forkProcess races]
363− mxNotify node (MxSpawned pid)
364+ trace node (MxSpawned pid)
364365
365366 if lpidCounter lpid == maxBound
366367 then do
@@ -442,7 +443,7 @@ handleIncomingMessages node = go initConnectionState
442443 NT.ConnectionOpened cid rel theirAddr ->
443444 if rel == NT.ReliableOrdered
444445 then
445− mxNotify node (MxConnected cid theirAddr)
446+ trace node (MxConnected cid theirAddr)
446447 >> go (
447448 (incomingAt cid ^= Just (theirAddr, Uninit))
448449 . (incomingFrom theirAddr ^: Set.insert cid)
@@ -458,7 +459,7 @@ handleIncomingMessages node = go initConnectionState
458459 -- it from the NC state? (and same for channels, below)
459460 let msg = payloadToMessage payload
460461 enqueue queue msg -- 'enqueue' is strict
461− mxNotify node (MxReceived pid msg)
462+ trace node (MxReceived pid msg)
462463 go st
463464 Just (_, ToChan (TypedChannel chan')) -> do
464465 mChan <- deRefWeak chan'
@@ -502,13 +503,12 @@ handleIncomingMessages node = go initConnectionState
502503 else invalidRequest cid st
503504 Nothing ->
504505 invalidRequest cid st
505− NT.ConnectionClosed cid -> do
506− putStrLn "connection closed..."
506+ NT.ConnectionClosed cid ->
507507 case st ^. incomingAt cid of
508508 Nothing ->
509509 invalidRequest cid st
510510 Just (src, _) -> do
511− mxNotify node (MxDisconnected cid src)
511+ trace node (MxDisconnected cid src)
512512 go ( (incomingAt cid ^= Nothing)
513513 . (incomingFrom src ^: Set.delete cid)
514514 $ st
@@ -604,21 +604,25 @@ instance Show ProcessKillException where
604604
605605traceNotifyDied :: LocalNode -> Identifier -> DiedReason -> NC ()
606606traceNotifyDied node ident reason =
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 ()
607+ -- TODO: sendPortDied notifications
608+ liftIO $ withLocalTracer node $ \t ->
609+ case ident of
610+ (NodeIdentifier nid) -> traceEvent t (MxNodeDied nid reason)
611+ (ProcessIdentifier pid) -> traceEvent t (MxProcessDied pid reason)
612+ _ -> return ()
612613
613614traceEventFmtIO :: LocalNode
614615 -> String
615616 -> [TraceArg]
616617 -> IO ()
617−traceEventFmtIO LocalNode{..} fmt args = traceLogFmt localTracer fmt args
618+traceEventFmtIO node fmt args =
619+ withLocalTracer node $ \t -> traceLogFmt t fmt args
620+
621+trace :: LocalNode -> MxEvent -> IO ()
622+trace node ev = withLocalTracer node $ \t -> traceEvent t ev
618623
619−mxNotify :: LocalNode -> MxEvent -> IO ()
620−mxNotify LocalNode{..} ev =
621− Mx.publishEvent localEventBus $ unsafeCreateUnencodedMessage ev
624+withLocalTracer :: LocalNode -> (MxEventBus -> IO ()) -> IO ()
625+withLocalTracer node act = act (localEventBus node)
622626
623627--------------------------------------------------------------------------------
624628-- Core functionality --
@@ -817,8 +821,8 @@ ncEffectRegister from label atnode mPid reregistration = do
817821 do modify' $ registeredHereFor label ^= mPid
818822 updateRemote node currentVal mPid
819823 case mPid of
820− (Just p) -> liftIO $ mxNotify node (MxRegistered p label)
821− Nothing -> liftIO $ mxNotify node (MxUnRegistered (fromJust currentVal) label)
824+ (Just p) -> liftIO $ trace node (MxRegistered p label)
825+ Nothing -> liftIO $ trace node (MxUnRegistered (fromJust currentVal) label)
822826 liftIO $ sendMessage node
823827 (NodeIdentifier (localNodeId node))
824828 (ProcessIdentifier from)
@@ -886,7 +890,7 @@ ncEffectLocalSend :: LocalNode -> ProcessId -> Message -> NC ()
886890ncEffectLocalSend node to msg =
887891 liftIO $ withLocalProc node to $ \p -> do
888892 enqueue (processQueue p) msg
889− mxNotify node (MxReceived to msg)
893+ trace node (MxReceived to msg)
890894
891895-- [Issue #DP-20]
892896ncEffectLocalPortSend :: SendPortId -> Message -> NC ()