summaryrefslogtreecommitdiffstats
path: root/nova/compute
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-04-03 14:01:17 +0000
committerGerrit Code Review <review@openstack.org>2013-04-03 14:01:17 +0000
commitf7add7ea8cd2eb1c0cf1b148c53833fc4f85de33 (patch)
tree096f5787f1b8e7dfca9b4a946bf75220fa88acad /nova/compute
parent1d5b10ea7697f94e8eb72b61c599b12f9952a055 (diff)
parent24aacd2c91c73245d444a2460ded1c5c94382f5f (diff)
Merge "Limit the checks for block device becoming available."
Diffstat (limited to 'nova/compute')
-rwxr-xr-xnova/compute/manager.py33
1 files changed, 25 insertions, 8 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 775287192..0c038bf4c 100755
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -673,6 +673,30 @@ class ComputeManager(manager.SchedulerDependentManager):
network_info = network_info.legacy()
return network_info
+ def _await_block_device_map_created(self, context, vol_id, max_tries=30,
+ wait_between=1):
+ # TODO(yamahata): creating volume simultaneously
+ # reduces creation time?
+ # TODO(yamahata): eliminate dumb polling
+ # TODO(harlowja): make the max_tries configurable or dynamic?
+ attempts = 0
+ start = time.time()
+ while attempts < max_tries:
+ volume = self.volume_api.get(context, vol_id)
+ volume_status = volume['status']
+ if volume_status != 'creating':
+ if volume_status != 'available':
+ LOG.warn(_("Volume id: %s finished being created but was"
+ " not set as 'available'"), vol_id)
+ # NOTE(harlowja): return how many attempts were tried
+ return attempts + 1
+ greenthread.sleep(wait_between)
+ attempts += 1
+ # NOTE(harlowja): Should only happen if we ran out of attempts
+ raise exception.VolumeNotCreated(volume_id=vol_id,
+ seconds=int(time.time() - start),
+ attempts=attempts)
+
def _setup_block_device_mapping(self, context, instance, bdms):
"""setup volumes for block device mapping."""
block_device_mapping = []
@@ -705,14 +729,7 @@ class ComputeManager(manager.SchedulerDependentManager):
bdm['snapshot_id'])
vol = self.volume_api.create(context, bdm['volume_size'],
'', '', snapshot)
- # TODO(yamahata): creating volume simultaneously
- # reduces creation time?
- # TODO(yamahata): eliminate dumb polling
- while True:
- volume = self.volume_api.get(context, vol['id'])
- if volume['status'] != 'creating':
- break
- greenthread.sleep(1)
+ self._await_block_device_map_created(context, vol['id'])
self.conductor_api.block_device_mapping_update(
context, bdm['id'], {'volume_id': vol['id']})
bdm['volume_id'] = vol['id']