> >+-- | Get the list of jobs from the authoritative copy, and update the > >+-- in-memory copy as well. > >+getJobs :: IORef MemoryState -> ResultT String IO [JobId] > >+getJobs memstate = do > >+ wconfdClient <- liftIO $ getWConfdClient =<< Path.defaultWConfdSocket > >+ jobs <- withErrorT show $ runRpcClient maintenanceJobs wconfdClient > > .. also I'd suggest to close the client here > > >+ liftIO . atomicModifyIORef memstate $ \ s -> (s { msJobs = jobs }, ()) > >+ return jobs
> >+ luxiSocket <- liftIO Path.defaultQuerySocket > >+ lclient <- mkResultT . liftM (either (Bad . show) Ok) > >+ . tryIOError $ L.getLuxiClient luxiSocket > >+ void . mkResultT $ waitForJobs oldjobs lclient > > .. and here > > >+ liftIO $ clearJobs memstate Interdiff commit c7245e42c388576a9101600cf5df7f467383e7a3 Author: Klaus Aehlig <aeh...@google.com> Date: Thu Jul 16 12:20:17 2015 +0200 Interdiff [PATCH master 15/16] Make maintd wait for its jobs and also expose them diff --git a/src/Ganeti/MaintD/MemoryState.hs b/src/Ganeti/MaintD/MemoryState.hs index 592d0b5..7fd351a 100644 --- a/src/Ganeti/MaintD/MemoryState.hs +++ b/src/Ganeti/MaintD/MemoryState.hs @@ -52,11 +52,9 @@ import Control.Monad.IO.Class (liftIO) import Data.IORef (IORef, atomicModifyIORef) import Ganeti.BasicTypes (ResultT, withErrorT) -import qualified Ganeti.Path as Path -import Ganeti.THH.HsRPC (runRpcClient) import Ganeti.Types (JobId) import Ganeti.Utils (ordNub) -import Ganeti.WConfd.Client ( getWConfdClient, maintenanceJobs, runModifyRpc +import Ganeti.WConfd.Client ( runNewWConfdClient, maintenanceJobs, runModifyRpc , clearMaintdJobs, appendMaintdJobs ) -- | In-memory copy of parts of the state of the maintenance @@ -76,8 +74,7 @@ emptyMemoryState = MemoryState { -- in-memory copy as well. getJobs :: IORef MemoryState -> ResultT String IO [JobId] getJobs memstate = do - wconfdClient <- liftIO $ getWConfdClient =<< Path.defaultWConfdSocket - jobs <- withErrorT show $ runRpcClient maintenanceJobs wconfdClient + jobs <- withErrorT show $ runNewWConfdClient maintenanceJobs liftIO . atomicModifyIORef memstate $ \ s -> (s { msJobs = jobs }, ()) return jobs diff --git a/src/Ganeti/MaintD/Server.hs b/src/Ganeti/MaintD/Server.hs index e3ac20e..c68c7e3 100644 --- a/src/Ganeti/MaintD/Server.hs +++ b/src/Ganeti/MaintD/Server.hs @@ -43,6 +43,7 @@ module Ganeti.MaintD.Server import Control.Applicative ((<|>)) import Control.Concurrent (forkIO) +import Control.Exception.Lifted (bracket) import Control.Monad (forever, void, unless, when, liftM) import Control.Monad.IO.Class (liftIO) import Data.IORef (IORef, newIORef, readIORef) @@ -122,9 +123,10 @@ maintenance memstate = do logDebug $ "Jobs submitted in the last round: " ++ show (map fromJobId oldjobs) luxiSocket <- liftIO Path.defaultQuerySocket - lclient <- mkResultT . liftM (either (Bad . show) Ok) - . tryIOError $ L.getLuxiClient luxiSocket - void . mkResultT $ waitForJobs oldjobs lclient + bracket (mkResultT . liftM (either (Bad . show) Ok) + . tryIOError $ L.getLuxiClient luxiSocket) + (liftIO . L.closeClient) + $ void . mkResultT . waitForJobs oldjobs liftIO $ clearJobs memstate logDebug "New round of maintenance started" cData <- loadClusterData -- Klaus Aehlig Google Germany GmbH, Dienerstr. 12, 80331 Muenchen Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg Geschaeftsfuehrer: Graham Law, Christine Elizabeth Flores