Revision c43c3354
b/Ganeti/HTools/Node.hs | ||
---|---|---|
210 | 210 |
(slist t) |
211 | 211 |
pmap = PeerMap.accumArray (+) mdata |
212 | 212 |
new_rmem = computeMaxRes pmap |
213 |
new_failN1 = computeFailN1 new_rmem (f_mem t) (f_dsk t)
|
|
213 |
new_failN1 = (f_mem t) <= new_rmem
|
|
214 | 214 |
new_prem = (fromIntegral new_rmem) / (t_mem t) |
215 | 215 |
in t {peers=pmap, failN1 = new_failN1, r_mem = new_rmem, p_rem = new_prem} |
216 | 216 |
|
... | ... | |
233 | 233 |
-- | Sets the free memory. |
234 | 234 |
setFmem :: Node -> Int -> Node |
235 | 235 |
setFmem t new_mem = |
236 |
let new_n1 = computeFailN1 (r_mem t) new_mem (f_dsk t)
|
|
236 |
let new_n1 = new_mem <= (r_mem t)
|
|
237 | 237 |
new_mp = (fromIntegral new_mem) / (t_mem t) |
238 | 238 |
in |
239 | 239 |
t { f_mem = new_mem, failN1 = new_n1, p_mem = new_mp } |
240 | 240 |
|
241 |
-- | Given the rmem, free memory and disk, computes the failn1 status. |
|
242 |
computeFailN1 :: Int -> Int -> Int -> Bool |
|
243 |
computeFailN1 new_rmem new_mem new_dsk = |
|
244 |
new_mem <= new_rmem || new_dsk <= 0 |
|
245 |
|
|
246 |
-- | Given the new free memory and disk, fail if any of them is below zero. |
|
247 |
failHealth :: Int -> Int -> Bool |
|
248 |
failHealth new_mem new_dsk = new_mem <= 0 || new_dsk <= 0 |
|
249 |
|
|
250 |
-- | Given new limits, check if any of them are overtaken |
|
251 |
failLimits :: Node -> Double -> Double -> Bool |
|
252 |
failLimits t new_dsk new_cpu = |
|
253 |
let l_dsk = m_dsk t |
|
254 |
l_cpu = m_cpu t |
|
255 |
in (l_dsk > new_dsk) || (l_cpu >= 0 && l_cpu < new_cpu) |
|
256 |
|
|
257 | 241 |
-- | Removes a primary instance. |
258 | 242 |
removePri :: Node -> Instance.Instance -> Node |
259 | 243 |
removePri t inst = |
... | ... | |
263 | 247 |
new_dsk = f_dsk t + Instance.dsk inst |
264 | 248 |
new_mp = (fromIntegral new_mem) / (t_mem t) |
265 | 249 |
new_dp = (fromIntegral new_dsk) / (t_dsk t) |
266 |
new_failn1 = computeFailN1 (r_mem t) new_mem new_dsk
|
|
250 |
new_failn1 = new_mem <= (r_mem t)
|
|
267 | 251 |
new_ucpu = (u_cpu t) - (Instance.vcpus inst) |
268 | 252 |
new_rcpu = (fromIntegral new_ucpu) / (t_cpu t) |
269 | 253 |
in t {plist = new_plist, f_mem = new_mem, f_dsk = new_dsk, |
... | ... | |
287 | 271 |
else |
288 | 272 |
computeMaxRes new_peers |
289 | 273 |
new_prem = (fromIntegral new_rmem) / (t_mem t) |
290 |
new_failn1 = computeFailN1 new_rmem (f_mem t) new_dsk
|
|
274 |
new_failn1 = (f_mem t) <= new_rmem
|
|
291 | 275 |
new_dp = (fromIntegral new_dsk) / (t_dsk t) |
292 | 276 |
in t {slist = new_slist, f_dsk = new_dsk, peers = new_peers, |
293 | 277 |
failN1 = new_failn1, r_mem = new_rmem, p_dsk = new_dp, |
... | ... | |
299 | 283 |
let iname = Instance.idx inst |
300 | 284 |
new_mem = f_mem t - Instance.mem inst |
301 | 285 |
new_dsk = f_dsk t - Instance.dsk inst |
302 |
new_failn1 = computeFailN1 (r_mem t) new_mem new_dsk
|
|
286 |
new_failn1 = new_mem <= (r_mem t)
|
|
303 | 287 |
new_ucpu = (u_cpu t) + (Instance.vcpus inst) |
304 | 288 |
new_pcpu = (fromIntegral new_ucpu) / (t_cpu t) |
305 | 289 |
new_dp = (fromIntegral new_dsk) / (t_dsk t) |
306 |
in
|
|
307 |
if (failHealth new_mem new_dsk) || (new_failn1 && not (failN1 t)) ||
|
|
308 |
(failLimits t new_dp new_pcpu)
|
|
309 |
then
|
|
310 |
T.OpFail T.FailN1
|
|
311 |
else |
|
312 |
let new_plist = iname:(plist t) |
|
313 |
new_mp = (fromIntegral new_mem) / (t_mem t) |
|
314 |
in
|
|
315 |
T.OpGood t {plist = new_plist, f_mem = new_mem, f_dsk = new_dsk,
|
|
316 |
failN1 = new_failn1, p_mem = new_mp, p_dsk = new_dp,
|
|
317 |
u_cpu = new_ucpu, p_cpu = new_pcpu}
|
|
290 |
l_cpu = m_cpu t
|
|
291 |
in if new_mem <= 0 then T.OpFail T.FailMem
|
|
292 |
else if new_dsk <= 0 || m_dsk t > new_dp then T.OpFail T.FailDisk
|
|
293 |
else if (new_failn1 && not (failN1 t)) then T.OpFail T.FailMem
|
|
294 |
else if l_cpu >= 0 && l_cpu < new_pcpu then T.OpFail T.FailCPU
|
|
295 |
else
|
|
296 |
let new_plist = iname:(plist t)
|
|
297 |
new_mp = (fromIntegral new_mem) / (t_mem t)
|
|
298 |
r = t { plist = new_plist, f_mem = new_mem, f_dsk = new_dsk,
|
|
299 |
failN1 = new_failn1, p_mem = new_mp, p_dsk = new_dp,
|
|
300 |
u_cpu = new_ucpu, p_cpu = new_pcpu }
|
|
301 |
in T.OpGood r
|
|
318 | 302 |
|
319 | 303 |
-- | Adds a secondary instance. |
320 | 304 |
addSec :: Node -> Instance.Instance -> T.Ndx -> T.OpResult Node |
... | ... | |
327 | 311 |
new_peers = PeerMap.add pdx new_peem old_peers |
328 | 312 |
new_rmem = max (r_mem t) new_peem |
329 | 313 |
new_prem = (fromIntegral new_rmem) / (t_mem t) |
330 |
new_failn1 = computeFailN1 new_rmem old_mem new_dsk
|
|
314 |
new_failn1 = old_mem <= new_rmem
|
|
331 | 315 |
new_dp = (fromIntegral new_dsk) / (t_dsk t) |
332 |
in if (failHealth old_mem new_dsk) || (new_failn1 && not (failN1 t)) || |
|
333 |
(failLimits t new_dp noLimit) |
|
334 |
then |
|
335 |
T.OpFail T.FailN1 |
|
336 |
else |
|
337 |
let new_slist = iname:(slist t) |
|
338 |
in |
|
339 |
T.OpGood t {slist = new_slist, f_dsk = new_dsk, |
|
340 |
peers = new_peers, failN1 = new_failn1, |
|
341 |
r_mem = new_rmem, p_dsk = new_dp, |
|
342 |
p_rem = new_prem} |
|
316 |
in if new_dsk <= 0 || m_dsk t > new_dp then T.OpFail T.FailDisk |
|
317 |
else if (new_failn1 && not (failN1 t)) then T.OpFail T.FailMem |
|
318 |
else let new_slist = iname:(slist t) |
|
319 |
r = t { slist = new_slist, f_dsk = new_dsk, |
|
320 |
peers = new_peers, failN1 = new_failn1, |
|
321 |
r_mem = new_rmem, p_dsk = new_dp, |
|
322 |
p_rem = new_prem } |
|
323 |
in T.OpGood r |
|
343 | 324 |
|
344 | 325 |
-- * Stats functions |
345 | 326 |
|
Also available in: Unified diff