Make redundant and allocGlobalN1 honor AcceptExisting
authorKlaus Aehlig <aehlig@google.com>
Tue, 1 Sep 2015 15:27:50 +0000 (17:27 +0200)
committerKlaus Aehlig <aehlig@google.com>
Thu, 3 Sep 2015 09:19:02 +0000 (11:19 +0200)
When deciding if a situation is redundant and AcceptExisting
is given, do not try to evacuate nodes that are offline already.

Signed-off-by: Klaus Aehlig <aehlig@google.com>
Reviewed-by: Petr Pudlak <pudlak@google.com>

src/Ganeti/HTools/Cluster.hs
src/Ganeti/HTools/GlobalN1.hs

index b8f1f60..8e4327c 100644 (file)
@@ -510,7 +510,7 @@ tryAlloc _ _  _ _    (Right []) = fail "Not enough online nodes"
 tryAlloc opts nl il inst (Right ok_pairs) =
   let cstat = compClusterStatistics $ Container.elems nl
       n1pred = if algCapacity opts
-                 then allocGlobalN1 nl il
+                 then allocGlobalN1 opts nl il
                  else const True
       psols = parMap rwhnf (\(p, ss) ->
                               collectionToSolution FailN1 n1pred $
@@ -528,7 +528,7 @@ tryAlloc opts nl il inst (Left all_nodes) =
                        . allocateOnSingle opts nl inst
                    ) emptyAllocCollection all_nodes
       n1pred = if algCapacity opts
-                 then allocGlobalN1 nl il
+                 then allocGlobalN1 opts nl il
                  else const True
   in return . annotateSolution
        $ collectionToSolution FailN1 n1pred sols
@@ -813,7 +813,7 @@ iterateAlloc' tryHugestep opts nl il limit newinst allocnodes ixes cstats =
          in case iterateAllocSmallStep opts' nl il limit'
                                        newinst allocnodes ixes cstats of
             Bad s -> Bad s
-            Ok res@(_, nl', il', ixes', cstats') | redundant nl' il' ->
+            Ok res@(_, nl', il', ixes', cstats') | redundant opts nl' il' ->
               if newlimit == Just 0 || length ixes' == length ixes
                 then return res
                 else iterateAlloc' tryHugestep opts nl' il' newlimit newinst
index a4e6028..1ce0344 100644 (file)
@@ -113,15 +113,20 @@ canEvacuateNode (nl, il) n = isOk $ do
   foldM_ (recreate escapenodes) (nl'', il'') recreateInstances
 
 -- | Predicate on wheter a given situation is globally N+1 redundant.
-redundant :: Node.List -> Instance.List -> Bool
-redundant nl il = Foldable.all (canEvacuateNode (nl, il)) nl
+redundant :: AlgorithmOptions -> Node.List -> Instance.List -> Bool
+redundant opts nl il =
+  let filterFun = if algAcceptExisting opts
+                    then Container.filter (not . Node.offline)
+                    else id
+  in Foldable.all (canEvacuateNode (nl, il)) $ filterFun nl
 
 -- | Predicate on wheter an allocation element leads to a globally N+1 redundant
 -- state.
-allocGlobalN1 :: Node.List -- ^ the original list of nodes
+allocGlobalN1 :: AlgorithmOptions
+              -> Node.List -- ^ the original list of nodes
               -> Instance.List -- ^ the original list of instances
               -> AllocSol.GenericAllocElement a -> Bool
-allocGlobalN1 nl il alloc =
+allocGlobalN1 opts nl il alloc =
   let il' = AllocSol.updateIl il $ Just alloc
       nl' = AllocSol.extractNl nl il $ Just alloc
-  in redundant nl' il'
+  in redundant opts nl' il'