openFrom for Master and Slaves
authorMax Voit <max.voit+gtdv@with-eyes.net>
Wed, 22 Jul 2015 12:23:46 +0000 (14:23 +0200)
committerMax Voit <max.voit+gtdv@with-eyes.net>
Wed, 22 Jul 2015 12:23:46 +0000 (14:23 +0200)
acid-state-dist.cabal
src/Data/Acid/Centered/Master.hs
src/Data/Acid/Centered/Slave.hs
tests/IntMasterInteractive.hs

index 17db8f9..25a1a90 100644 (file)
@@ -73,6 +73,7 @@ library
                        stm,
                        semigroups,
                        safe,
+                       filepath,
                        mtl
 
   -- Directories containing source files.
index fad9dc4..d3e34e6 100644 (file)
@@ -54,6 +54,7 @@ import System.ZMQ4 (Context, Socket, Router(..), Receiver, Flag(..),
                     poll, Poll(..), Event(..),
                     waitRead,
                     sendMulti, receiveMulti)
+import System.FilePath ( (</>) )
 
 import qualified Data.Map as M
 import Data.Map (Map)
@@ -222,20 +223,31 @@ receiveFrame sock = do
 
 -- | Open the master state.
 openMasterState :: (IsAcidic st, Typeable st) =>
-               PortNumber   -- ^ port to bind to
+               String       -- ^ address to bind (useful to listen on specific interfaces only)
+            -> PortNumber   -- ^ port to bind to
             -> st           -- ^ initial state
             -> IO (AcidState st)
-openMasterState port initialState = do
+openMasterState address port initialState =
+    openMasterStateFrom ("state" </> show (typeOf initialState)) address port initialState
+
+-- | Open the master state from a specific location.
+openMasterStateFrom :: (IsAcidic st, Typeable st) =>
+               FilePath     -- ^ location of the local state files
+            -> String       -- ^ address to bind (useful to listen on specific interfaces only)
+            -> PortNumber   -- ^ port to bind to
+            -> st           -- ^ initial state
+            -> IO (AcidState st)
+openMasterStateFrom directory address port initialState = do
         debug "opening master state"
         -- local
-        lst <- openLocalState initialState
+        lst <- openLocalStateFrom directory initialState
         let levs = localEvents $ downcast lst
         lrev <- atomically $ readTVar $ logNextEntryId levs
         rev <- newMVar lrev
         repChan <- newChan
         ns <- newMVar M.empty
         -- remote
-        let addr = "tcp://*:" ++ show port
+        let addr = "tcp://" ++ address ++ ":" ++ show port
         ctx <- context
         sock <- socket ctx Router
         setReceiveHighWM (restrict (100*1000)) sock
index 5392b77..149681f 100644 (file)
@@ -19,6 +19,7 @@
 module Data.Acid.Centered.Slave
     (
       enslaveState
+    , enslaveStateFrom
     , SlaveState(..)
     )  where
 
@@ -46,6 +47,7 @@ import System.ZMQ4 (Context, Socket, Dealer(..), Receiver, Flag(..),
                     context, term, socket, close,
                     connect, disconnect,
                     send, receive)
+import System.FilePath ( (</>) )
 
 import Control.Concurrent (forkIO, threadDelay, ThreadId, myThreadId, killThread)
 import Control.Concurrent.MVar (MVar, newMVar, newEmptyMVar,
@@ -96,15 +98,24 @@ data SlaveRepItem =
     | SRIArchive Revision
     | SRIUpdate Revision (Maybe RequestID) (Tagged CSL.ByteString)
 
--- | Open a local State as Slave for a Master.
 enslaveState :: (IsAcidic st, Typeable st) =>
             String          -- ^ hostname of the Master
          -> PortNumber      -- ^ port to connect to
          -> st              -- ^ initial state
          -> IO (AcidState st)
-enslaveState address port initialState = do
+enslaveState address port initialState =
+    enslaveStateFrom ("state" </> show (typeOf initialState)) address port initialState
+
+-- | Open a local State as Slave for a Master.
+enslaveStateFrom :: (IsAcidic st, Typeable st) =>
+            FilePath        -- ^ location of the local state files.
+         -> String          -- ^ hostname of the Master
+         -> PortNumber      -- ^ port to connect to
+         -> st              -- ^ initial state
+         -> IO (AcidState st)
+enslaveStateFrom directory address port initialState = do
         -- local
-        lst <- openLocalState initialState
+        lst <- openLocalStateFrom directory initialState
         let levs = localEvents $ downcast lst
         lrev <- atomically $ readTVar $ logNextEntryId levs
         rev <- newMVar lrev
index 39fe38d..870f3bc 100644 (file)
@@ -15,7 +15,7 @@ import IntCommon
 -- actual test
 main :: IO ()
 main = do
-    acid <- openMasterState 3333 (IntState 0)
+    acid <- openMasterState "127.0.0.1" 3333 (IntState 0)
     putStrLn usage
     forever $ do
         input <- getLine