def probe(self): if self.mpath == "true" and self.dconf.has_key('SCSIid'): # When multipathing is enabled, since we don't refcount the multipath maps, # we should not attempt to do the iscsi.attach/detach when the map is already present, # as this will remove it (which may well be in use). maps = [] try: maps = mpath_cli.list_maps() except: pass if self.dconf['SCSIid'] in maps: if (mpp_luncheck.is_RdacLun(self.dconf['SCSIid'])): mpath_cli.remove_map(self.dconf['SCSIid']) else: raise xs_errors.XenError('SRInUse') else: if (mpp_luncheck.is_RdacLun(self.dconf['SCSIid'])): link=glob.glob('/dev/disk/mpInuse/%s-*' % self.dconf['SCSIid']) if (len(link)): raise xs_errors.XenError('SRInUse') self.mpathmodule.refresh(self.SCSIid,0) try: self._pathrefresh(LVHDoHBASR) result = LVHDSR.LVHDSR.probe(self) if self.mpath == "true": self.mpathmodule.reset(self.SCSIid,True) return result except: if self.mpath == "true": self.mpathmodule.reset(self.SCSIid,True) raise
def _resetDMP(sid,explicit_unmap=False): # If mpath has been turned on since the sr/vdi was attached, we # might be trying to unmap it before the daemon has been started # This is unnecessary (and will fail) so just return. deactivate_MPdev(sid) if not _is_mpath_daemon_running(): util.SMlog("Warning: Trying to unmap mpath device when multipathd not running") return # If the multipath daemon is running, but we were initially plugged # with multipathing set to no, there may be no map for us in the multipath # tables. In that case, list_paths will return [], but remove_map might # throw an exception. Catch it and ignore it. if explicit_unmap: util.SMlog("Explicit unmap") devices = mpath_cli.list_paths(sid) try: mpath_cli.remove_map(sid) except: util.SMlog("Warning: Removing the path failed") pass for device in devices: mpath_cli.remove_path(device) else: mpath_cli.ensure_map_gone(sid) path = "/dev/mapper/%s" % sid if not util.wait_for_nopath(path, 10): util.SMlog("MPATH: WARNING - path did not disappear [%s]" % path) else: util.SMlog("MPATH: path disappeared [%s]" % path)
def probe(self): if self.mpath == "true" and self.dconf.has_key('SCSIid'): # When multipathing is enabled, since we don't refcount the multipath maps, # we should not attempt to do the iscsi.attach/detach when the map is already present, # as this will remove it (which may well be in use). maps = [] try: maps = mpath_cli.list_maps() except: pass if self.dconf['SCSIid'] in maps: if (mpp_luncheck.is_RdacLun(self.dconf['SCSIid'])): mpath_cli.remove_map(self.dconf['SCSIid']) else: raise xs_errors.XenError('SRInUse') else: if (mpp_luncheck.is_RdacLun(self.dconf['SCSIid'])): link = glob.glob('/dev/disk/mpInuse/%s-*' % self.dconf['SCSIid']) if (len(link)): raise xs_errors.XenError('SRInUse') self.mpathmodule.refresh(self.SCSIid, 0) try: self._pathrefresh(LVHDoHBASR) result = LVHDSR.LVHDSR.probe(self) if self.mpath == "true": self.mpathmodule.reset(self.SCSIid, True) return result except: if self.mpath == "true": self.mpathmodule.reset(self.SCSIid, True) raise
def _resetDMP(sid, explicit_unmap=False, delete_nodes=False): # If mpath has been turned on since the sr/vdi was attached, we # might be trying to unmap it before the daemon has been started # This is unnecessary (and will fail) so just return. deactivate_MPdev(sid) if not _is_mpath_daemon_running(): util.SMlog( "Warning: Trying to unmap mpath device when multipathd not running" ) return # If the multipath daemon is running, but we were initially plugged # with multipathing set to no, there may be no map for us in the multipath # tables. In that case, list_paths will return [], but remove_map might # throw an exception. Catch it and ignore it. if explicit_unmap: util.SMlog("Explicit unmap") # Remove map from conf file, if any try: wwid_conf.edit_wwid(sid, True) except: util.SMlog("WARNING: exception raised while attempting to" " modify multipath.conf") try: mpath_cli.reconfigure() except: util.SMlog("WARNING: exception raised while attempting to" " reconfigure") time.sleep(5) devices = mpath_cli.list_paths(sid) try: mpath_cli.remove_map(sid) except: util.SMlog("Warning: Removing the path failed") pass for device in devices: mpath_cli.remove_path(device) if delete_nodes: _delete_node(device) else: mpath_cli.ensure_map_gone(sid) path = "/dev/mapper/%s" % sid if not util.wait_for_nopath(path, 10): util.SMlog("MPATH: WARNING - path did not disappear [%s]" % path) else: util.SMlog("MPATH: path disappeared [%s]" % path)
def remove(scsi_id): paths=mpath_cli.list_paths(scsi_id) mpath_cli.remove_map(scsi_id) for path in paths: mpath_cli.remove_path(path)