-- ---------------------------------------------------------------------------- {- | Module : Holumbus.Distribution.Master.MasterPort Copyright : Copyright (C) 2008 Stefan Schmidt License : MIT Maintainer : Stefan Schmidt (stefanschmidt@web.de) Stability : experimental Portability: portable Version : 0.1 -} -- ---------------------------------------------------------------------------- module Holumbus.Distribution.Master.MasterPort ( -- * Datatypes MasterPort -- * Creation and Destruction , newMasterPort , newMasterPortFromServerPort ) where import Holumbus.Network.Communication import Holumbus.Network.Site import Holumbus.Common.Debug import Holumbus.MapReduce.MapReduce import Holumbus.Distribution.Messages import Holumbus.Distribution.Master -- ---------------------------------------------------------------------------- -- Datatypes -- ---------------------------------------------------------------------------- data MasterPort = MasterPort ServerPort deriving (Show) -- ---------------------------------------------------------------------------- -- Creation and Destruction -- ---------------------------------------------------------------------------- -- | Creates a new ControllerPort newMasterPort :: StreamName -> Maybe SocketId -> IO MasterPort newMasterPort sn soid = do sp <- newServerPort sn soid return (MasterPort sp) newMasterPortFromServerPort :: ServerPort -> MasterPort newMasterPortFromServerPort sp = MasterPort sp -- ---------------------------------------------------------------------------- -- Typeclass instanciation -- ---------------------------------------------------------------------------- instance Debug MasterPort where printDebug (MasterPort p) = do putStrLn "MasterPort:" putStrLn $ show p getDebug (MasterPort p) = return ("MasterPort:\n"++show p++"\n") instance MapReduce MasterPort where closeMapReduce md = closeMaster md getMySiteId _ = getSiteId getMapReduceType _ = return MRTMaster startControlling (MasterPort p) = do sendRequestToServer p time30 (MReqStartControlling) $ \rsp -> do case rsp of (MRspSuccess) -> return (Just ()) _ -> return Nothing stopControlling (MasterPort p) = do sendRequestToServer p time30 (MReqStopControlling) $ \rsp -> do case rsp of (MRspSuccess) -> return (Just ()) _ -> return Nothing isControlling (MasterPort p) = do sendRequestToServer p time30 (MReqIsControlling) $ \rsp -> do case rsp of (MRspIsControlling b) -> return (Just b) _ -> return Nothing doSingleStep (MasterPort p) = do sendRequestToServer p time30 (MReqSingleStep) $ \rsp -> do case rsp of (MRspSuccess) -> return (Just ()) _ -> return Nothing doMapReduceJob ji (MasterPort p) = do -- bad hack... we should build an extra client for the MapReduce-System -- which pings for the server and so on sendRequestToServer p timeIndefinitely (MReqPerformJob ji) $ \rsp -> do case rsp of (MRspResult r) -> return (Just r) _ -> return Nothing instance MasterClass MasterPort where closeMaster _ = return () receiveTaskCompleted td c@(MasterPort p) = do sendRequestToServer p time30 (MReqTaskCompleted td) $ \rsp -> do case rsp of (MRspSuccess) -> return (Just c) _ -> return Nothing receiveTaskError td c@(MasterPort p) = do sendRequestToServer p time30 (MReqTaskError td) $ \rsp -> do case rsp of (MRspSuccess) -> return (Just c) _ -> return Nothing