Revision 74ff6aed src/Ganeti/HTools/Node.hs

b/src/Ganeti/HTools/Node.hs
353 353
  in t {peers=pmap, failN1 = new_failN1, rMem = new_rmem, pRem = new_prem}
354 354

  
355 355
-- | Calculate the new spindle usage
356
calcSpindleUse :: Node -> Instance.Instance -> Double
357
calcSpindleUse n i = incIf (Instance.usesLocalStorage i) (instSpindles n)
358
                       (fromIntegral $ Instance.spindleUse i)
356
calcSpindleUse ::
357
                  Bool -- Action: True = adding instance, False = removing it
358
               -> Node -> Instance.Instance -> Double
359
calcSpindleUse _ (Node {exclStorage = True}) _ = 0.0
360
calcSpindleUse act n@(Node {exclStorage = False}) i =
361
  f (Instance.usesLocalStorage i) (instSpindles n)
362
    (fromIntegral $ Instance.spindleUse i)
363
    where
364
      f :: Bool -> Double -> Double -> Double -- avoid monomorphism restriction
365
      f = if act then incIf else decIf
366

  
367
-- | Calculate the new number of free spindles
368
calcNewFreeSpindles ::
369
                       Bool -- Action: True = adding instance, False = removing
370
                    -> Node -> Instance.Instance -> Int
371
calcNewFreeSpindles _ (Node {exclStorage = False}) _ = 0
372
calcNewFreeSpindles act n@(Node {exclStorage = True}) i =
373
  case Instance.getTotalSpindles i of
374
    Nothing -> if act
375
               then -1 -- Force a spindle error, so the instance don't go here
376
               else fSpindles n -- No change, as we aren't sure
377
    Just s -> (if act then (-) else (+)) (fSpindles n) s
359 378

  
360 379
-- | Assigns an instance to a node as primary and update the used VCPU
361 380
-- count, utilisation data and tags map.
......
365 384
                  , pCpu = fromIntegral new_count / tCpu t
366 385
                  , utilLoad = utilLoad t `T.addUtil` Instance.util inst
367 386
                  , pTags = addTags (pTags t) (Instance.exclTags inst)
368
                  , instSpindles = calcSpindleUse t inst
387
                  , instSpindles = calcSpindleUse True t inst
369 388
                  }
370 389
  where new_count = Instance.applyIfOnline inst (+ Instance.vcpus inst)
371 390
                    (uCpu t )
372 391

  
373
-- | Assigns an instance to a node as secondary without other updates.
392
-- | Assigns an instance to a node as secondary and updates disk utilisation.
374 393
setSec :: Node -> Instance.Instance -> Node
375 394
setSec t inst = t { sList = Instance.idx inst:sList t
376 395
                  , utilLoad = old_load { T.dskWeight = T.dskWeight old_load +
377 396
                                          T.dskWeight (Instance.util inst) }
378
                  , instSpindles = calcSpindleUse t inst
397
                  , instSpindles = calcSpindleUse True t inst
379 398
                  }
380 399
  where old_load = utilLoad t
381 400

  
......
403 422
      new_plist = delete iname (pList t)
404 423
      new_mem = incIf i_online (fMem t) (Instance.mem inst)
405 424
      new_dsk = incIf uses_disk (fDsk t) (Instance.dsk inst)
406
      new_spindles = decIf uses_disk (instSpindles t) 1
425
      new_free_sp = calcNewFreeSpindles False t inst
426
      new_inst_sp = calcSpindleUse False t inst
407 427
      new_mp = fromIntegral new_mem / tMem t
408 428
      new_dp = computePDsk new_dsk (tDsk t)
409 429
      new_failn1 = new_mem <= rMem t
......
414 434
       , failN1 = new_failn1, pMem = new_mp, pDsk = new_dp
415 435
       , uCpu = new_ucpu, pCpu = new_rcpu, utilLoad = new_load
416 436
       , pTags = delTags (pTags t) (Instance.exclTags inst)
417
       , instSpindles = new_spindles
437
       , instSpindles = new_inst_sp, fSpindles = new_free_sp
418 438
       }
419 439

  
420 440
-- | Removes a secondary instance.
......
426 446
      pnode = Instance.pNode inst
427 447
      new_slist = delete iname (sList t)
428 448
      new_dsk = incIf uses_disk cur_dsk (Instance.dsk inst)
