Nir Soffer has uploaded a new change for review. Change subject: multipath: Fix devices rescanning ......................................................................
multipath: Fix devices rescanning When rescanning devices, we used to update ISCSI devices, and then run multipath to update device mapping. However, we never rescanned FC devices. Since commit dbf2089488 (Jul 9 2013) multipath call was change to use the -r flag, forcing a reload of the device map. This was tested to fix a case where new lun is created on the storage server, while a host was connected, and the new device is not available when issuing the getDeviceList command. According to a comment on gerrit, the change was tested for ISCSI and FC storage types, but there is no documentation of the testing procedure. The related bug has no information about what was tested. We currently have two bugs related multipath rescanning: - Bug 1078879 tell us that invoking multipath with the -r flag sometimes triggers a segfault in the multipathd daemon. In the bug, multipath developer suggests that as long as multipathd daemon is running, there is no need to invoke multipath to detect new devices, and "multipath -r really isn't useful for much of anything". - Bug 1071654 tell us that devices rescanning is broken on FC storage domains (although the -r flag is used). The bug suggest to use issue_lip sysfs api, which is also recommended in the RHEL storage administration manual. This patch removes the -r flag, which seem to be useless currently, and adds the missing FC rescan using the recommended sysfs api. To be on the safe side, I left the multipath call as it was since the first multipath commit in 2009. We will work with kernel and multipath developers further on removing this call if it is indeed unneeded. Bug-Url: https://bugzilla.redhat.com/1078879 Bug-Url: https://bugzilla.redhat.com/1071654 Relates-to: http://gerrit.ovirt.org/17263 Change-Id: I7699504f9771232ee0b880f9c83a51fd5b90f40e Signed-off-by: Nir Soffer <nsof...@redhat.com> --- M vdsm/storage/hba.py M vdsm/storage/multipath.py M vdsm/supervdsmServer 3 files changed, 34 insertions(+), 3 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/22/27122/1 diff --git a/vdsm/storage/hba.py b/vdsm/storage/hba.py index da3feef..050bec5 100644 --- a/vdsm/storage/hba.py +++ b/vdsm/storage/hba.py @@ -36,6 +36,31 @@ NODE_NAME = "node_name" +def rescan(): + """ + Rescan HBAs connections, updating available devices. + + This operation performs a Loop Initialization Protocol (LIP) and then + scans the interconnect and causes the SCSI layer to be updated to reflect + the devices currently on the bus. A LIP is, essentially, a bus reset, and + will cause device addition and removal. + + Bear in mind that issue_lip is an asynchronous operation. The command may + complete before the entire scan has completed. + + Note: Must be executed as root. + TODO: Some drivers do not support this operation. + """ + log.info("Rescanning HBAs") + for path in glob.glob(FC_HOST_MASK + '/issue_lip'): + log.debug("Issuing lip %s", path) + try: + with open(path, 'w') as f: + f.write('1') + except IOError as e: + logging.error("Error issuing lip: %s", e) + + def getiSCSIInitiators(): """ Get iSCSI initiator name from the default location. diff --git a/vdsm/storage/multipath.py b/vdsm/storage/multipath.py index 82d435d..ba98866 100644 --- a/vdsm/storage/multipath.py +++ b/vdsm/storage/multipath.py @@ -102,12 +102,12 @@ Should only be called from hsm._rescanDevices() """ - # First ask iSCSI to rescan all its sessions + # First rescan iSCSI and FCP connections iscsi.rescan() + supervdsm.getProxy().hbaRescan() # Now let multipath daemon pick up new devices - cmd = [constants.EXT_MULTIPATH, "-r"] - misc.execCmd(cmd, sudo=True) + misc.execCmd([constants.EXT_MULTIPATH], sudo=True) def isEnabled(): diff --git a/vdsm/supervdsmServer b/vdsm/supervdsmServer index ffcedb8..dc6f602 100755 --- a/vdsm/supervdsmServer +++ b/vdsm/supervdsmServer @@ -58,6 +58,8 @@ from network import sourceroutethread from network.api import (addNetwork, delNetwork, editNetwork, setupNetworks, setSafeNetworkConfig) + +from storage import hba from network.tc import setPortMirroring, unsetPortMirroring from storage.multipath import getScsiSerial as _getScsiSerial from storage.iscsi import getDevIscsiInfo as _getdeviSCSIinfo @@ -253,6 +255,10 @@ return setSafeNetworkConfig() @logDecorator + def hbaRescan(self): + return hba.rescan() + + @logDecorator def udevTrigger(self, guid): self.__udevReloadRules(guid) cmd = [EXT_UDEVADM, 'trigger', '--verbose', '--action', 'change', -- To view, visit http://gerrit.ovirt.org/27122 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7699504f9771232ee0b880f9c83a51fd5b90f40e Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Nir Soffer <nsof...@redhat.com> _______________________________________________ vdsm-patches mailing list vdsm-patches@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches