diff --git a/Ganeti/HTools/Node.hs b/Ganeti/HTools/Node.hs index db5e402e2c38bf79879549614740346ee4b01a7a..dca4ca7af99a0d759e159a64860720548a48d1bf 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