On Mon, Mar 23, 2015 at 04:46:28PM +0100, 'Klaus Aehlig' via ganeti-devel wrote:
During cluster destruction, WConfD will need to take the
BGL. Therefore, it has to have a livelock file as well.
Signed-off-by: Klaus Aehlig <[email protected]>
---
src/Ganeti/WConfd/Monad.hs | 8 +++++++-
src/Ganeti/WConfd/Server.hs | 5 ++++-
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/Ganeti/WConfd/Monad.hs b/src/Ganeti/WConfd/Monad.hs
index 444cf18..b7b7ec5 100644
--- a/src/Ganeti/WConfd/Monad.hs
+++ b/src/Ganeti/WConfd/Monad.hs
@@ -46,6 +46,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
module Ganeti.WConfd.Monad
( DaemonHandle
, dhConfigPath
+ , dhLivelock
, mkDaemonHandle
, WConfdMonadInt
, runWConfdMonadInt
@@ -92,6 +93,7 @@ import Ganeti.Logging.WriterLog
import Ganeti.Objects (ConfigData)
import Ganeti.Utils.AsyncWorker
import Ganeti.Utils.IORef
+import Ganeti.Utils.Livelock (Livelock)
import Ganeti.WConfd.ConfigState
import Ganeti.WConfd.TempRes
@@ -116,6 +118,7 @@ data DaemonHandle = DaemonHandle
, dhSaveConfigWorker :: AsyncWorker Any ()
, dhSaveLocksWorker :: AsyncWorker () ()
, dhSaveTempResWorker :: AsyncWorker () ()
+ , dhLivelock :: Livelock
}
mkDaemonHandle :: FilePath
@@ -138,10 +141,12 @@ mkDaemonHandle :: FilePath
-> (IO TempResState -> ResultG (AsyncWorker () ()))
-- ^ A function that creates a worker that asynchronously
-- saves the temporary reservations state.
+ -> Livelock
-> ResultG DaemonHandle
mkDaemonHandle cpath cstat lstat trstat
saveWorkerFn distMCsWorkerFn distSSConfWorkerFn
- saveLockWorkerFn saveTempResWorkerFn = do
+ saveLockWorkerFn saveTempResWorkerFn
+ livelock = do
ds <- newIORef $ DaemonState cstat lstat trstat
let readConfigIO = dsConfigState `liftM` readIORef ds :: IO ConfigState
@@ -155,6 +160,7 @@ mkDaemonHandle cpath cstat lstat trstat
saveTempResWorker <- saveTempResWorkerFn $ dsTempRes `liftM` readIORef ds
return $ DaemonHandle ds cpath saveWorker saveLockWorker saveTempResWorker
+ livelock
-- * The monad and its instances
diff --git a/src/Ganeti/WConfd/Server.hs b/src/Ganeti/WConfd/Server.hs
index 6379f60..17a658b 100644
--- a/src/Ganeti/WConfd/Server.hs
+++ b/src/Ganeti/WConfd/Server.hs
@@ -46,15 +46,16 @@ import Control.Monad
import Control.Monad.Error
import Ganeti.BasicTypes
+import qualified Ganeti.Constants as C
import Ganeti.Daemon
import Ganeti.Daemon.Utils (handleMasterVerificationOptions)
import Ganeti.Logging (logDebug)
import qualified Ganeti.Path as Path
import Ganeti.THH.RPC
import Ganeti.UDSServer
-
import Ganeti.Errors (formatError)
import Ganeti.Runtime
+import Ganeti.Utils.Livelock (mkLivelockFile)
import Ganeti.WConfd.ConfigState
import Ganeti.WConfd.ConfigVerify
import Ganeti.WConfd.ConfigWriter
@@ -93,6 +94,7 @@ prepMain _ _ = do
verifyConfigErr cdata
lock <- readPersistent persistentLocks
tempres <- readPersistent persistentTempRes
+ (_, livelock) <- mkLivelockFile C.wconfdLivelockPrefix
mkDaemonHandle conf_file
(mkConfigState cdata)
lock
@@ -102,6 +104,7 @@ prepMain _ _ = do
distSSConfAsyncTask
(writePersistentAsyncTask persistentLocks)
(writePersistentAsyncTask persistentTempRes)
+ livelock
return (s, dh)
--
2.2.0.rc0.207.ga3a616c
LGTM