Skip to content
Snippets Groups Projects
Commit 7e7f6ca2 authored by Iustin Pop's avatar Iustin Pop
Browse files

Experimental support for non-redundant instances

This patch adds experimental support to hbal for non-redundant instances
(i.e.  instances with only one node). They are currently handled as
non-moveable, and as such the algorithm simply ignores them.

Supports needs to be added when reading from RAPI via hscan, and
probably in other corner cases.
parent b33a2243
No related branches found
No related tags found
No related merge requests found
......@@ -85,6 +85,10 @@ data IMove = Failover -- ^ Failover the instance (f)
data Table = Table NodeList InstanceList Score [Placement]
deriving (Show)
-- | Constant node index for a non-moveable instance
noSecondary :: Int
noSecondary = -1
-- General functions
-- | Cap the removal list if needed.
......@@ -475,8 +479,10 @@ checkMove nodes_idx ini_tbl victims =
-- iterate over all instances, computing the best move
best_tbl =
foldl'
(\ step_tbl elem -> compareTables step_tbl $
checkInstanceMove nodes_idx ini_tbl elem)
(\ step_tbl elem ->
if Instance.snode elem == noSecondary then step_tbl
else compareTables step_tbl $
checkInstanceMove nodes_idx ini_tbl elem)
ini_tbl victims
Table _ _ _ best_plc = best_tbl
in
......@@ -716,13 +722,20 @@ fixNodes nl il =
pdx = Instance.pnode inst
sdx = Instance.snode inst
pold = fromJust $ lookup pdx accu
sold = fromJust $ lookup sdx accu
pnew = Node.setPri pold idx
snew = Node.setSec sold idx
ac1 = deleteBy assocEqual (pdx, pold) accu
ac2 = deleteBy assocEqual (sdx, sold) ac1
ac3 = (pdx, pnew):(sdx, snew):ac2
in ac3) nl il
ac2 = (pdx, pnew):ac1
in
if sdx /= noSecondary then
let
sold = fromJust $ lookup sdx accu
snew = Node.setSec sold idx
ac3 = deleteBy assocEqual (sdx, sold) ac2
ac4 = (sdx, snew):ac3
in ac4
else
ac2
) nl il
-- | Compute the longest common suffix of a NameList list that
-- | starts with a dot
......@@ -781,7 +794,8 @@ loadInst :: (Monad m) =>
[(String, Int)] -> [String] -> m (String, Instance.Instance)
loadInst ktn (name:mem:dsk:status:pnode:snode:[]) = do
pidx <- lookupNode pnode name ktn
sidx <- lookupNode snode name ktn
sidx <- (if null snode then return noSecondary
else lookupNode snode name ktn)
vmem <- tryRead name mem
vdsk <- tryRead name dsk
when (sidx == pidx) $ fail $ "Instance " ++ name ++
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment