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.

Reply via email to