Merge branch 'stable-2.13' into stable-2.14
[ganeti-github.git] / src / Ganeti / WConfd / Core.hs
index d327002..8c0306c 100644 (file)
@@ -44,7 +44,7 @@ module Ganeti.WConfd.Core where
 import Control.Arrow ((&&&))
 import Control.Concurrent (myThreadId)
 import Control.Lens.Setter (set)
-import Control.Monad (liftM, unless, when)
+import Control.Monad (liftM, unless)
 import qualified Data.Map as M
 import qualified Data.Set as S
 import Language.Haskell.TH (Name)
@@ -117,16 +117,22 @@ lockConfig
     -> Bool -- ^ set to 'True' if the lock should be shared
     -> WConfdMonad (J.MaybeForJSON ConfigData)
 lockConfig cid shared = do
-  let reqtype = if shared then ReqShared else ReqExclusive
-  -- warn if we already have the lock, this shouldn't happen
+  let (reqtype, owntype) = if shared
+                             then (ReqShared, L.OwnShared)
+                             else (ReqExclusive, L.OwnExclusive)
   la <- readLockAllocation
-  when (L.holdsLock cid ConfigLock L.OwnShared la)
-       . failError $ "Client " ++ show cid ++
-                     " already holds a config lock"
-  waiting <- tryUpdateLocks cid [(ConfigLock, reqtype)]
-  liftM J.MaybeForJSON $ case waiting of
-    []  -> liftM Just CW.readConfig
-    _   -> return Nothing
+  if L.holdsLock cid ConfigLock owntype la
+    then do
+      -- warn if we already have the lock, but continue (with no-op)
+      -- on the locks
+      logWarning $ "Client " ++ show cid ++ " asked to lock the config"
+                   ++ " while owning the lock"
+      liftM (J.MaybeForJSON . Just) CW.readConfig
+    else do
+      waiting <- tryUpdateLocks cid [(ConfigLock, reqtype)]
+      liftM J.MaybeForJSON $ case waiting of
+        []  -> liftM Just CW.readConfig
+        _   -> return Nothing
 
 -- | Release the config lock, if the client currently holds it.
 unlockConfig