Nir Soffer has uploaded a new change for review. Change subject: fencing: Introduce getHostStatus internal API ......................................................................
fencing: Introduce getHostStatus internal API When fencing another host, we like to check if the other host has access to storage, to prevent unwanted fencing of a lively host. This patch adds an internal API for getting another host status on monitored domains. The new getHostStatus API returns a dictionary of monitored domains UUIDs and host status code on each domain. The caller will apply a fencing policy using this data to decide if host is lively enough to prevent fencing. Change-Id: Iccd62e58a194aa0ceb0f5e2503b8ec7e4349971b Signed-off-by: Nir Soffer <[email protected]> --- M vdsm/storage/clusterlock.py M vdsm/storage/domainMonitor.py M vdsm/storage/hsm.py M vdsm/storage/sd.py 4 files changed, 43 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/73/28873/1 diff --git a/vdsm/storage/clusterlock.py b/vdsm/storage/clusterlock.py index 6ca3e03..a23919e 100644 --- a/vdsm/storage/clusterlock.py +++ b/vdsm/storage/clusterlock.py @@ -91,6 +91,9 @@ def hasHostId(self, hostId): return True + def getHostStatus(self, hostId): + return sanlock.HOST_UNKNOWN + def acquire(self, hostID): leaseTimeMs = self._leaseTimeSec * 1000 ioOpTimeoutMs = self._ioOpTimeoutSec * 1000 @@ -225,6 +228,19 @@ "status, returning False", exc_info=True) return False + def getHostStatus(self, hostId): + try: + # Note: get_hosts has of-by-one bug when asking for particular host + # id, so get all and filter. + hosts = sanlock.get_hosts(self._sdUUID) + except sanlock.SanlockException as e: + self.log.debug("Error getting host status: %s", e) + else: + for info in hosts: + if info['host_id'] == hostId: + return info['flags'] + return sanlock.HOST_UNKNOWN + # The hostId parameter is maintained here only for compatibility with # ClusterLock. We could consider to remove it in the future but keeping it # for logging purpose is desirable. @@ -358,6 +374,9 @@ currentHostId, lockFile = self._getLease() return currentHostId == hostId + def getHostStatus(self, hostId): + return sanlock.HOST_UNKNOWN + def acquire(self, hostId): with self._globalLockMapSync: self.log.info("Acquiring local lock for domain %s (id: %s)", diff --git a/vdsm/storage/domainMonitor.py b/vdsm/storage/domainMonitor.py index 8a50b4f..5f4a086 100644 --- a/vdsm/storage/domainMonitor.py +++ b/vdsm/storage/domainMonitor.py @@ -21,6 +21,7 @@ from threading import Thread, Event from time import time import weakref +import sanlock import logging import misc @@ -121,6 +122,12 @@ def getStatus(self, sdUUID): return self._domains[sdUUID].getStatus() + def getHostStatus(self, hostId): + status = {} + for sdUUID, monitor in self._domains.items(): + status[sdUUID] = monitor.getHostStatus(hostId) + return status + def close(self): self.log.info("Stopping domain monitors") for sdUUID in self._domains.keys(): @@ -160,6 +167,11 @@ def getStatus(self): return self.status.copy() + def getHostStatus(self, hostId): + if self.domain: + return self.domain.getHostStatus(hostId) + return sanlock.HOST_UNKNOWN + @utils.traceback(on=log.name) def _monitorLoop(self): self.log.debug("Starting domain monitor for %s", self.sdUUID) diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py index 36076c2..647a277 100644 --- a/vdsm/storage/hsm.py +++ b/vdsm/storage/hsm.py @@ -3614,3 +3614,12 @@ with rmanager.acquireResource(STORAGE, HSM_DOM_MON_LOCK, rm.LockType.exclusive): self.domainMonitor.stopMonitoring(sdUUID) + + @public + def getHostStatus(self, hostId): + """ + Returns host status on monitored domains. + + Warning: Internal use only. + """ + return {'host_status': self.domainMonitor.getHostStatus(hostId)} diff --git a/vdsm/storage/sd.py b/vdsm/storage/sd.py index a868f38..34952d7 100644 --- a/vdsm/storage/sd.py +++ b/vdsm/storage/sd.py @@ -481,6 +481,9 @@ def hasHostId(self, hostId): return self._clusterLock.hasHostId(hostId) + def getHostStatus(self, hostId): + return self._clusterLock.getHostStatus(hostId) + def hasVolumeLeases(self): domVersion = self.getVersion() try: -- To view, visit http://gerrit.ovirt.org/28873 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iccd62e58a194aa0ceb0f5e2503b8ec7e4349971b Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Nir Soffer <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
