Also, this is lacking tests (if not covered in the rest of the series). Cheers, Helga
On Tue, 13 Oct 2015 at 13:04 Helga Velroyen <[email protected]> wrote: > On Wed, 7 Oct 2015 at 11:03 'Klaus Aehlig' via ganeti-devel < > [email protected]> wrote: > >> The redundancy level of a group is the number of nodes that can >> sequentially >> fail while still keeping it possible to have all instances on the cluster. >> As per our design, we estimate this level by assuming for an N+1 redundant >> cluster that the worst next failure is that of the biggest node. >> >> Signed-off-by: Klaus Aehlig <[email protected]> >> --- >> Makefile.am | 1 + >> src/Ganeti/HTools/RedundancyLevel.hs | 76 >> ++++++++++++++++++++++++++++++++++++ >> 2 files changed, 77 insertions(+) >> create mode 100644 src/Ganeti/HTools/RedundancyLevel.hs >> >> diff --git a/Makefile.am b/Makefile.am >> index a506296..3c8f909 100644 >> --- a/Makefile.am >> +++ b/Makefile.am >> @@ -952,6 +952,7 @@ HS_LIB_SRCS = \ >> src/Ganeti/HTools/Program/Hsqueeze.hs \ >> src/Ganeti/HTools/Program/Hroller.hs \ >> src/Ganeti/HTools/Program/Main.hs \ >> + src/Ganeti/HTools/RedundancyLevel.hs \ >> src/Ganeti/HTools/Repair.hs \ >> src/Ganeti/HTools/Tags.hs \ >> src/Ganeti/HTools/Tags/Constants.hs \ >> diff --git a/src/Ganeti/HTools/RedundancyLevel.hs >> b/src/Ganeti/HTools/RedundancyLevel.hs >> new file mode 100644 >> index 0000000..efd6a26 >> --- /dev/null >> +++ b/src/Ganeti/HTools/RedundancyLevel.hs >> @@ -0,0 +1,76 @@ >> +{-| Implementation of the computation of the cluster redundancy level >> + >> +-} >> + >> +{- >> + >> +Copyright (C) 2015 Google Inc. >> +All rights reserved. >> + >> +Redistribution and use in source and binary forms, with or without >> +modification, are permitted provided that the following conditions are >> +met: >> + >> +1. Redistributions of source code must retain the above copyright notice, >> +this list of conditions and the following disclaimer. >> + >> +2. Redistributions in binary form must reproduce the above copyright >> +notice, this list of conditions and the following disclaimer in the >> +documentation and/or other materials provided with the distribution. >> + >> +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS >> +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED >> +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A >> PARTICULAR >> +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR >> +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, >> +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, >> +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR >> +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF >> +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING >> +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS >> +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >> + >> +-} >> + >> +module Ganeti.HTools.RedundancyLevel >> + ( redundancy >> + ) where >> + >> +import Control.Applicative (liftA2) >> +import Control.Arrow ((&&&)) >> +import Data.Function (on) >> +import qualified Data.IntMap as IntMap >> +import Data.List (sortBy) >> + >> +import Ganeti.BasicTypes (runListHead) >> +import Ganeti.HTools.AlgorithmParams (AlgorithmOptions) >> +import Ganeti.HTools.GlobalN1 (redundant) >> +import qualified Ganeti.HTools.Cluster as Cluster >> +import qualified Ganeti.HTools.Cluster.Metrics as Metrics >> +import qualified Ganeti.HTools.Container as Container >> +import qualified Ganeti.HTools.Instance as Instance >> +import qualified Ganeti.HTools.Node as Node >> +import Ganeti.Utils (iterateJust) >> + >> +-- | Estimate the level of redundancy of node group given >> +-- by its nodes and instances. >> +redundancy :: AlgorithmOptions -> Node.List -> Instance.List -> Int >> +redundancy _ nl _ | any (liftA2 (&&) Node.offline $ not . null . >> Node.pList) >> + $ IntMap.elems nl = -1 >> +redundancy opts nl il | not $ redundant opts nl il = 0 >> +redundancy opts nl il = >> + let sortedNodes = >> + sortBy (compare `on` ((Node.tMem . snd) &&& fst)) >> + . filter (not . Node.offline . snd) >> + $ IntMap.toAscList nl >> + in case sortedNodes of >> + [] -> 0 >> + (bidx, bNode):_ -> >> + let bNode' = bNode { Node.offline = True } >> + nl' = Container.add bidx bNode' nl >> + ini_cv = Metrics.compCV nl' >> + ini_tbl = Cluster.Table nl' il ini_cv [] >> + Cluster.Table nl'' il' _ _ = >> + runListHead ini_tbl id . reverse >> + $ iterateJust (Cluster.tryBalance opts) ini_tbl >> + in 1 + redundancy opts nl'' il' >> > > consider using more expressive variables names. It takes quite some time > to guess what 'bidx', 'nl', 'ini_cv', 'ini_tbl' are supposed to mean. > > rest LGTM, > thanks > > >> -- >> 2.6.0.rc2.230.g3dd15c0 >> >> -- > > 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. > > -- 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.
