Fix extend_volume error handling.
If the async call to the manager/driver failed, the API still updated the quota and volume size in the DB. Solution is to move these tasks down to the manager, where we know if the extend succeeded. Change-Id: I668fd659830bd6d410be64a1f5116377b08a9e96 Fixes: bug 1201814
This commit is contained in:
@@ -811,41 +811,9 @@ class API(base.Base):
|
||||
"extended: %(new_size)s)") % {'new_size': new_size,
|
||||
'size': volume['size']})
|
||||
raise exception.InvalidInput(reason=msg)
|
||||
try:
|
||||
reservations = QUOTAS.reserve(context, gigabytes=+size_increase)
|
||||
except exception.OverQuota as exc:
|
||||
overs = exc.kwargs['overs']
|
||||
usages = exc.kwargs['usages']
|
||||
quotas = exc.kwargs['quotas']
|
||||
|
||||
def _consumed(name):
|
||||
return (usages[name]['reserved'] + usages[name]['in_use'])
|
||||
|
||||
if 'gigabytes' in overs:
|
||||
msg = _("Quota exceeded for %(s_pid)s, "
|
||||
"tried to extend volume by "
|
||||
"%(s_size)sG, (%(d_consumed)dG of %(d_quota)dG "
|
||||
"already consumed)")
|
||||
LOG.warn(msg % {'s_pid': context.project_id,
|
||||
's_size': size_increase,
|
||||
'd_consumed': _consumed('gigabytes'),
|
||||
'd_quota': quotas['gigabytes']})
|
||||
raise exception.VolumeSizeExceedsAvailableQuota()
|
||||
|
||||
self.update(context, volume, {'status': 'extending'})
|
||||
|
||||
try:
|
||||
self.volume_rpcapi.extend_volume(context, volume, new_size)
|
||||
except Exception:
|
||||
with excutils.save_and_reraise_exception():
|
||||
try:
|
||||
self.update(context, volume, {'status': 'error_extending'})
|
||||
finally:
|
||||
QUOTAS.rollback(context, reservations)
|
||||
|
||||
self.update(context, volume, {'size': new_size})
|
||||
QUOTAS.commit(context, reservations)
|
||||
self.update(context, volume, {'status': 'available'})
|
||||
self.volume_rpcapi.extend_volume(context, volume, new_size)
|
||||
|
||||
|
||||
class HostAPI(base.Base):
|
||||
|
||||
Reference in New Issue
Block a user