Revision 825f8cee src/Ganeti/HTools/Node.hs

b/src/Ganeti/HTools/Node.hs
251 251
       , peers = P.empty
252 252
       , rMem = 0
253 253
       , pMem = fromIntegral mem_f_init / mem_t_init
254
       , pDsk = computePDsk dsk_f_init dsk_t_init
254
       , pDsk = if excl_stor
255
                then computePDsk spindles_f_init $ fromIntegral spindles_t_init
256
                else computePDsk dsk_f_init dsk_t_init
255 257
       , pRem = 0
256 258
       , pCpu = 0
257 259
       , offline = offline_init
......
399 401
  where old_load = utilLoad t
400 402

  
401 403
-- | Computes the new 'pDsk' value, handling nodes without local disk
402
-- storage (we consider all their disk used).
404
-- storage (we consider all their disk unused).
403 405
computePDsk :: Int -> Double -> Double
404 406
computePDsk _    0     = 1
405
computePDsk used total = fromIntegral used / total
407
computePDsk free total = fromIntegral free / total
408

  
409
-- | Computes the new 'pDsk' value, handling the exclusive storage state.
410
computeNewPDsk :: Node -> Int -> Int -> Double
411
computeNewPDsk node new_free_sp new_free_dsk =
412
  if exclStorage node
413
  then computePDsk new_free_sp . fromIntegral $ tSpindles node
414
  else computePDsk new_free_dsk $ tDsk node
406 415

  
407 416
-- * Update functions
408 417

  
......
425 434
      new_free_sp = calcNewFreeSpindles False t inst
426 435
      new_inst_sp = calcSpindleUse False t inst
427 436
      new_mp = fromIntegral new_mem / tMem t
428
      new_dp = computePDsk new_dsk (tDsk t)
437
      new_dp = computeNewPDsk t new_free_sp new_dsk
429 438
      new_failn1 = new_mem <= rMem t
430 439
      new_ucpu = decIf i_online (uCpu t) (Instance.vcpus inst)
431 440
      new_rcpu = fromIntegral new_ucpu / tCpu t
......
460 469
                   else computeMaxRes new_peers
461 470
      new_prem = fromIntegral new_rmem / tMem t
462 471
      new_failn1 = fMem t <= new_rmem
463
      new_dp = computePDsk new_dsk (tDsk t)
472
      new_dp = computeNewPDsk t new_free_sp new_dsk
464 473
      old_load = utilLoad t
465 474
      new_load = old_load { T.dskWeight = T.dskWeight old_load -
466 475
                                          T.dskWeight (Instance.util inst) }
......
496 505
      new_failn1 = new_mem <= rMem t
497 506
      new_ucpu = incIf i_online (uCpu t) (Instance.vcpus inst)
498 507
      new_pcpu = fromIntegral new_ucpu / tCpu t
499
      new_dp = computePDsk new_dsk (tDsk t)
508
      new_dp = computeNewPDsk t new_free_sp new_dsk
500 509
      l_cpu = T.iPolicyVcpuRatio $ iPolicy t
501 510
      new_load = utilLoad t `T.addUtil` Instance.util inst
502 511
      inst_tags = Instance.exclTags inst
......
505 514
  in case () of
506 515
       _ | new_mem <= 0 -> Bad T.FailMem
507 516
         | uses_disk && new_dsk <= 0 -> Bad T.FailDisk
508
         | uses_disk && mDsk t > new_dp && strict -> Bad T.FailDisk
517
         | uses_disk && new_dsk < loDsk t && strict -> Bad T.FailDisk
509 518
         | uses_disk && exclStorage t && new_free_sp < 0 -> Bad T.FailSpindles
510 519
         | uses_disk && new_inst_sp > hiSpindles t && strict -> Bad T.FailDisk
511 520
         | new_failn1 && not (failN1 t) && strict -> Bad T.FailMem
......
545 554
      new_rmem = max (rMem t) new_peem
546 555
      new_prem = fromIntegral new_rmem / tMem t
547 556
      new_failn1 = old_mem <= new_rmem
548
      new_dp = computePDsk new_dsk (tDsk t)
557
      new_dp = computeNewPDsk t new_free_sp new_dsk
549 558
      old_load = utilLoad t
550 559
      new_load = old_load { T.dskWeight = T.dskWeight old_load +
551 560
                                          T.dskWeight (Instance.util inst) }
......
553 562
  in case () of
554 563
       _ | not (Instance.hasSecondary inst) -> Bad T.FailDisk
555 564
         | new_dsk <= 0 -> Bad T.FailDisk
556
         | mDsk t > new_dp && strict -> Bad T.FailDisk
565
         | new_dsk < loDsk t && strict -> Bad T.FailDisk
557 566
         | exclStorage t && new_free_sp < 0 -> Bad T.FailSpindles
558 567
         | new_inst_sp > hiSpindles t && strict -> Bad T.FailDisk
559 568
         | secondary_needed_mem >= old_mem && strict -> Bad T.FailMem

Also available in: Unified diff