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.
