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