Hi! On Wed, 7 Oct 2015 at 11:03 'Klaus Aehlig' via ganeti-devel < [email protected]> wrote:
> For each group, make hcheck compute and report the redundancy level; also > report the cluster redundancy level as the minimum over all those levels. > I think it would be good to mention somewhere that the level is the integer that is named as "M" in the design. Otherwise one might wonder if it is the same or not. > > Signed-off-by: Klaus Aehlig <[email protected]> > --- > src/Ganeti/HTools/Program/Hcheck.hs | 31 +++++++++++++++++++------------ > 1 file changed, 19 insertions(+), 12 deletions(-) > > diff --git a/src/Ganeti/HTools/Program/Hcheck.hs > b/src/Ganeti/HTools/Program/Hcheck.hs > index 4bf4401..3dcfa89 100644 > --- a/src/Ganeti/HTools/Program/Hcheck.hs > +++ b/src/Ganeti/HTools/Program/Hcheck.hs > @@ -53,8 +53,8 @@ import qualified Ganeti.HTools.GlobalN1 as GlobalN1 > import qualified Ganeti.HTools.Group as Group > import qualified Ganeti.HTools.Node as Node > import qualified Ganeti.HTools.Instance as Instance > - > import qualified Ganeti.HTools.Program.Hbal as Hbal > +import Ganeti.HTools.RedundancyLevel (redundancy) > > import Ganeti.Common > import Ganeti.HTools.CLI > @@ -112,7 +112,7 @@ data Level = GroupLvl String -- ^ Group level, with > name > type GroupInfo = (Gdx, (Node.List, Instance.List)) > > -- | A type alias for group stats. > -type GroupStats = ((Group.Group, Double), [Int]) > +type GroupStats = ((Group.Group, Double, Int), [Int]) > > -- | Prefix for machine readable names. > htcPrefix :: String > @@ -131,10 +131,12 @@ commonData opts = > -- | Data showed per group. > groupData :: Options -> [(String, String)] > groupData opts = commonData opts ++ [("SCORE", "Group score")] > + ++ [("REDUNDANCY", "Group redundancy level")] > > -- | Data showed per cluster. > clusterData :: Options -> [(String, String)] > clusterData opts = commonData opts ++ > + [ ("REDUNDANCY", "Cluster redundancy level") ] ++ > [ ("NEED_REBALANCE", "Cluster is not healthy") ] > > -- | Phase-specific prefix for machine readable version. > @@ -222,9 +224,9 @@ extractGroupData True grp = show $ Group.idx grp > extractGroupData False grp = Group.name grp > > -- | Prepare values for group. > -prepareGroupValues :: [Int] -> Double -> [String] > -prepareGroupValues stats score = > - map show stats ++ [printf "%.8f" score] > +prepareGroupValues :: [Int] -> Double -> Int -> [String] > +prepareGroupValues stats score rLvl = > + map show stats ++ [printf "%.8f" score] ++ [show rLvl] > > -- | Prepare values for cluster. > prepareClusterValues :: Bool -> [Int] -> [Bool] -> [String] > @@ -233,15 +235,15 @@ prepareClusterValues machineread stats bstats = > > -- | Print all the statistics on a group level. > printGroupStats :: Options -> Bool -> Phase -> GroupStats -> IO () > -printGroupStats opts machineread phase ((grp, score), stats) = do > - let values = prepareGroupValues stats score > +printGroupStats opts machineread phase ((grp, score, rLvl), stats) = do > I'd spare a few more characters and name rLvl to something more readable, like redundancyLevel etc. > + let values = prepareGroupValues stats score rLvl > extradata = extractGroupData machineread grp > printStats opts machineread (GroupLvl extradata) phase values > > -- | Print all the statistics on a cluster (global) level. > -printClusterStats :: Options -> Bool -> Phase -> [Int] -> Bool -> IO () > -printClusterStats opts machineread phase stats needhbal = do > - let values = prepareClusterValues machineread stats [needhbal] > +printClusterStats :: Options -> Bool -> Phase -> [Int] -> Bool -> Int -> > IO () > +printClusterStats opts machineread phase stats needhbal gRed = do > + let values = prepareClusterValues machineread (stats ++ [gRed]) > [needhbal] > printStats opts machineread ClusterLvl phase values > > -- | Check if any of cluster metrics is non-zero. > @@ -264,13 +266,14 @@ perGroupChecks opts gl (gidx, (nl, il)) = > offline_pri = sum . map length $ map Node.pList offnl > offline_sec = length $ map Node.sList offnl > score = Metrics.compCV nl > + rLvl = redundancy (fromCLIOptions opts) nl il > groupstats = [ n1violated > , conflicttags > , offline_pri > , offline_sec > ] > ++ [ gn1fail | optCapacity opts ] > - in ((grp, score), groupstats) > + in ((grp, score, rLvl), groupstats) > > -- | Use Hbal's iterateDepth to simulate group rebalance. > executeSimulation :: Options -> Cluster.Table -> Double > @@ -328,6 +331,7 @@ main opts args = do > > let groupsstats = map (perGroupChecks opts gl) splitcluster > clusterstats = map sum . transpose . map snd $ groupsstats > + globalRedundancy = minimum $ map (\((_, _, r), _) -> r) groupsstats > needrebalance = clusterNeedsRebalance clusterstats > > unless (verbose < 1 || machineread) . > @@ -340,6 +344,7 @@ main opts args = do > mapM_ (printGroupStats opts machineread Initial) groupsstats > > printClusterStats opts machineread Initial clusterstats needrebalance > + globalRedundancy > > let exitOK = nosimulation || not needrebalance > simulate = not nosimulation && needrebalance > @@ -349,12 +354,14 @@ main opts args = do > when (simulate || machineread) $ do > let newgroupstats = map (perGroupChecks opts gl) rebalancedcluster > newclusterstats = map sum . transpose . map snd $ newgroupstats > + newGlobalRedundancy = minimum $ map (\((_, _, r), _) -> r) > + newgroupstats > newneedrebalance = clusterNeedsRebalance clusterstats > > mapM_ (printGroupStats opts machineread Rebalanced) newgroupstats > > printClusterStats opts machineread Rebalanced newclusterstats > - newneedrebalance > + newneedrebalance newGlobalRedundancy > > printFinalHTC machineread > > -- > 2.6.0.rc2.230.g3dd15c0 > > rest LGTM -- Helga Velroyen Software Engineer [email protected] Google Germany GmbH Dienerstraße 12 80331 München Geschäftsführer: Matthew Scott Sucherman, Paul Terence Manicle Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg Diese E-Mail ist vertraulich. Wenn Sie nicht der richtige Adressat sind, leiten Sie diese bitte nicht weiter, informieren Sie den Absender und löschen Sie die E-Mail und alle Anhänge. Vielen Dank. This e-mail is confidential. If you are not the right addressee please do not forward it, please inform the sender, and please erase this e-mail including any attachments. Thanks.
