From 82f19570b6508331cf84d3e850eb579df0d30be7 Mon Sep 17 00:00:00 2001 From: Iustin Pop <iustin@google.com> Date: Mon, 20 Feb 2012 12:18:15 +0100 Subject: [PATCH] Track instance-used spindles in node set/add/remove MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This simply tracks the instance-used spindles (using hard-coded '1' per instance), and additionally prevents additions in soft-mode when we go over the limit. Note: there's an assymetry between addSec and removeSec (basically secondaries should only exist with DTDrbd8, so the check for uses_disk is superflous), will be cleaned up later. Signed-off-by: Iustin Pop <iustin@google.com> Reviewed-by: RenΓ© Nussbaumer <rn@google.com> --- htools/Ganeti/HTools/Node.hs | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/htools/Ganeti/HTools/Node.hs b/htools/Ganeti/HTools/Node.hs index 128a3f596..de17ffb3d 100644 --- a/htools/Ganeti/HTools/Node.hs +++ b/htools/Ganeti/HTools/Node.hs @@ -323,17 +323,23 @@ setPri t inst = t { pList = Instance.idx inst:pList t , pCpu = fromIntegral new_count / tCpu t , utilLoad = utilLoad t `T.addUtil` Instance.util inst , pTags = addTags (pTags t) (Instance.tags inst) + , instSpindles = new_spindles } where new_count = Instance.applyIfOnline inst (+ Instance.vcpus inst) (uCpu t ) + new_spindles = instSpindles t + if Instance.usesLocalStorage inst + then 1 else 0 -- | Assigns an instance to a node as secondary without other updates. setSec :: Node -> Instance.Instance -> Node setSec t inst = t { sList = Instance.idx inst:sList t , utilLoad = old_load { T.dskWeight = T.dskWeight old_load + T.dskWeight (Instance.util inst) } + , instSpindles = new_spindles } where old_load = utilLoad t + new_spindles = instSpindles t + if Instance.usesLocalStorage inst + then 1 else 0 -- * Update functions @@ -353,6 +359,7 @@ removePri t inst = new_plist = delete iname (pList t) new_mem = incIf i_online (fMem t) (Instance.mem inst) new_dsk = incIf uses_disk (fDsk t) (Instance.dsk inst) + new_spindles = decIf uses_disk (instSpindles t) 1 new_mp = fromIntegral new_mem / tMem t new_dp = fromIntegral new_dsk / tDsk t new_failn1 = new_mem <= rMem t @@ -362,7 +369,9 @@ removePri t inst = in t { pList = new_plist, fMem = new_mem, fDsk = new_dsk , failN1 = new_failn1, pMem = new_mp, pDsk = new_dp , uCpu = new_ucpu, pCpu = new_rcpu, utilLoad = new_load - , pTags = delTags (pTags t) (Instance.tags inst) } + , pTags = delTags (pTags t) (Instance.tags inst) + , instSpindles = new_spindles + } -- | Removes a secondary instance. removeSec :: Node -> Instance.Instance -> Node @@ -373,6 +382,7 @@ removeSec t inst = pnode = Instance.pNode inst new_slist = delete iname (sList t) new_dsk = incIf uses_disk cur_dsk (Instance.dsk inst) + new_spindles = decIf uses_disk (instSpindles t) 1 old_peers = peers t old_peem = P.find pnode old_peers new_peem = decIf (Instance.usesSecMem inst) old_peem (Instance.mem inst) @@ -391,7 +401,9 @@ removeSec t inst = T.dskWeight (Instance.util inst) } in t { sList = new_slist, fDsk = new_dsk, peers = new_peers , failN1 = new_failn1, rMem = new_rmem, pDsk = new_dp - , pRem = new_prem, utilLoad = new_load } + , pRem = new_prem, utilLoad = new_load + , instSpindles = new_spindles + } -- | Adds a primary instance (basic version). addPri :: Node -> Instance.Instance -> T.OpResult Node @@ -414,6 +426,7 @@ addPriEx force t inst = cur_dsk = fDsk t new_mem = decIf i_online (fMem t) (Instance.mem inst) new_dsk = decIf uses_disk cur_dsk (Instance.dsk inst) + new_spindles = incIf uses_disk (instSpindles t) 1 new_failn1 = new_mem <= rMem t new_ucpu = incIf i_online (uCpu t) (Instance.vcpus inst) new_pcpu = fromIntegral new_ucpu / tCpu t @@ -427,6 +440,8 @@ addPriEx force t inst = _ | new_mem <= 0 -> T.OpFail T.FailMem | uses_disk && new_dsk <= 0 -> T.OpFail T.FailDisk | uses_disk && mDsk t > new_dp && strict -> T.OpFail T.FailDisk + | uses_disk && new_spindles > hiSpindles t + && strict -> T.OpFail T.FailDisk | new_failn1 && not (failN1 t) && strict -> T.OpFail T.FailMem | l_cpu >= 0 && l_cpu < new_pcpu && strict -> T.OpFail T.FailCPU | rejectAddTags old_tags inst_tags -> T.OpFail T.FailTags @@ -437,7 +452,9 @@ addPriEx force t inst = , failN1 = new_failn1, pMem = new_mp, pDsk = new_dp , uCpu = new_ucpu, pCpu = new_pcpu , utilLoad = new_load - , pTags = addTags old_tags inst_tags } + , pTags = addTags old_tags inst_tags + , instSpindles = new_spindles + } in T.OpGood r -- | Adds a secondary instance (basic version). @@ -451,6 +468,7 @@ addSecEx force t inst pdx = old_peers = peers t old_mem = fMem t new_dsk = fDsk t - Instance.dsk inst + new_spindles = instSpindles t + 1 secondary_needed_mem = if Instance.usesSecMem inst then Instance.mem inst else 0 @@ -468,6 +486,7 @@ addSecEx force t inst pdx = _ | not (Instance.hasSecondary inst) -> T.OpFail T.FailDisk | new_dsk <= 0 -> T.OpFail T.FailDisk | mDsk t > new_dp && strict -> T.OpFail T.FailDisk + | new_spindles > hiSpindles t && strict -> T.OpFail T.FailDisk | secondary_needed_mem >= old_mem && strict -> T.OpFail T.FailMem | new_failn1 && not (failN1 t) && strict -> T.OpFail T.FailMem | otherwise -> @@ -475,7 +494,9 @@ addSecEx force t inst pdx = r = t { sList = new_slist, fDsk = new_dsk , peers = new_peers, failN1 = new_failn1 , rMem = new_rmem, pDsk = new_dp - , pRem = new_prem, utilLoad = new_load } + , pRem = new_prem, utilLoad = new_load + , instSpindles = new_spindles + } in T.OpGood r -- * Stats functions -- GitLab