429
      new_spindles = decIf uses_disk (instSpindles t) 1
449
      new_free_sp = calcNewFreeSpindles False t inst
450
      new_inst_sp = calcSpindleUse False t inst
430 451
      old_peers = peers t
431 452
      old_peem = P.find pnode old_peers
432 453
      new_peem = decIf (Instance.usesSecMem inst) old_peem (Instance.mem inst)
......
446 467
  in t { sList = new_slist, fDsk = new_dsk, peers = new_peers
447 468
       , failN1 = new_failn1, rMem = new_rmem, pDsk = new_dp
448 469
       , pRem = new_prem, utilLoad = new_load
449
       , instSpindles = new_spindles
470
       , instSpindles = new_inst_sp, fSpindles = new_free_sp
450 471
       }
451 472

  
452 473
-- | Adds a primary instance (basic version).
......
470 491
      cur_dsk = fDsk t
471 492
      new_mem = decIf i_online (fMem t) (Instance.mem inst)
472 493
      new_dsk = decIf uses_disk cur_dsk (Instance.dsk inst)
473
      new_spindles = incIf uses_disk (instSpindles t) 1
494
      new_free_sp = calcNewFreeSpindles True t inst
495
      new_inst_sp = calcSpindleUse True t inst
474 496
      new_failn1 = new_mem <= rMem t
475 497
      new_ucpu = incIf i_online (uCpu t) (Instance.vcpus inst)
476 498
      new_pcpu = fromIntegral new_ucpu / tCpu t
......
484 506
       _ | new_mem <= 0 -> Bad T.FailMem
485 507
         | uses_disk && new_dsk <= 0 -> Bad T.FailDisk
486 508
         | uses_disk && mDsk t > new_dp && strict -> Bad T.FailDisk
487
         | uses_disk && new_spindles > hiSpindles t
488
             && strict -> Bad T.FailDisk
509
         | uses_disk && exclStorage t && new_free_sp < 0 -> Bad T.FailSpindles
510
         | uses_disk && new_inst_sp > hiSpindles t && strict -> Bad T.FailDisk
489 511
         | new_failn1 && not (failN1 t) && strict -> Bad T.FailMem
490 512
         | l_cpu >= 0 && l_cpu < new_pcpu && strict -> Bad T.FailCPU
491 513
         | rejectAddTags old_tags inst_tags -> Bad T.FailTags
......
497 519
                     , uCpu = new_ucpu, pCpu = new_pcpu
498 520
                     , utilLoad = new_load
499 521
                     , pTags = addTags old_tags inst_tags
500
                     , instSpindles = new_spindles
522
                     , instSpindles = new_inst_sp
523
                     , fSpindles = new_free_sp
501 524
                     }
502 525
           in Ok r
503 526

  
......
512 535
      old_peers = peers t
513 536
      old_mem = fMem t
514 537
      new_dsk = fDsk t - Instance.dsk inst
515
      new_spindles = instSpindles t + 1
538
      new_free_sp = calcNewFreeSpindles True t inst
539
      new_inst_sp = calcSpindleUse True t inst
516 540
      secondary_needed_mem = if Instance.usesSecMem inst
517 541
                               then Instance.mem inst
518 542
                               else 0
......
530 554
       _ | not (Instance.hasSecondary inst) -> Bad T.FailDisk
531 555
         | new_dsk <= 0 -> Bad T.FailDisk
532 556
         | mDsk t > new_dp && strict -> Bad T.FailDisk
533
         | new_spindles > hiSpindles t && strict -> Bad T.FailDisk
557
         | exclStorage t && new_free_sp < 0 -> Bad T.FailSpindles
558
         | new_inst_sp > hiSpindles t && strict -> Bad T.FailDisk
534 559
         | secondary_needed_mem >= old_mem && strict -> Bad T.FailMem
535 560
         | new_failn1 && not (failN1 t) && strict -> Bad T.FailMem
536 561
         | otherwise ->
......
539 564
                     , peers = new_peers, failN1 = new_failn1
540 565
                     , rMem = new_rmem, pDsk = new_dp
541 566
                     , pRem = new_prem, utilLoad = new_load
542
                     , instSpindles = new_spindles
567
                     , instSpindles = new_inst_sp
568
                     , fSpindles = new_free_sp
543 569
                     }
544 570
           in Ok r
545 571

  

Also available in: Unified diff