commit 84460d5a8a059e4d5d96b58b854f3bfd267f007a
Merge: 5705bba a56d29a
Author: Klaus Aehlig <[email protected]>
Date: Tue Mar 31 15:10:44 2015 +0200
Merge branch 'stable-2.11' into stable-2.12
* stable-2.11
(no changes)
* stable-2.10
Fixed typos
Pass correct params in move-instance
In CanTieredAlloc test set IPolicy
Make genInstanceMaybeBiggerThanNode honor policy lower bound
Also export a null ISpec
Support instance generation within ranges
Add a function to leave the list monad
Conflicts:
tools/move-instance
Resolution:
manually apply 6f918cb2c97 to version on 2.12
diff --cc tools/move-instance
index 087fd3f,4450758..728b3bf
--- a/tools/move-instance
+++ b/tools/move-instance
@@@ -490,58 -454,18 +490,58 @@@ class MoveDestExecutor(object)
logging.info("Creating instance %s in remote-import mode",
mrt.move.dest_instance_name)
- job_id = self._CreateInstance(dest_client, mrt.move.dest_instance_name,
- mrt.move.dest_pnode, mrt.move.dest_snode,
- mrt.move.compress,
- mrt.move.dest_iallocator,
- mrt.move.dest_disk_template,
- mrt.src_instinfo, mrt.src_expinfo,
- mrt.move.hvparams, mrt.move.beparams,
- mrt.move.osparams, mrt.move.nics)
- mrt.PollJob(dest_client, job_id,
- remote_import_fn=compat.partial(self._SetImportInfo, mrt))
-
- logging.info("Import successful")
+
+ # Depending on whether opportunistic tries are enabled, we may have to
+ # make multiple creation attempts
+ creation_attempts = [True] * mrt.move.opportunistic_tries
+
+ # But the last one is never opportunistic, and will block until completion
+ # or failure
+ creation_attempts.append(False)
+
+ # Initiate the RNG for the variations
+ random.seed()
+
+ for is_attempt_opportunistic in creation_attempts:
+ job_id = self._CreateInstance(dest_client, mrt.move.dest_instance_name,
+ mrt.move.dest_pnode, mrt.move.dest_snode,
+ mrt.move.compress,
+ mrt.move.dest_iallocator,
+ mrt.move.dest_disk_template,
+ mrt.src_instinfo, mrt.src_expinfo,
+ mrt.move.hvparams, mrt.move.beparams,
- mrt.move.beparams, mrt.move.nics,
++ mrt.move.osparams, mrt.move.nics,
+ is_attempt_opportunistic
+ )
+
+ try:
+ # The completion of this block signifies that the import has been
+ # completed successfullly
+ mrt.PollJob(dest_client, job_id,
+ remote_import_fn=compat.partial(self._SetImportInfo, mrt))
+ logging.info("Import successful")
+ return
+ except errors.OpPrereqError, err:
+ # Any exception in the non-opportunistic creation is to be passed on,
+ # as well as exceptions apart from resources temporarily unavailable
+ if not is_attempt_opportunistic or \
+ err.args[1] != rapi.client.ECODE_TEMP_NORES:
+ raise
+
+ delay_to_use = MoveDestExecutor._VaryDelay(mrt)
+ logging.info("Opportunistic attempt unsuccessful, waiting %.2f seconds"
+ " before another creation attempt is made",
+ delay_to_use)
+ time.sleep(delay_to_use)
+
+ @staticmethod
+ def _VaryDelay(mrt):
+ """ Varies the opportunistic delay by a small amount.
+
+ """
+ MAX_VARIATION = 0.15
+ variation_factor = (1.0 + random.uniform(-MAX_VARIATION, MAX_VARIATION))
+ return mrt.move.opportunistic_delay * variation_factor
@staticmethod
def _SetImportInfo(mrt, impinfo):
--
Klaus Aehlig
Google Germany GmbH, Dienerstr. 12, 80331 Muenchen
Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschaeftsfuehrer: Graham Law, Christine Elizabeth Flores