From e591bc78cc01c1171060dc15399a46ff800b49c3 Mon Sep 17 00:00:00 2001 From: Patrick East Date: Wed, 21 Sep 2016 15:05:48 -0700 Subject: [PATCH] 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 --- os_brick/initiator/connectors/iscsi.py | 6 ----- .../tests/initiator/connectors/test_iscsi.py | 26 +++++++------------ 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/os_brick/initiator/connectors/iscsi.py b/os_brick/initiator/connectors/iscsi.py index d126523d0..091d43623 100644 --- a/os_brick/initiator/connectors/iscsi.py +++ b/os_brick/initiator/connectors/iscsi.py @@ -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]) diff --git a/os_brick/tests/initiator/connectors/test_iscsi.py b/os_brick/tests/initiator/connectors/test_iscsi.py index 8f09d7151..2ca448faf 100644 --- a/os_brick/tests/initiator/connectors/test_iscsi.py +++ b/os_brick/tests/initiator/connectors/test_iscsi.py @@ -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'