From 080476b2d383b148f6fc8d202c3b0509f9bb1d66 Mon Sep 17 00:00:00 2001 From: "Walter A. Boring IV" Date: Wed, 15 May 2013 16:00:43 -0700 Subject: Fix dangling LUN issue under load with multipath This fixes an issue where not all of the LUNs are seen by the kernel at attach time, but later become available. We now rescan the list of devices seen by multipath at detach time. Also added another unit test case. Fixes Bug: #1175366 Change-Id: Id5b313b17454ec32672373b7b564b9450466b7a2 --- nova/virt/libvirt/volume.py | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'nova/virt') diff --git a/nova/virt/libvirt/volume.py b/nova/virt/libvirt/volume.py index 34fd9c772..4a11e2704 100644 --- a/nova/virt/libvirt/volume.py +++ b/nova/virt/libvirt/volume.py @@ -753,6 +753,7 @@ class LibvirtFibreChannelVolumeDriver(LibvirtBaseVolumeDriver): % {'device': mdev_info['device']}) device_path = mdev_info['device'] connection_info['data']['devices'] = mdev_info['devices'] + connection_info['data']['multipath_id'] = mdev_info['id'] else: # we didn't find a multipath device. # so we assume the kernel only sees 1 device @@ -774,6 +775,15 @@ class LibvirtFibreChannelVolumeDriver(LibvirtBaseVolumeDriver): self).disconnect_volume(connection_info, mount_device) devices = connection_info['data']['devices'] + # If this is a multipath device, we need to search again + # and make sure we remove all the devices. Some of them + # might not have shown up at attach time. + if 'multipath_id' in connection_info['data']: + multipath_id = connection_info['data']['multipath_id'] + mdev_info = linuxscsi.find_multipath_device(multipath_id) + devices = mdev_info['devices'] + LOG.debug("devices to remove = %s" % devices) + # There may have been more than 1 device mounted # by the kernel for this volume. We have to remove # all of them -- cgit