git.iko.soy/distributed-process
on master help sign in
Implement centralized logging in the local backend
commitabcaed4dd18760845bdcc63b79d9714aa308c92f authorEdsko de Vries <edsko@edsko.net> dateThu 5 Jul 2012, 16:40 (14 years ago) parent603646d
2 files changed+31−12
distributed-process/src/Control/Distributed/Process/Backend/Local.hs+27−5 distributed-process/tests/TestLocalBackend.hs+4−7
distributed-process/src/Control/Distributed/Process/Backend/Local.hs+27−5
@@ -10,15 +10,18 @@ import Data.Binary (Binary(get, put), getWord8, putWord8)
1010import Data.Accessor (Accessor, accessor, (^:), (^.))
1111import Data.Set (Set)
1212import qualified Data.Set as Set (insert, empty, toList)
13+import Data.Foldable (forM_)
1314import Control.Applicative ((<$>))
1415import Control.Exception (throw)
15−import Control.Monad (forM_, forever)
16+import Control.Monad (forever)
17+import Control.Monad.IO.Class (liftIO)
1618import Control.Concurrent (forkIO, threadDelay)
1719import Control.Concurrent.MVar (MVar, newMVar, readMVar, modifyMVar_)
1820import Control.Distributed.Process.Internal.Types
1921 ( LocalNode
2022 , RemoteTable
2123 , NodeId
24+ , Process
2225 )
2326import qualified Control.Distributed.Process.Node as Node
2427 ( newLocalNode
@@ -31,6 +34,7 @@ import qualified Network.Transport.TCP as NT
3134import qualified Network.Transport as NT (Transport)
3235import qualified Network.Socket as N (HostName, ServiceName, SockAddr)
3336import Control.Distributed.Process.Internal.Multicast (initMulticast)
37+import Control.Distributed.Process.Internal.Primitives (whereis, registerRemote)
3438
3539-- | Local backend
3640data LocalBackend = LocalBackend {
@@ -39,6 +43,9 @@ data LocalBackend = LocalBackend {
3943 -- | @findPeers t@ sends out a /who's there?/ request, waits 't' msec,
4044 -- and then collects and returns the answers
4145 , findPeers :: Int -> IO [NodeId]
46+ -- | Make sure that all log messages are printed by the logger on the
47+ -- current node
48+ , redirectLogsHere :: Process ()
4249 }
4350
4451data LocalBackendState = LocalBackendState {
@@ -58,10 +65,13 @@ initializeBackend host port rtable = do
5865 forkIO $ peerDiscoveryDaemon backendState recv send
5966 case mTransport of
6067 Left err -> throw err
61− Right transport -> return LocalBackend {
62− newLocalNode = apiNewLocalNode transport rtable backendState
63− , findPeers = apiFindPeers send backendState
64− }
68+ Right transport ->
69+ let backend = LocalBackend {
70+ newLocalNode = apiNewLocalNode transport rtable backendState
71+ , findPeers = apiFindPeers send backendState
72+ , redirectLogsHere = apiRedirectLogsHere backend
73+ }
74+ in return backend
6575
6676-- | Create a new local node
6777apiNewLocalNode :: NT.Transport
@@ -113,6 +123,18 @@ peerDiscoveryDaemon backendState recv send = forever go
113123 PeerDiscoveryReply nid ->
114124 modifyMVar_ backendState $ return . (peers ^: Set.insert nid)
115125
126+--------------------------------------------------------------------------------
127+-- Back-end specific primitives --
128+--------------------------------------------------------------------------------
129+
130+-- | Make sure that all log messages are printed by the logger on this node
131+apiRedirectLogsHere :: LocalBackend -> Process ()
132+apiRedirectLogsHere backend = do
133+ mLogger <- whereis "logger"
134+ forM_ mLogger $ \logger -> do
135+ nids <- liftIO $ findPeers backend 1000000
136+ forM_ nids $ \nid -> registerRemote nid "logger" logger
137+
116138--------------------------------------------------------------------------------
117139-- Accessors --
118140--------------------------------------------------------------------------------
distributed-process/tests/TestLocalBackend.hs+4−7
@@ -13,20 +13,17 @@ import Control.Monad.IO.Class (liftIO)
1313server :: LocalBackend -> IO ()
1414server backend = do
1515 node <- newLocalNode backend
16− runProcess node $
16+ runProcess node $ do
17+ redirectLogsHere backend
1718 say "this is the server"
18− {-
19− nodes <- findPeers backend 1000000
20− print nodes
21− -}
2219 threadDelay 30000000
2320
2421client :: LocalBackend -> IO ()
2522client backend = do
2623 node <- newLocalNode backend
2724 forkProcess node . forever $ do
28− say "this is a client node1"
29− liftIO $ threadDelay 5000000
25+ say "this is a client"
26+ liftIO $ threadDelay 2000000
3027 threadDelay 30000000
3128
3229main :: IO ()