diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 200780819..6b394c54a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,8 +15,6 @@ jobs: fail-fast: false matrix: include: - - python-version: 2.7 - PYTEST_EXTRA_ARGS: "" - python-version: 3.7 PYTEST_EXTRA_ARGS: "--cov" @@ -55,8 +53,6 @@ jobs: fail-fast: false matrix: include: - - python-version: 2.7 - PYTEST_EXTRA_ARGS: "" - python-version: 3.7 PYTEST_EXTRA_ARGS: "--cov" diff --git a/opensvc/drivers/resource/disk/scsireserv/__init__.py b/opensvc/drivers/resource/disk/scsireserv/__init__.py index 8f75a772b..e297269ff 100644 --- a/opensvc/drivers/resource/disk/scsireserv/__init__.py +++ b/opensvc/drivers/resource/disk/scsireserv/__init__.py @@ -233,12 +233,14 @@ def clear(self): r = 0 for d in self.devs: try: - if not self.disk_reserved(d): - continue - r += getattr(self, "disk_clear_reservation")(d) + if self.disk_reserved(d): + r += getattr(self, "disk_clear_reservation")(d) + elif self.disk_registered(d): + r += self.disk_unregister(d) except ex.ScsiPrNotsupported as exc: self.log.warning(str(exc)) continue + return r diff --git a/opensvc/drivers/resource/disk/scsireserv/sg.py b/opensvc/drivers/resource/disk/scsireserv/sg.py index 47761a418..cc19d581d 100644 --- a/opensvc/drivers/resource/disk/scsireserv/sg.py +++ b/opensvc/drivers/resource/disk/scsireserv/sg.py @@ -124,6 +124,7 @@ def read_registrations(self): n_registered += out.count(self.hostid) else: for path in paths: + self.ack_unit_attention(path) ret, out, err = self.read_path_registrations(path) if ret != 0: continue @@ -193,7 +194,10 @@ def disk_unregister(self, disk): if self.use_mpathpersist(disk): return self.mpath_unregister(disk) else: - return self.path_unregister(disk) + ret = 0 + for path in self.devs[disk]: + ret += self.path_unregister(path) + return ret def mpath_unregister(self, disk): self.set_read_only(0) @@ -301,7 +305,16 @@ def disk_clear_reservation(self, disk): if self.use_mpathpersist(disk): return self.mpath_clear_reservation(disk) else: - return self.path_clear_reservation(disk) + ret = self.path_clear_reservation(disk) + if ret == 24: + self.log.warning("clear %s failed, will try clear on sub devs" % disk) + for path in self.devs[disk]: + sub_ret = self.path_clear_reservation(path) + if sub_ret != 0: + self.log.warning("clear %s sub device %s failed" % (disk, path)) + continue + return sub_ret + return ret def mpath_clear_reservation(self, disk): cmd = ["mpathpersist", "--out", "--clear", "--param-rk=" + self.hostid, disk]