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 <[email protected]>
---
 src/Ganeti/HTools/Cluster.hs  |  6 +++---
 src/Ganeti/HTools/GlobalN1.hs | 15 ++++++++++-----
 2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/src/Ganeti/HTools/Cluster.hs b/src/Ganeti/HTools/Cluster.hs
index b8f1f60..8e4327c 100644
--- a/src/Ganeti/HTools/Cluster.hs
+++ b/src/Ganeti/HTools/Cluster.hs
@@ -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
diff --git a/src/Ganeti/HTools/GlobalN1.hs b/src/Ganeti/HTools/GlobalN1.hs
index a4e6028..1ce0344 100644
--- a/src/Ganeti/HTools/GlobalN1.hs
+++ b/src/Ganeti/HTools/GlobalN1.hs
@@ -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'
-- 
2.5.0.457.gab17608

Reply via email to