> >+-- | 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

Reply via email to