Revision 0335fe4a

b/src/Cluster.hs
562 562
-- | Compute the mem and disk covariance.
563 563
compDetailedCV :: NodeList -> (Double, Double)
564 564
compDetailedCV nl =
565
    let nstats = map Node.normUsed $ Container.elems nl
566
        (mem_l, dsk_l) = unzip nstats
565
    let
566
        nodes = Container.elems nl
567
        mem_l = map Node.p_mem nodes
568
        dsk_l = map Node.p_dsk nodes
567 569
        mem_cv = varianceCoeff mem_l
568 570
        dsk_cv = varianceCoeff dsk_l
569 571
    in (mem_cv, dsk_cv)
b/src/Node.hs
6 6

  
7 7
module Node
8 8
    (
9
      Node(failN1, idx, f_mem, f_disk, slist, plist)
9
      Node(failN1, idx, f_mem, f_disk, p_mem, p_dsk, slist, plist)
10 10
    -- * Constructor
11 11
    , create
12 12
    -- ** Finalization after data loading
......
19 19
    , addSec
20 20
    , setPri
21 21
    , setSec
22
    -- * Statistics
23
    , normUsed
24 22
    -- * Formatting
25 23
    , list
26 24
    ) where
......
45 43
                                           -- mapping
46 44
                 , failN1:: Bool -- ^ whether the node has failed n1
47 45
                 , maxRes :: Int -- ^ maximum memory needed for
48
                                   -- failover by primaries of this node
46
                                 -- failover by primaries of this node
47
                 , p_mem :: Double
48
                 , p_dsk :: Double
49 49
  } deriving (Show)
50 50

  
51 51
{- | Create a new node.
......
55 55

  
56 56
-}
57 57
create :: String -> String -> String -> String -> Node
58
create mem_t_init mem_f_init disk_t_init disk_f_init
59
    = Node
60
    {
61
      t_mem = read mem_t_init,
62
      f_mem = read mem_f_init,
63
      t_disk = read disk_t_init,
64
      f_disk = read disk_f_init,
65
      plist = [],
66
      slist = [],
67
      failN1 = True,
68
      idx = -1,
69
      peers = PeerMap.empty,
70
      maxRes = 0
71
    }
58
create mem_t_init mem_f_init disk_t_init disk_f_init =
59
    let mem_t = read mem_t_init
60
        mem_f = read mem_f_init
61
        disk_t = read disk_t_init
62
        disk_f = read disk_f_init
63
    in
64
      Node
65
      {
66
       t_mem = read mem_t_init,
67
       f_mem = read mem_f_init,
68
       t_disk = read disk_t_init,
69
       f_disk = read disk_f_init,
70
       plist = [],
71
       slist = [],
72
       failN1 = True,
73
       idx = -1,
74
       peers = PeerMap.empty,
75
       maxRes = 0,
76
       p_mem = (fromIntegral mem_f) / (fromIntegral mem_t),
77
       p_dsk = (fromIntegral disk_f) / (fromIntegral disk_t)
78
      }
72 79

  
73 80
-- | Changes the index.
74 81
-- This is used only during the building of the data structures.
......
80 87
computeFailN1 new_rmem new_mem new_disk =
81 88
    new_mem <= new_rmem || new_disk <= 0
82 89

  
83

  
84 90
-- | Computes the maximum reserved memory for peers from a peer map.
85 91
computeMaxRes :: PeerMap.PeerMap -> PeerMap.Elem
86 92
computeMaxRes new_peers = PeerMap.maxElem new_peers
......
104 110
        new_plist = delete iname (plist t)
105 111
        new_mem = f_mem t + Instance.mem inst
106 112
        new_disk = f_disk t + Instance.disk inst
113
        new_mp = (fromIntegral new_mem) / (fromIntegral $ t_mem t)
114
        new_dp = (fromIntegral new_disk) / (fromIntegral $ t_disk t)
107 115
        new_failn1 = computeFailN1 (maxRes t) new_mem new_disk
108 116
    in t {plist = new_plist, f_mem = new_mem, f_disk = new_disk,
109
          failN1 = new_failn1}
117
          failN1 = new_failn1, p_mem = new_mp, p_dsk = new_dp}
110 118

  
111 119
-- | Removes a secondary instance.
112 120
removeSec :: Node -> Instance.Instance -> Node
......
125 133
                   else
126 134
                       computeMaxRes new_peers
127 135
        new_failn1 = computeFailN1 new_rmem (f_mem t) new_disk
136
        new_dp = (fromIntegral new_disk) / (fromIntegral $ t_disk t)
128 137
    in t {slist = new_slist, f_disk = new_disk, peers = new_peers,
129
          failN1 = new_failn1, maxRes = new_rmem}
138
          failN1 = new_failn1, maxRes = new_rmem, p_dsk = new_dp}
130 139

  
131 140
-- | Adds a primary instance.
132 141
addPri :: Node -> Instance.Instance -> Maybe Node
......
138 147
      if new_failn1 then
139 148
        Nothing
140 149
      else
141
        let new_plist = iname:(plist t) in
150
        let new_plist = iname:(plist t)
151
            new_mp = (fromIntegral new_mem) / (fromIntegral $ t_mem t)
152
            new_dp = (fromIntegral new_disk) / (fromIntegral $ t_disk t)
153
        in
142 154
        Just t {plist = new_plist, f_mem = new_mem, f_disk = new_disk,
143
                failN1 = new_failn1}
155
                failN1 = new_failn1, p_mem = new_mp, p_dsk = new_dp}
144 156

  
145 157
-- | Adds a secondary instance.
146 158
addSec :: Node -> Instance.Instance -> Int -> Maybe Node
......
155 167
    if new_failn1 then
156 168
        Nothing
157 169
    else
158
        let new_slist = iname:(slist t) in
170
        let new_slist = iname:(slist t)
171
            new_dp = (fromIntegral new_disk) / (fromIntegral $ t_disk t)
172
        in
159 173
        Just t {slist = new_slist, f_disk = new_disk,
160 174
                peers = new_peers, failN1 = new_failn1,
161
                maxRes = new_rmem}
175
                maxRes = new_rmem, p_dsk = new_dp}
162 176

  
163 177
-- | Add a primary instance to a node without other updates
164 178
setPri :: Node -> Int -> Node
......
182 196
list n t =
183 197
    let pl = plist t
184 198
        sl = slist t
185
        (mp, dp) = normUsed t
199
        mp = p_mem t
200
        dp = p_dsk t
186 201
    in
187 202
      printf "  %s(%d)\t%5d\t%5d\t%3d\t%3d\t%s\t%s\t%.5f\t%.5f"
188 203
                 n (idx t) (f_mem t) ((f_disk t) `div` 1024)
......
190 205
                 (commaJoin (map show pl))
191 206
                 (commaJoin (map show sl))
192 207
                 mp dp
193

  
194
-- | Normalize the usage status
195
-- This converts the used memory and disk values into a normalized integer
196
-- value, currently expresed as per mille of totals
197

  
198
normUsed :: Node -> (Double, Double)
199
normUsed n =
200
    let mp = (fromIntegral $ f_mem n) / (fromIntegral $ t_mem n)
201
        dp = (fromIntegral $ f_disk n) / (fromIntegral $ t_disk n)
202
    in (mp, dp)

Also available in: Unified diff