On Tue, Feb 18, 2014 at 3:39 PM, Hrvoje Ribicic <[email protected]> wrote:

> To start off the introduction of oppportunistic locking during instance
> creation, this patch adds the options allowing the locking to be
> invoked.
>
> Signed-off-by: Hrvoje Ribicic <[email protected]>
> ---
>  src/Ganeti/Constants.hs |  9 +++++++++
>  tools/move-instance     | 26 ++++++++++++++++++++++++++
>  2 files changed, 35 insertions(+)
>
> diff --git a/src/Ganeti/Constants.hs b/src/Ganeti/Constants.hs
> index 7f8cfd1..d44e1fd 100644
> --- a/src/Ganeti/Constants.hs
> +++ b/src/Ganeti/Constants.hs
> @@ -3211,6 +3211,15 @@ iallocatorSearchPath = AutoConf.iallocatorSearchPath
>  defaultIallocatorShortcut :: String
>  defaultIallocatorShortcut = "."
>
> +-- * Opportunistic allocator usage
> +
> +-- | Time delay in seconds between repeated opportunistic instance
> creations.
> +-- Rather than failing with an informative error message if the
> opportunistic
> +-- creation cannot grab enough nodes, for some uses it is better to retry
> the
> +-- creation with an interval between attempts. This is a reasonable
> default.
> +defaultOpportunisticRetryInterval :: Int
> +defaultOpportunisticRetryInterval = 10
> +
>  -- * Node evacuation
>
>  nodeEvacPri :: String
> diff --git a/tools/move-instance b/tools/move-instance
> index 7ff8c4b..aa5e83d 100755
> --- a/tools/move-instance
> +++ b/tools/move-instance
> @@ -126,6 +126,19 @@ PARALLEL_OPT = \
>                   dest="parallel", metavar="<number>",
>                   help="Number of instances to be moved simultaneously")
>
> +OPPORTUNISTIC_TRIES_OPT = \
> +  cli.cli_option("--opportunistic-tries", action="store", type="int",
> +                 default=0, dest="opportunistic_tries",
> metavar="<number>",
> +                 help="Number of opportunistic instance creation attempts"
> +                      " before a normal creation is performed")
> +
> +OPPORTUNISTIC_DELAY_OPT = \
> +  cli.cli_option("--opportunistic-delay", action="store", type="int",
> +                 default=constants.DEFAULT_OPPORTUNISTIC_RETRY_INTERVAL,
> +                 dest="opportunistic_delay", metavar="<number>",
> +                 help="The delay between successive opportunistic
> instance"
> +                      " creation attempts, in seconds")
> +
>
>  class Error(Exception):
>    """Generic error.
> @@ -800,6 +813,8 @@ def ParseOptions():
>    parser.add_option(DEST_DISK_TEMPLATE_OPT)
>    parser.add_option(COMPRESS_OPT)
>    parser.add_option(PARALLEL_OPT)
> +  parser.add_option(OPPORTUNISTIC_TRIES_OPT)
> +  parser.add_option(OPPORTUNISTIC_DELAY_OPT)
>
>    (options, args) = parser.parse_args()
>
> @@ -831,6 +846,17 @@ def CheckOptions(parser, options, args):
>        bool(options.dest_primary_node or options.dest_secondary_node)):
>      parser.error("Destination node and iallocator options exclude each
> other")
>
> +  if (not options.iallocator and (options.opportunistic_tries > 0)):
> +    parser.error("Opportunistic instance creation can only be used with
> an"
> +                 " iallocator")
> +
> +  if options.opportunistic_tries < 0:
> +    parser.error("Number of opportunistic creation attempts must be >= 0")
> +
> +  if options.opportunistic_delay <= 0:
> +    parser.error("The delay between two successive creation attempts must
> be"
> +                 " greater than zero")
> +
>    if len(instance_names) == 1:
>      # Moving one instance only
>      if options.hvparams:
> --
> 1.9.0.rc1.175.g0b1dcb5
>
>
I'd add a check that if a user specifies --opportunistic-delay but
not --opportunistic-tries, the command fails with an error. Otherwise the
user might get confused why the retries aren't happening.

Reply via email to