iSCSI detect multipath DM with no WWN
If udev rules are slow (or don't happen) and they don't generate the symlinks we use to detect the WWN, or if we just fail to find the WWN we end up not detecting the iSCSI multipath even if it is present in the system. With this patch we no longer wait to find the WWN before trying to locate the multipath device. This means that as long as the multipath daemon is able to generate the multipath we will be able to return a multipath device path to the caller. Closes-Bug: 1881619 Change-Id: Ic48bd9ac408c56073e58168df7e74e4b949ac2f2
This commit is contained in:
parent
08c609ceba
commit
63f52be546
@ -738,10 +738,10 @@ class ISCSIConnector(base.BaseLinuxConnector, base_iscsi.BaseISCSIConnector):
|
||||
# We have devices but we don't know the wwn yet
|
||||
if not wwn and found:
|
||||
wwn = self._linuxscsi.get_sysfs_wwn(found)
|
||||
# We have the wwn but not a multipath
|
||||
if wwn and not mpath:
|
||||
if not mpath and found:
|
||||
mpath = self._linuxscsi.find_sysfs_multipath_dm(found)
|
||||
if not (mpath or wwn_added):
|
||||
# We have the wwn but not a multipath
|
||||
if wwn and not(mpath or wwn_added):
|
||||
# Tell multipathd that this wwn is a multipath and hint
|
||||
# multipathd to recheck all the devices we have just
|
||||
# connected. We only do this once, since for any new
|
||||
|
@ -1211,6 +1211,42 @@ Setting up iSCSI targets: unused
|
||||
self.assertGreaterEqual(find_dm_mock.call_count, 2)
|
||||
self.assertEqual(4, connect_mock.call_count)
|
||||
|
||||
@mock.patch.object(linuxscsi.LinuxSCSI, 'find_sysfs_multipath_dm',
|
||||
side_effect=[None, 'dm-0'])
|
||||
@mock.patch.object(linuxscsi.LinuxSCSI, 'get_sysfs_wwn', return_value='')
|
||||
@mock.patch.object(linuxscsi.LinuxSCSI, 'multipath_add_path')
|
||||
@mock.patch.object(linuxscsi.LinuxSCSI, 'multipath_add_wwid')
|
||||
@mock.patch.object(iscsi.ISCSIConnector, '_connect_vol')
|
||||
@mock.patch('os_brick.utils._time_sleep')
|
||||
def test_connect_multipath_volume_no_wwid(self, sleep_mock, connect_mock,
|
||||
add_wwid_mock, add_path_mock,
|
||||
get_wwn_mock, find_dm_mock):
|
||||
# Even if we don't have the wwn we'll be able to find the multipath
|
||||
def my_connect(rescans, props, data):
|
||||
devs = {'tgt1': 'sda', 'tgt2': 'sdb', 'tgt3': 'sdc', 'tgt4': 'sdd'}
|
||||
data['stopped_threads'] += 1
|
||||
data['num_logins'] += 1
|
||||
dev = devs[props['target_iqn']]
|
||||
data['found_devices'].append(dev)
|
||||
data['just_added_devices'].append(dev)
|
||||
|
||||
connect_mock.side_effect = my_connect
|
||||
|
||||
res = self.connector._connect_multipath_volume(self.CON_PROPS)
|
||||
|
||||
expected = {'type': 'block', 'scsi_wwn': '', 'multipath_id': '',
|
||||
'path': '/dev/dm-0'}
|
||||
self.assertEqual(expected, res)
|
||||
|
||||
self.assertEqual(2, get_wwn_mock.call_count)
|
||||
result = list(get_wwn_mock.call_args[0][0])
|
||||
result.sort()
|
||||
self.assertEqual(['sda', 'sdb', 'sdc', 'sdd'], result)
|
||||
add_wwid_mock.assert_not_called()
|
||||
add_path_mock.assert_not_called()
|
||||
self.assertGreaterEqual(find_dm_mock.call_count, 2)
|
||||
self.assertEqual(4, connect_mock.call_count)
|
||||
|
||||
@mock.patch.object(linuxscsi.LinuxSCSI, 'find_sysfs_multipath_dm',
|
||||
side_effect=[None, 'dm-0'])
|
||||
@mock.patch.object(linuxscsi.LinuxSCSI, 'get_sysfs_wwn',
|
||||
|
@ -0,0 +1,6 @@
|
||||
---
|
||||
fixes:
|
||||
- |
|
||||
Improve iSCSI multipath detection to work even if we cannot find the
|
||||
volume's WWN in sysfs.
|
||||
(bug 1881619).
|
Loading…
Reference in New Issue
Block a user