Introduce new formula of pMem calculating that works good with memory
over-commitment. fMem / tMem is replaced with fMem / (tMem - nMem).
tMem replaced with tMem - nMem because we care of memory which can be
used for instance placement. Negative values of pMem mean active
memory ovet-commitment.

Signed-off-by: Oleg Ponomarev <[email protected]>
---
 src/Ganeti/HTools/Node.hs          | 21 ++++++++++++++-------
 test/hs/Test/Ganeti/HTools/Node.hs |  7 +++++--
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/src/Ganeti/HTools/Node.hs b/src/Ganeti/HTools/Node.hs
index 22882fe..6907b29 100644
--- a/src/Ganeti/HTools/Node.hs
+++ b/src/Ganeti/HTools/Node.hs
@@ -43,6 +43,7 @@ module Ganeti.HTools.Node
   , create
   -- ** Finalization after data loading
   , buildPeers
+  , computePmem
   , setIdx
   , setAlias
   , setOffline
@@ -304,6 +305,10 @@ haveExclStorage :: List -> Bool
 haveExclStorage nl =
   any exclStorage $ Container.elems nl
 
+-- | Conversion formula from fMem, tMem and nMem to pMem.
+computePmem :: Int -> Double -> Int -> Double
+computePmem fmem tmem nmem = fromIntegral fmem / (tmem - fromIntegral nmem)
+
 -- * Initialization functions
 
 -- | Create a new node.
@@ -344,8 +349,8 @@ create name_init mem_t_init mem_n_init mem_f_init
        , peers = P.empty
        , rMem = 0
        , rMemForth = 0
-       , pMem = fromIntegral mem_f_init / mem_t_init
-       , pMemForth = fromIntegral mem_f_init / mem_t_init
+       , pMem = computePmem mem_f_init mem_t_init mem_n_init
+       , pMemForth = computePmem mem_f_init mem_t_init mem_n_init
        , pDsk = if excl_stor
                 then computePDsk spindles_f_init $ fromIntegral spindles_t_init
                 else computePDsk dsk_f_init dsk_t_init
@@ -452,6 +457,8 @@ setPolicy pol node =
        , hiCpu = mCpuTohiCpu (T.iPolicyVcpuRatio pol) (tCpu node)
        , hiSpindles = computeHiSpindles (T.iPolicySpindleRatio pol)
                       (tSpindles node)
+       , pMem = computePmem (fMem node) (tMem node) (nMem node)
+       , pMemForth = computePmem (fMemForth node) (tMem node) (nMem node)
        }
 
 -- | Computes the maximum reserved memory for peers from a peer map.
@@ -605,7 +612,7 @@ setPri t inst
                                 (fMemForth node)
                                 (Instance.mem inst)
 
-          new_pMemForth = fromIntegral new_fMemForth / tMem node
+          new_pMemForth = computePmem new_fMemForth (tMem node) (nMem node)
 
       in node
            { pTags = addTags (pTags node) (Instance.exclTags inst)
@@ -738,7 +745,7 @@ removePri t inst =
             new_dsk_forth = incIf uses_disk (fDskForth n) (Instance.dsk inst)
             new_free_sp_forth = calcNewFreeSpindlesForth False n inst
             new_inst_sp_forth = calcSpindleUseForth False n inst
-            new_mp_forth = fromIntegral new_mem_forth / tMem n
+            new_mp_forth = computePmem new_mem_forth (tMem n) (nMem n)
             new_dp_forth = computeNewPDsk n new_free_sp_forth new_dsk_forth
             new_ucpu_forth = decIf i_online (uCpuForth n) (Instance.vcpus inst)
             new_rcpu_forth = fromIntegral new_ucpu_forth / tCpu n
@@ -769,7 +776,7 @@ removePri t inst =
                 new_dsk = incIf uses_disk (fDsk t) (Instance.dsk inst)
                 new_free_sp = calcNewFreeSpindles False t inst
                 new_inst_sp = calcSpindleUse False t inst
-                new_mp = fromIntegral new_mem / tMem t
+                new_mp = computePmem new_mem (tMem t) (nMem t)
                 new_dp = computeNewPDsk t new_free_sp new_dsk
                 new_failn1 = new_mem - rMem t <= fMemTreshold t
                 new_ucpu = decIf i_online (uCpu t) (Instance.vcpus inst)
@@ -880,7 +887,7 @@ addPriEx force t inst =
       inst_tags = Instance.exclTags inst
 
       new_mem_forth = fMemForth t - Instance.mem inst
-      new_mp_forth = fromIntegral new_mem_forth / tMem t
+      new_mp_forth = computePmem new_mem_forth (tMem t) (nMem t)
       new_dsk_forth = decIf uses_disk (fDskForth t) (Instance.dsk inst)
       new_free_sp_forth = calcNewFreeSpindlesForth True t inst
       new_inst_sp_forth = calcSpindleUseForth True t inst
@@ -938,7 +945,7 @@ addPriEx force t inst =
                new_load = utilLoad t `T.addUtil` Instance.util inst
 
                new_plist = iname:pList t
-               new_mp = fromIntegral new_mem / tMem t
+               new_mp = computePmem new_mem (tMem t) (nMem t)
 
                new_instance_map = addTags (instanceMap t)
                                 $ getLocationExclusionPairs t inst
diff --git a/test/hs/Test/Ganeti/HTools/Node.hs 
b/test/hs/Test/Ganeti/HTools/Node.hs
index b930a43..f7645f7 100644
--- a/test/hs/Test/Ganeti/HTools/Node.hs
+++ b/test/hs/Test/Ganeti/HTools/Node.hs
@@ -128,8 +128,11 @@ genEmptyOnlineNode =
       let node' = node { Node.offline = False
                        , Node.fMem = fmem
                        , Node.fMemForth = fmem
-                       , Node.pMem = fromIntegral fmem / Node.tMem node
-                       , Node.pMemForth = fromIntegral fmem / Node.tMem node
+                       , Node.pMem = Node.computePmem fmem (Node.tMem node)
+                                                      (Node.nMem node)
+                       , Node.pMemForth = Node.computePmem fmem
+                                                           (Node.tMem node)
+                                                           (Node.nMem node)
                        , Node.rMem = 0
                        , Node.rMemForth = 0
                        , Node.pRem = 0
-- 
2.6.0.rc2.230.g3dd15c0

Reply via email to