Lock detach_volume

A detach_volume operation may take place during a attach_volume or
delete_instance opertaion. This may lead to a race condition which
would result in an instance going into an error state as the volume
operation is not atomic.

Commit 4c4dc3a6d added the lock around the attach_volume. This
follows that same pattern.

Co-Authored-By: Matthew Booth <mbooth@redhat.com>

Change-Id: I7261135a44f0c2eca4732c8360b9c74b729991a8
Closes-bug: #1662483
(cherry picked from commit 2e4e203c1a)
This commit is contained in:
Gary Kotton 2019-02-13 09:50:14 -08:00 committed by Chris Dent
parent 123d096671
commit 17b3d5734a

View File

@ -5466,10 +5466,14 @@ class ComputeManager(manager.Manager):
and volume.
"""
bdm = objects.BlockDeviceMapping.get_by_volume_and_instance(
context, volume_id, instance.uuid)
self._detach_volume(context, bdm, instance,
attachment_id=attachment_id)
@utils.synchronized(instance.uuid)
def do_detach_volume(context, volume_id, instance, attachment_id):
bdm = objects.BlockDeviceMapping.get_by_volume_and_instance(
context, volume_id, instance.uuid)
self._detach_volume(context, bdm, instance,
attachment_id=attachment_id)
do_detach_volume(context, volume_id, instance, attachment_id)
def _init_volume_connection(self, context, new_volume,
old_volume_id, connector, bdm,