From c43c3354485f86ae3795066799d815378ea599b4 Mon Sep 17 00:00:00 2001
From: Iustin Pop <iustin@google.com>
Date: Sun, 5 Jul 2009 16:09:43 +0300
Subject: [PATCH] Return correct failure data from Node.add*

This patch alters the Node.addPri/addSec to return correct failure data.
It removes the computeFailN1 function from the module as that used to
combine both mem and disk checks in the same function and thus the real
error reason cannot be deduced when using it.
---
 Ganeti/HTools/Node.hs | 71 ++++++++++++++++---------------------------
 1 file changed, 26 insertions(+), 45 deletions(-)

diff --git a/Ganeti/HTools/Node.hs b/Ganeti/HTools/Node.hs
index db5e402e2..dca4ca7af 100644
--- a/Ganeti/HTools/Node.hs
+++ b/Ganeti/HTools/Node.hs
@@ -210,7 +210,7 @@ buildPeers t il =
                 (slist t)
         pmap = PeerMap.accumArray (+) mdata
         new_rmem = computeMaxRes pmap
-        new_failN1 = computeFailN1 new_rmem (f_mem t) (f_dsk t)
+        new_failN1 = (f_mem t) <= new_rmem
         new_prem = (fromIntegral new_rmem) / (t_mem t)
     in t {peers=pmap, failN1 = new_failN1, r_mem = new_rmem, p_rem = new_prem}
 
@@ -233,27 +233,11 @@ addCpus t count =
 -- | Sets the free memory.
 setFmem :: Node -> Int -> Node
 setFmem t new_mem =
-    let new_n1 = computeFailN1 (r_mem t) new_mem (f_dsk t)
+    let new_n1 = new_mem <= (r_mem t)
         new_mp = (fromIntegral new_mem) / (t_mem t)
     in
       t { f_mem = new_mem, failN1 = new_n1, p_mem = new_mp }
 
--- | Given the rmem, free memory and disk, computes the failn1 status.
-computeFailN1 :: Int -> Int -> Int -> Bool
-computeFailN1 new_rmem new_mem new_dsk =
-    new_mem <= new_rmem || new_dsk <= 0
-
--- | Given the new free memory and disk, fail if any of them is below zero.
-failHealth :: Int -> Int -> Bool
-failHealth new_mem new_dsk = new_mem <= 0 || new_dsk <= 0
-
--- | Given new limits, check if any of them are overtaken
-failLimits :: Node -> Double -> Double -> Bool
-failLimits t new_dsk new_cpu =
-    let l_dsk = m_dsk t
-        l_cpu = m_cpu t
-    in (l_dsk > new_dsk) || (l_cpu >= 0 && l_cpu < new_cpu)
-
 -- | Removes a primary instance.
 removePri :: Node -> Instance.Instance -> Node
 removePri t inst =
@@ -263,7 +247,7 @@ removePri t inst =
         new_dsk = f_dsk t + Instance.dsk inst
         new_mp = (fromIntegral new_mem) / (t_mem t)
         new_dp = (fromIntegral new_dsk) / (t_dsk t)
-        new_failn1 = computeFailN1 (r_mem t) new_mem new_dsk
+        new_failn1 = new_mem <= (r_mem t)
         new_ucpu = (u_cpu t) - (Instance.vcpus inst)
         new_rcpu = (fromIntegral new_ucpu) / (t_cpu t)
     in t {plist = new_plist, f_mem = new_mem, f_dsk = new_dsk,
@@ -287,7 +271,7 @@ removeSec t inst =
                    else
                        computeMaxRes new_peers
         new_prem = (fromIntegral new_rmem) / (t_mem t)
-        new_failn1 = computeFailN1 new_rmem (f_mem t) new_dsk
+        new_failn1 = (f_mem t) <= new_rmem
         new_dp = (fromIntegral new_dsk) / (t_dsk t)
     in t {slist = new_slist, f_dsk = new_dsk, peers = new_peers,
           failN1 = new_failn1, r_mem = new_rmem, p_dsk = new_dp,
@@ -299,22 +283,22 @@ addPri t inst =
     let iname = Instance.idx inst
         new_mem = f_mem t - Instance.mem inst
         new_dsk = f_dsk t - Instance.dsk inst
-        new_failn1 = computeFailN1 (r_mem t) new_mem new_dsk
+        new_failn1 = new_mem <= (r_mem t)
         new_ucpu = (u_cpu t) + (Instance.vcpus inst)
         new_pcpu = (fromIntegral new_ucpu) / (t_cpu t)
         new_dp = (fromIntegral new_dsk) / (t_dsk t)
-    in
-      if (failHealth new_mem new_dsk) || (new_failn1 && not (failN1 t)) ||
-         (failLimits t new_dp new_pcpu)
-      then
-        T.OpFail T.FailN1
-      else
-        let new_plist = iname:(plist t)
-            new_mp = (fromIntegral new_mem) / (t_mem t)
-        in
-        T.OpGood t {plist = new_plist, f_mem = new_mem, f_dsk = new_dsk,
-                    failN1 = new_failn1, p_mem = new_mp, p_dsk = new_dp,
-                    u_cpu = new_ucpu, p_cpu = new_pcpu}
+        l_cpu = m_cpu t
+    in if new_mem <= 0 then T.OpFail T.FailMem
+       else if new_dsk <= 0 || m_dsk t > new_dp then T.OpFail T.FailDisk
+       else if (new_failn1 && not (failN1 t)) then T.OpFail T.FailMem
+       else if l_cpu >= 0 && l_cpu < new_pcpu then T.OpFail T.FailCPU
+       else
+           let new_plist = iname:(plist t)
+               new_mp = (fromIntegral new_mem) / (t_mem t)
+               r = t { plist = new_plist, f_mem = new_mem, f_dsk = new_dsk,
+                       failN1 = new_failn1, p_mem = new_mp, p_dsk = new_dp,
+                       u_cpu = new_ucpu, p_cpu = new_pcpu }
+           in T.OpGood r
 
 -- | Adds a secondary instance.
 addSec :: Node -> Instance.Instance -> T.Ndx -> T.OpResult Node
@@ -327,19 +311,16 @@ addSec t inst pdx =
         new_peers = PeerMap.add pdx new_peem old_peers
         new_rmem = max (r_mem t) new_peem
         new_prem = (fromIntegral new_rmem) / (t_mem t)
-        new_failn1 = computeFailN1 new_rmem old_mem new_dsk
+        new_failn1 = old_mem <= new_rmem
         new_dp = (fromIntegral new_dsk) / (t_dsk t)
-    in if (failHealth old_mem new_dsk) || (new_failn1 && not (failN1 t)) ||
-          (failLimits t new_dp noLimit)
-       then
-           T.OpFail T.FailN1
-       else
-           let new_slist = iname:(slist t)
-           in
-             T.OpGood t {slist = new_slist, f_dsk = new_dsk,
-                         peers = new_peers, failN1 = new_failn1,
-                         r_mem = new_rmem, p_dsk = new_dp,
-                         p_rem = new_prem}
+    in if new_dsk <= 0 || m_dsk t > new_dp then T.OpFail T.FailDisk
+       else if (new_failn1 && not (failN1 t)) then T.OpFail T.FailMem
+       else let new_slist = iname:(slist t)
+                r = t { slist = new_slist, f_dsk = new_dsk,
+                        peers = new_peers, failN1 = new_failn1,
+                        r_mem = new_rmem, p_dsk = new_dp,
+                        p_rem = new_prem }
+           in T.OpGood r
 
 -- * Stats functions
 
-- 
GitLab