Revision 825f8cee

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
b/test/data/htools/hail-reloc-drbd.json
461 461
      "total_memory": 32763,
462 462
      "primary_ip": "192.168.1.2",
463 463
      "i_pri_memory": 0,
464
      "free_spindles": 12,
464
      "free_spindles": 11,
465 465
      "total_spindles": 12,
466 466
      "vm_capable": true,
467 467
      "offline": false
b/test/hs/Test/Ganeti/HTools/Node.hs
113 113
genExclStorNode = do
114 114
  n <- genOnlineNode
115 115
  fs <- choose (Types.unitSpindle, Node.tSpindles n)
116
  let pd = fromIntegral fs / fromIntegral (Node.tSpindles n)::Double
116 117
  return n { Node.exclStorage = True
117 118
           , Node.fSpindles = fs
119
           , Node.pDsk = pd
118 120
           }
119 121

  
120 122
-- | Generate a node with exclusive storage possibly enabled.

Also available in: Unified diff