Stop calling multipath -r when attaching/detaching iSCSI volumes

Looking into this more there isn't any documented reason why we do this,
and on Ubuntu 16.04 there are issues with timing and devices/symlinks
getting messed up when we do the reload of device maps. We shouldn't
need to be forcing multipathd to do this, it loads devices on its own.

We'll leave in the one in 'wait_for_rw(..)' for now because there is
some evidence that you may need to call it to update the rw state of
the multipath devices, see:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise
_Linux/6/html/Storage_Administration_Guide/ch37s04s02.html

Change-Id: Iec58284abdc9bcbf99df5d07289bb9d60a3554d7
Closes-Bug: #1623700
This commit is contained in:
Patrick East 2016-09-21 15:05:48 -07:00
parent c2bad1f400
commit e591bc78cc
2 changed files with 9 additions and 23 deletions

View File

@ -466,7 +466,6 @@ class ISCSIConnector(base.BaseLinuxConnector, base_iscsi.BaseISCSIConnector):
target_lun(s) - LUN id of the volume
"""
if self.use_multipath:
self._rescan_multipath()
host_device = multipath_device = None
host_devices = self._get_device_path(connection_properties)
# Choose an accessible host device
@ -770,8 +769,6 @@ class ISCSIConnector(base.BaseLinuxConnector, base_iscsi.BaseISCSIConnector):
props['target_iqn'] = iqn
self._disconnect_from_iscsi_portal(props)
self._rescan_multipath()
def _get_multipath_iqns(self, multipath_devices, mpath_map):
entries = self._get_iscsi_devices()
iqns = []
@ -838,6 +835,3 @@ class ISCSIConnector(base.BaseLinuxConnector, base_iscsi.BaseISCSIConnector):
check_exit_code=[0, 1, 21, 255])
self._run_iscsiadm_bare(('-m', 'session', '--rescan'),
check_exit_code=[0, 1, 21, 255])
def _rescan_multipath(self):
self._run_multipath(['-r'], check_exit_code=[0, 1, 21])

View File

@ -407,12 +407,11 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase):
'_get_target_portals_from_iscsiadm_output')
@mock.patch.object(iscsi.ISCSIConnector, '_connect_to_iscsi_portal')
@mock.patch.object(iscsi.ISCSIConnector, '_rescan_iscsi')
@mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath')
@mock.patch.object(os.path, 'exists', return_value=True)
@mock.patch.object(base.BaseLinuxConnector, '_discover_mpath_device')
def test_connect_volume_with_multipath(
self, mock_discover_mpath_device, exists_mock,
rescan_multipath_mock, rescan_iscsi_mock, connect_to_mock,
rescan_iscsi_mock, connect_to_mock,
portals_mock, iscsiadm_mock, mock_iscsi_wwn):
mock_iscsi_wwn.return_value = test_connector.FAKE_SCSI_WWN
location = '10.0.2.15:3260'
@ -587,7 +586,6 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase):
@mock.patch.object(iscsi.ISCSIConnector, '_get_multipath_device_map',
return_value={})
@mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices')
@mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath')
@mock.patch.object(iscsi.ISCSIConnector, '_run_multipath')
@mock.patch.object(iscsi.ISCSIConnector, '_get_multipath_iqns')
@mock.patch.object(iscsi.ISCSIConnector, '_run_iscsiadm')
@ -596,8 +594,8 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase):
def test_connect_volume_with_multiple_portals_primary_error(
self, mock_process_lun_id, mock_discover_mpath_device,
mock_iscsiadm, mock_get_iqn, mock_run_multipath,
mock_rescan_multipath, mock_iscsi_devices,
mock_get_multipath_device_map, mock_devices, mock_exists,
mock_iscsi_devices, mock_get_multipath_device_map,
mock_devices, mock_exists,
mock_scsi_wwn):
mock_scsi_wwn.return_value = test_connector.FAKE_SCSI_WWN
location1 = '10.0.2.15:3260'
@ -668,12 +666,11 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase):
@mock.patch.object(iscsi.ISCSIConnector, '_connect_to_iscsi_portal')
@mock.patch.object(host_driver.HostDriver, 'get_all_block_devices')
@mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices')
@mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath')
@mock.patch.object(iscsi.ISCSIConnector, '_run_multipath')
@mock.patch.object(base.BaseLinuxConnector, '_discover_mpath_device')
def test_connect_volume_with_multipath_connecting(
self, mock_discover_mpath_device, mock_run_multipath,
mock_rescan_multipath, mock_iscsi_devices, mock_devices,
mock_iscsi_devices, mock_devices,
mock_connect, mock_portals, mock_exists, mock_scsi_wwn):
mock_scsi_wwn.return_value = test_connector.FAKE_SCSI_WWN
location1 = '10.0.2.15:3260'
@ -715,10 +712,9 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase):
@mock.patch.object(iscsi.ISCSIConnector, '_connect_to_iscsi_portal')
@mock.patch.object(host_driver.HostDriver, 'get_all_block_devices')
@mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices')
@mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath')
@mock.patch.object(iscsi.ISCSIConnector, '_run_multipath')
def test_connect_volume_multipath_failed_iscsi_login(
self, mock_run_multipath, mock_rescan_multipath,
self, mock_run_multipath,
mock_iscsi_devices, mock_devices,
mock_connect, mock_portals, mock_exists):
location1 = '10.0.2.15:3260'
@ -819,7 +815,6 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase):
@mock.patch.object(iscsi.ISCSIConnector,
'_get_target_portals_from_iscsiadm_output')
@mock.patch.object(iscsi.ISCSIConnector, '_rescan_iscsi')
@mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath')
@mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices')
@mock.patch.object(host_driver.HostDriver, 'get_all_block_devices')
@mock.patch.object(iscsi.ISCSIConnector,
@ -829,7 +824,7 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase):
def test_disconnect_volume_multipath_iscsi(
self, exists_mock, multipath_iqn_mock, disconnect_mock,
get_all_devices_mock, get_iscsi_devices_mock,
rescan_multipath_mock, rescan_iscsi_mock, get_portals_mock,
rescan_iscsi_mock, get_portals_mock,
get_multipath_device_map_mock):
iqn1 = 'iqn.2013-01.ro.com.netapp:node.netapp01'
iqn2 = 'iqn.2013-01.ro.com.netapp:node.netapp02'
@ -852,7 +847,6 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase):
@mock.patch.object(iscsi.ISCSIConnector,
'_get_target_portals_from_iscsiadm_output')
@mock.patch.object(iscsi.ISCSIConnector, '_rescan_iscsi')
@mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath')
@mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices')
@mock.patch.object(host_driver.HostDriver, 'get_all_block_devices')
@mock.patch.object(iscsi.ISCSIConnector,
@ -863,7 +857,7 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase):
def test_disconnect_volume_multipath_iscsi_other_targets(
self, exists_mock, multipath_iqn_mock, get_multipath_map_mock,
disconnect_mock, get_all_devices_mock, get_iscsi_devices_mock,
rescan_multipath_mock, rescan_iscsi_mock, get_portals_mock):
rescan_iscsi_mock, get_portals_mock):
iqn1 = 'iqn.2010-10.org.openstack:target-1'
iqn2 = 'iqn.2010-10.org.openstack:target-2'
portal = '10.0.0.1:3260'
@ -888,7 +882,6 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase):
@mock.patch.object(iscsi.ISCSIConnector,
'_get_target_portals_from_iscsiadm_output')
@mock.patch.object(iscsi.ISCSIConnector, '_rescan_iscsi')
@mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath')
@mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices',
return_value=[])
@mock.patch.object(host_driver.HostDriver, 'get_all_block_devices',
@ -898,7 +891,7 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase):
@mock.patch.object(os.path, 'exists', return_value=True)
def test_disconnect_volume_multipath_iscsi_without_other_mp_devices(
self, exists_mock, disconnect_mock, get_all_devices_mock,
get_iscsi_devices_mock, rescan_multipath_mock, rescan_iscsi_mock,
get_iscsi_devices_mock, rescan_iscsi_mock,
get_portals_mock, get_multipath_device_map_mock):
portal = '10.0.2.15:3260'
name = 'volume-00000001'
@ -917,7 +910,6 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase):
@mock.patch.object(iscsi.ISCSIConnector,
'_get_target_portals_from_iscsiadm_output')
@mock.patch.object(iscsi.ISCSIConnector, '_rescan_iscsi')
@mock.patch.object(iscsi.ISCSIConnector, '_rescan_multipath')
@mock.patch.object(iscsi.ISCSIConnector, '_get_iscsi_devices')
@mock.patch.object(host_driver.HostDriver, 'get_all_block_devices')
@mock.patch.object(iscsi.ISCSIConnector,
@ -925,7 +917,7 @@ class ISCSIConnectorTestCase(test_connector.ConnectorTestCase):
@mock.patch.object(os.path, 'exists', return_value=False)
def test_disconnect_volume_multipath_iscsi_with_invalid_symlink(
self, exists_mock, disconnect_mock, get_all_devices_mock,
get_iscsi_devices_mock, rescan_multipath_mock, rescan_iscsi_mock,
get_iscsi_devices_mock, rescan_iscsi_mock,
get_portals_mock, get_multipath_device_map_mock):
# Simulate a broken symlink by returning False for os.path.exists(dev)
portal = '10.0.0.1:3260'