diff --git a/src/Ganeti/Confd/Server.hs b/src/Ganeti/Confd/Server.hs index 29204a4efeaa113124b6a47dd3f47367a44d074d..cf0cebb01fac4f62a9b017b1e955f730cec3c1fc 100644 --- a/src/Ganeti/Confd/Server.hs +++ b/src/Ganeti/Confd/Server.hs @@ -33,7 +33,7 @@ module Ganeti.Confd.Server import Control.Concurrent import Control.Exception -import Control.Monad (forever, liftM, when) +import Control.Monad (forever, liftM, when, unless) import Data.IORef import Data.List import qualified Data.Map as M @@ -112,6 +112,7 @@ initialPoll = ReloadPoll 0 data ConfigReload = ConfigToDate -- ^ No need to reload | ConfigReloaded -- ^ Configuration reloaded | ConfigIOError -- ^ Error during configuration reload + deriving (Eq) -- | Unknown entry standard response. queryUnknownEntry :: StatusAnswer @@ -522,19 +523,31 @@ prepMain _ (af_family, bindaddr) = do -- | Main function. main :: MainFn (S.Family, S.SockAddr) PrepResult main _ _ (s, query_data, cref) = do + -- Inotify setup + inotify <- initINotify -- try to load the configuration, if possible conf_file <- Path.clusterConfFile - (fstat, _) <- safeUpdateConfig conf_file nullFStat cref + (fstat, reloaded) <- safeUpdateConfig conf_file nullFStat cref ctime <- getCurrentTime - statemvar <- newMVar $ ServerState initialPoll ctime fstat - hmac <- getClusterHmac - -- Inotify setup - inotify <- initINotify + statemvar <- newMVar $ ServerState ReloadNotify ctime fstat let inotiaction = addNotifier inotify conf_file cref statemvar + has_inotify <- if reloaded == ConfigReloaded + then inotiaction + else return False + if has_inotify + then logInfo "Starting up in inotify mode" + else do + -- inotify was not enabled, we need to update the reload model + logInfo "Starting up in polling mode" + modifyMVar_ statemvar + (\state -> return state { reloadModel = initialPoll }) + hmac <- getClusterHmac -- fork the timeout timer _ <- forkIO $ onTimeoutTimer inotiaction conf_file cref statemvar -- fork the polling timer - _ <- forkIO $ onReloadTimer inotiaction conf_file cref statemvar + unless has_inotify $ do + _ <- forkIO $ onReloadTimer inotiaction conf_file cref statemvar + return () -- launch the queryd listener _ <- forkIO $ runQueryD query_data (configReader cref) -- and finally enter the responder loop