From 7e7f6ca279206f095cfbc1d51fdbb622446f503e Mon Sep 17 00:00:00 2001 From: Iustin Pop <iustin@google.com> Date: Thu, 21 May 2009 01:54:27 +0100 Subject: [PATCH] Experimental support for non-redundant instances This patch adds experimental support to hbal for non-redundant instances (i.e. instances with only one node). They are currently handled as non-moveable, and as such the algorithm simply ignores them. Supports needs to be added when reading from RAPI via hscan, and probably in other corner cases. --- Ganeti/HTools/Cluster.hs | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/Ganeti/HTools/Cluster.hs b/Ganeti/HTools/Cluster.hs index 475b19032..a85b9ad9b 100644 --- a/Ganeti/HTools/Cluster.hs +++ b/Ganeti/HTools/Cluster.hs @@ -85,6 +85,10 @@ data IMove = Failover -- ^ Failover the instance (f) data Table = Table NodeList InstanceList Score [Placement] deriving (Show) +-- | Constant node index for a non-moveable instance +noSecondary :: Int +noSecondary = -1 + -- General functions -- | Cap the removal list if needed. @@ -475,8 +479,10 @@ checkMove nodes_idx ini_tbl victims = -- iterate over all instances, computing the best move best_tbl = foldl' - (\ step_tbl elem -> compareTables step_tbl $ - checkInstanceMove nodes_idx ini_tbl elem) + (\ step_tbl elem -> + if Instance.snode elem == noSecondary then step_tbl + else compareTables step_tbl $ + checkInstanceMove nodes_idx ini_tbl elem) ini_tbl victims Table _ _ _ best_plc = best_tbl in @@ -716,13 +722,20 @@ fixNodes nl il = pdx = Instance.pnode inst sdx = Instance.snode inst pold = fromJust $ lookup pdx accu - sold = fromJust $ lookup sdx accu pnew = Node.setPri pold idx - snew = Node.setSec sold idx ac1 = deleteBy assocEqual (pdx, pold) accu - ac2 = deleteBy assocEqual (sdx, sold) ac1 - ac3 = (pdx, pnew):(sdx, snew):ac2 - in ac3) nl il + ac2 = (pdx, pnew):ac1 + in + if sdx /= noSecondary then + let + sold = fromJust $ lookup sdx accu + snew = Node.setSec sold idx + ac3 = deleteBy assocEqual (sdx, sold) ac2 + ac4 = (sdx, snew):ac3 + in ac4 + else + ac2 + ) nl il -- | Compute the longest common suffix of a NameList list that -- | starts with a dot @@ -781,7 +794,8 @@ loadInst :: (Monad m) => [(String, Int)] -> [String] -> m (String, Instance.Instance) loadInst ktn (name:mem:dsk:status:pnode:snode:[]) = do pidx <- lookupNode pnode name ktn - sidx <- lookupNode snode name ktn + sidx <- (if null snode then return noSecondary + else lookupNode snode name ktn) vmem <- tryRead name mem vdsk <- tryRead name dsk when (sidx == pidx) $ fail $ "Instance " ++ name ++ -- GitLab