diff -Nru python-os-brick-1.2.0/debian/changelog python-os-brick-1.2.0/debian/changelog --- python-os-brick-1.2.0/debian/changelog 2016-11-07 23:40:52.000000000 +0800 +++ python-os-brick-1.2.0/debian/changelog 2017-01-25 19:10:52.000000000 +0800 @@ -1,3 +1,10 @@ +python-os-brick (1.2.0-2ubuntu0.2) xenial; urgency=medium + + * d/p/Stop-calling-multipath-r-when-attaching-detaching-iS.patch: Backport + Backport fix for stopping calling 'multipath -r' (LP: #1623700) + + -- Zhang Hua Wed, 25 Jan 2017 19:06:46 +0800 + python-os-brick (1.2.0-2ubuntu0.1) xenial; urgency=medium * d/p/fix-wrong-path-used-in-iscsi-multipath-l.patch: Backport diff -Nru python-os-brick-1.2.0/debian/patches/series python-os-brick-1.2.0/debian/patches/series --- python-os-brick-1.2.0/debian/patches/series 2016-11-07 23:38:55.000000000 +0800 +++ python-os-brick-1.2.0/debian/patches/series 2017-01-25 19:05:13.000000000 +0800 @@ -1,3 +1,4 @@ drop-reno-sphinxext.patch removes-privacy-breach-in-docs.patch fix-wrong-path-used-in-iscsi-multipath-l.patch +Stop-calling-multipath-r-when-attaching-detaching-iS.patch diff -Nru python-os-brick-1.2.0/debian/patches/Stop-calling-multipath-r-when-attaching-detaching-iS.patch python-os-brick-1.2.0/debian/patches/Stop-calling-multipath-r-when-attaching-detaching-iS.patch --- python-os-brick-1.2.0/debian/patches/Stop-calling-multipath-r-when-attaching-detaching-iS.patch 1970-01-01 08:00:00.000000000 +0800 +++ python-os-brick-1.2.0/debian/patches/Stop-calling-multipath-r-when-attaching-detaching-iS.patch 2017-01-25 19:05:13.000000000 +0800 @@ -0,0 +1,192 @@ +From 2513c900c70036e89ec81c97ea4e10c9734d29f9 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 +(cherry picked from commit e591bc78cc01c1171060dc15399a46ff800b49c3) +--- + os_brick/initiator/connector.py | 6 ------ + os_brick/tests/initiator/test_connector.py | 24 ++++++++---------------- + 2 files changed, 8 insertions(+), 22 deletions(-) + +diff --git a/os_brick/initiator/connector.py b/os_brick/initiator/connector.py +index c7eb8bf..185a634 100644 +--- a/os_brick/initiator/connector.py ++++ b/os_brick/initiator/connector.py +@@ -915,7 +915,6 @@ class ISCSIConnector(InitiatorConnector): + 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 +@@ -1226,8 +1225,6 @@ class ISCSIConnector(InitiatorConnector): + 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 = [] +@@ -1295,9 +1292,6 @@ class ISCSIConnector(InitiatorConnector): + 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]) +- + + class FibreChannelConnector(InitiatorConnector): + """Connector class to attach/detach Fibre Channel volumes.""" +diff --git a/os_brick/tests/initiator/test_connector.py b/os_brick/tests/initiator/test_connector.py +index df49787..1f11df2 100644 +--- a/os_brick/tests/initiator/test_connector.py ++++ b/os_brick/tests/initiator/test_connector.py +@@ -570,13 +570,12 @@ class ISCSIConnectorTestCase(ConnectorTestCase): + '_get_target_portals_from_iscsiadm_output') + @mock.patch.object(connector.ISCSIConnector, '_connect_to_iscsi_portal') + @mock.patch.object(connector.ISCSIConnector, '_rescan_iscsi') +- @mock.patch.object(connector.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(connector.ISCSIConnector, '_get_multipath_device_name') + @mock.patch.object(os.path, 'exists', return_value=True) + @mock.patch.object(connector.InitiatorConnector, '_discover_mpath_device') + def test_connect_volume_with_multipath( + self, mock_discover_mpath_device, exists_mock, get_device_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 = FAKE_SCSI_WWN + location = '10.0.2.15:3260' +@@ -710,7 +709,6 @@ class ISCSIConnectorTestCase(ConnectorTestCase): + @mock.patch.object(connector.ISCSIConnector, '_get_multipath_device_map', + return_value={}) + @mock.patch.object(connector.ISCSIConnector, '_get_iscsi_devices') +- @mock.patch.object(connector.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(connector.ISCSIConnector, '_run_multipath') + @mock.patch.object(connector.ISCSIConnector, '_get_multipath_device_name') + @mock.patch.object(connector.ISCSIConnector, '_get_multipath_iqns') +@@ -720,7 +718,7 @@ class ISCSIConnectorTestCase(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_device_name, mock_run_multipath, +- mock_rescan_multipath, mock_iscsi_devices, ++ mock_iscsi_devices, + mock_get_multipath_device_map, mock_devices, mock_exists, + mock_scsi_wwn): + mock_scsi_wwn.return_value = FAKE_SCSI_WWN +@@ -793,13 +791,12 @@ class ISCSIConnectorTestCase(ConnectorTestCase): + @mock.patch.object(connector.ISCSIConnector, '_connect_to_iscsi_portal') + @mock.patch.object(host_driver.HostDriver, 'get_all_block_devices') + @mock.patch.object(connector.ISCSIConnector, '_get_iscsi_devices') +- @mock.patch.object(connector.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(connector.ISCSIConnector, '_run_multipath') + @mock.patch.object(connector.ISCSIConnector, '_get_multipath_device_name') + @mock.patch.object(connector.InitiatorConnector, '_discover_mpath_device') + def test_connect_volume_with_multipath_connecting( + self, mock_discover_mpath_device, mock_device_name, +- mock_run_multipath, mock_rescan_multipath, mock_iscsi_devices, ++ mock_run_multipath, mock_iscsi_devices, + mock_devices, mock_connect, mock_portals, mock_exists, + mock_scsi_wwn): + mock_scsi_wwn.return_value = FAKE_SCSI_WWN +@@ -843,12 +840,11 @@ class ISCSIConnectorTestCase(ConnectorTestCase): + @mock.patch.object(connector.ISCSIConnector, '_connect_to_iscsi_portal') + @mock.patch.object(host_driver.HostDriver, 'get_all_block_devices') + @mock.patch.object(connector.ISCSIConnector, '_get_iscsi_devices') +- @mock.patch.object(connector.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(connector.ISCSIConnector, '_run_multipath') + @mock.patch.object(connector.ISCSIConnector, '_get_multipath_device_name') + def test_connect_volume_multipath_failed_iscsi_login( + self, mock_device_name, mock_run_multipath, +- mock_rescan_multipath, mock_iscsi_devices, mock_devices, ++ mock_iscsi_devices, mock_devices, + mock_connect, mock_portals, mock_exists): + location1 = '10.0.2.15:3260' + location2 = '10.0.3.15:3260' +@@ -977,7 +973,6 @@ class ISCSIConnectorTestCase(ConnectorTestCase): + @mock.patch.object(connector.ISCSIConnector, + '_get_target_portals_from_iscsiadm_output') + @mock.patch.object(connector.ISCSIConnector, '_rescan_iscsi') +- @mock.patch.object(connector.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(connector.ISCSIConnector, '_get_iscsi_devices') + @mock.patch.object(host_driver.HostDriver, 'get_all_block_devices') + @mock.patch.object(connector.ISCSIConnector, +@@ -989,7 +984,7 @@ class ISCSIConnectorTestCase(ConnectorTestCase): + def test_disconnect_volume_multipath_iscsi( + self, exists_mock, multipath_iqn_mock, get_multipath_name_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' +@@ -1012,7 +1007,6 @@ class ISCSIConnectorTestCase(ConnectorTestCase): + @mock.patch.object(connector.ISCSIConnector, + '_get_target_portals_from_iscsiadm_output') + @mock.patch.object(connector.ISCSIConnector, '_rescan_iscsi') +- @mock.patch.object(connector.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(connector.ISCSIConnector, '_get_iscsi_devices') + @mock.patch.object(host_driver.HostDriver, 'get_all_block_devices') + @mock.patch.object(connector.ISCSIConnector, +@@ -1023,7 +1017,7 @@ class ISCSIConnectorTestCase(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' +@@ -1048,7 +1042,6 @@ class ISCSIConnectorTestCase(ConnectorTestCase): + @mock.patch.object(connector.ISCSIConnector, + '_get_target_portals_from_iscsiadm_output') + @mock.patch.object(connector.ISCSIConnector, '_rescan_iscsi') +- @mock.patch.object(connector.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(connector.ISCSIConnector, '_get_iscsi_devices', + return_value=[]) + @mock.patch.object(host_driver.HostDriver, 'get_all_block_devices', +@@ -1058,7 +1051,7 @@ class ISCSIConnectorTestCase(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' +@@ -1077,7 +1070,6 @@ class ISCSIConnectorTestCase(ConnectorTestCase): + @mock.patch.object(connector.ISCSIConnector, + '_get_target_portals_from_iscsiadm_output') + @mock.patch.object(connector.ISCSIConnector, '_rescan_iscsi') +- @mock.patch.object(connector.ISCSIConnector, '_rescan_multipath') + @mock.patch.object(connector.ISCSIConnector, '_get_iscsi_devices') + @mock.patch.object(host_driver.HostDriver, 'get_all_block_devices') + @mock.patch.object(connector.ISCSIConnector, +@@ -1085,7 +1077,7 @@ class ISCSIConnectorTestCase(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' +-- +2.7.4 +