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.retry(lambda: util.pread2(['/usr/sbin/multipath', '-f', sid]), maxretry = 3, period = 4) util.retry(lambda: util.pread2(['/usr/sbin/multipath', '-W']), maxretry = 3, period = 4) 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 _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.retry(lambda: util.pread2(['/usr/sbin/multipath', '-f', sid]), maxretry=3, period=4) util.retry(lambda: util.pread2(['/usr/sbin/multipath', '-W']), maxretry=3, period=4) 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 _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 _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 _detach_LUN_bylunid(self, lunid, SCSIid): if not self.attached: raise xs_errors.XenError("SRUnavailable") if self.mpath == "true" and len(SCSIid): self.mpathmodule.reset(SCSIid, True) util.remove_mpathcount_field(self.session, self.host_ref, self.sr_ref, SCSIid) for val in self.adapter: if not self.pathdict.has_key(val): continue rec = self.pathdict[val] path = os.path.join(rec["path"], "LUN%s" % lunid) realpath = os.path.realpath(path) if self.devs.has_key(realpath): util.SMlog("Found key: %s" % realpath) scsiutil.scsi_dev_ctrl(self.devs[realpath], "remove") # Wait for device to disappear if not util.wait_for_nopath(realpath, MAX_LUNID_TIMEOUT): util.SMlog("Device has not disappeared after %d seconds" % MAX_LUNID_TIMEOUT) else: util.SMlog("Device [%s,%s] disappeared" % (realpath, path))
def _detach_LUN_bylunid(self, lunid, SCSIid): if not self.attached: raise xs_errors.XenError('SRUnavailable') if self.mpath == 'true' and len(SCSIid): self.mpathmodule.reset(SCSIid, True) util.remove_mpathcount_field(self.session, self.host_ref, self.sr_ref, SCSIid) for val in self.adapter: if not self.pathdict.has_key(val): continue rec = self.pathdict[val] path = os.path.join(rec['path'],"LUN%s" % lunid) realpath = os.path.realpath(path) if self.devs.has_key(realpath): util.SMlog("Found key: %s" % realpath) scsiutil.scsi_dev_ctrl(self.devs[realpath], 'remove') # Wait for device to disappear if not util.wait_for_nopath(realpath, MAX_LUNID_TIMEOUT): util.SMlog("Device has not disappeared after %d seconds" % \ MAX_LUNID_TIMEOUT) else: util.SMlog("Device [%s,%s] disappeared" % (realpath,path))
def refresh_scsi_channel(channel): DEV_WAIT = 5 util.SMlog("Refreshing channel %s" % channel) util.wait_for_path('/dev/disk/by-scsibus/*-%s*' % channel, DEV_WAIT) LUNs = glob.glob('/dev/disk/by-scsibus/*-%s*' % channel) try: rootdevs = util.dom0_disks() except: util.SMlog("Failed to query root disk, failing operation") return False # a) Find a LUN to issue a Query LUNs command li = [] Query = False for lun in LUNs: try: hbtl = lun.split('-')[-1] h = hbtl.split(':') l=util.pread2(["/usr/bin/sg_luns","-q",lun]).split('\n') li = [] for i in l: if len(i): li.append(int(i[0:4], 16)) util.SMlog("sg_luns query returned %s" % li) Query = True break except: pass if not Query: util.SMlog("Failed to detect or query LUN on Channel %s" % channel) return False # b) Remove stale LUNs current = glob.glob('/dev/disk/by-scsibus/*-%s:%s:%s*' % (h[0],h[1],h[2])) for cur in current: lunID = int(cur.split(':')[-1]) newhbtl = ['',h[0],h[1],h[2],str(lunID)] if os.path.realpath(cur) in rootdevs: # Don't touch the rootdev if lunID in li: li.remove(lunID) continue # Check if LUN is stale, and remove it if not lunID in li: util.SMlog("Stale LUN detected. Removing HBTL: %s" % newhbtl) scsi_dev_ctrl(newhbtl,"remove") util.wait_for_nopath(cur, DEV_WAIT) continue else: li.remove(lunID) # Query SCSIid, check it matches, if not, re-probe cur_SCSIid = os.path.basename(cur).split("-%s:%s:%s" % (h[0],h[1],h[2]))[0] real_SCSIid = getSCSIid(cur) if cur_SCSIid != real_SCSIid: util.SMlog("HBTL %s does not match, re-probing" % newhbtl) scsi_dev_ctrl(newhbtl,"remove") util.wait_for_nopath(cur, DEV_WAIT) scsi_dev_ctrl(newhbtl,"add") util.wait_for_path('/dev/disk/by-scsibus/%s-%s' % (real_SCSIid,hbtl), DEV_WAIT) pass # c) Probe for any LUNs that are not present in the system for l in li: newhbtl = ['',h[0],h[1],h[2],str(l)] util.SMlog("Probing new HBTL: %s" % newhbtl) scsi_dev_ctrl(newhbtl,"add") util.wait_for_path('/dev/disk/by-scsibus/*-%s' % hbtl, DEV_WAIT) return True
def refresh_scsi_channel(channel): DEV_WAIT = 5 util.SMlog("Refreshing channel %s" % channel) util.wait_for_path('/dev/disk/by-scsibus/*-%s*' % channel, DEV_WAIT) LUNs = glob.glob('/dev/disk/by-scsibus/*-%s*' % channel) try: rootdevs = util.dom0_disks() except: util.SMlog("Failed to query root disk, failing operation") return False # a) Find a LUN to issue a Query LUNs command li = [] Query = False for lun in LUNs: try: hbtl = lun.split('-')[-1] h = hbtl.split(':') l = util.pread2(["/usr/bin/sg_luns", "-q", lun]).split('\n') li = [] for i in l: if len(i): li.append(int(i[0:4], 16)) util.SMlog("sg_luns query returned %s" % li) Query = True break except: pass if not Query: util.SMlog("Failed to detect or query LUN on Channel %s" % channel) return False # b) Remove stale LUNs current = glob.glob('/dev/disk/by-scsibus/*-%s:%s:%s*' % (h[0], h[1], h[2])) for cur in current: lunID = int(cur.split(':')[-1]) newhbtl = ['', h[0], h[1], h[2], str(lunID)] if os.path.realpath(cur) in rootdevs: # Don't touch the rootdev if lunID in li: li.remove(lunID) continue # Check if LUN is stale, and remove it if not lunID in li: util.SMlog("Stale LUN detected. Removing HBTL: %s" % newhbtl) scsi_dev_ctrl(newhbtl, "remove") util.wait_for_nopath(cur, DEV_WAIT) continue else: li.remove(lunID) # Check if the device is still present if not os.path.exists(cur): continue # Query SCSIid, check it matches, if not, re-probe cur_SCSIid = os.path.basename(cur).split("-%s:%s:%s" % (h[0], h[1], h[2]))[0] real_SCSIid = getSCSIid(cur) if cur_SCSIid != real_SCSIid: util.SMlog("HBTL %s does not match, re-probing" % newhbtl) scsi_dev_ctrl(newhbtl, "remove") util.wait_for_nopath(cur, DEV_WAIT) scsi_dev_ctrl(newhbtl, "add") util.wait_for_path( '/dev/disk/by-scsibus/%s-%s' % (real_SCSIid, hbtl), DEV_WAIT) pass # c) Probe for any LUNs that are not present in the system for l in li: newhbtl = ['', h[0], h[1], h[2], str(l)] newhbtlstr = "%s:%s:%s:%s" % (h[0], h[1], h[2], str(l)) util.SMlog("Probing new HBTL: %s" % newhbtl) scsi_dev_ctrl(newhbtl, "add") util.wait_for_path('/dev/disk/by-scsibus/*-%s' % newhbtlstr, DEV_WAIT) return True