Change in vdsm[master]: clusterLock: Acquire, release, and inquire volume leases

alitke at redhat.com alitke at redhat.com
Wed Mar 11 18:34:12 UTC 2015


Adam Litke has uploaded a new change for review.

Change subject: clusterLock: Acquire, release, and inquire volume leases
......................................................................

clusterLock: Acquire, release, and inquire volume leases

Although we have been creating volume leases on storage for awhile now,
there have been no APIs to manage them.  Add this support to
the clusterLock implementations.

Change-Id: Icca901ccd27358767c023cd55b7a3823531d2a5a
Signed-off-by: Adam Litke <alitke at redhat.com>
---
M vdsm/storage/clusterlock.py
M vdsm/storage/sd.py
2 files changed, 80 insertions(+), 23 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/22/38622/1

diff --git a/vdsm/storage/clusterlock.py b/vdsm/storage/clusterlock.py
index 51d2906..4077068 100644
--- a/vdsm/storage/clusterlock.py
+++ b/vdsm/storage/clusterlock.py
@@ -73,6 +73,10 @@
     """Raised when the clusterlock class is not supporting inquire"""
 
 
+class ResourceLeasesNotSupportedError(Exception):
+    """Raised when the clusterlock class does not support resource leases"""
+
+
 class SafeLease(object):
     log = logging.getLogger("Storage.SafeLease")
 
@@ -145,7 +149,13 @@
                 raise se.AcquireLockFailure(self._sdUUID, rc, out, err)
             self.log.debug("Clustered lock acquired successfully")
 
+    def acquireResource(self, resource, lockDisk, shared=False):
+        raise ResourceLeasesNotSupportedError()
+
     def inquire(self):
+        raise InquireNotSupportedError()
+
+    def inquireResource(self, resource, lockDisk):
         raise InquireNotSupportedError()
 
     def getLockUtilFullPath(self):
@@ -165,6 +175,8 @@
 
             self.log.debug("Cluster lock released successfully")
 
+    def releaseResource(self, resource, lockDisk):
+        raise ResourceLeasesNotSupportedError()
 
 initSANLockLog = logging.getLogger("Storage.initSANLock")
 
@@ -286,13 +298,9 @@
         # HOST_FAIL.
         return HOST_STATUS_FREE
 
-    # 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.
-    def acquire(self, hostId):
+    def _acquire(self, resource, lockDisk, shared=False):
         with nested(self._lock, SANLock._sanlock_lock):
-            self.log.info("Acquiring cluster lock for domain %s (id: %s)",
-                          self._sdUUID, hostId)
+            self.log.info("Acquiring resource %s, shared=%s", resource, shared)
 
             while True:
                 if SANLock._sanlock_fd is None:
@@ -304,27 +312,42 @@
                             "Cannot register to sanlock", str(e))
 
                 try:
-                    sanlock.acquire(self._sdUUID, SDM_LEASE_NAME,
-                                    self.getLockDisk(),
-                                    slkfd=SANLock._sanlock_fd)
+                    sanlock.acquire(self._sdUUID, resource, lockDisk,
+                                    slkfd=SANLock._sanlock_fd, shared=shared)
                 except sanlock.SanlockException as e:
                     if e.errno != os.errno.EPIPE:
                         raise se.AcquireLockFailure(
                             self._sdUUID, e.errno,
-                            "Cannot acquire cluster lock", str(e))
+                            "Cannot acquire sanlock resource", str(e))
                     SANLock._sanlock_fd = None
                     continue
 
                 break
 
-            self.log.debug("Cluster lock for domain %s successfully acquired "
-                           "(id: %s)", self._sdUUID, hostId)
+            self.log.debug("Resource %s successfully acquired", resource)
+
+    # 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.
+    def acquire(self, hostId):
+        self.log.info("Acquiring cluster lock for domain %s (id: %s)",
+                      self._sdUUID, hostId)
+        self._acquire(SDM_LEASE_NAME, self.getLockDisk())
+        self.log.debug("Cluster lock for domain %s successfully acquired "
+                       "(id: %s)", self._sdUUID, hostId)
+
+    def acquireResource(self, resource, lockDisk, shared=False):
+        self._acquire(resource, lockDisk, shared)
+        res, owners = self._inquire(resource, lockDisk)
+        self.log.debug("ALITKE: acquire: res:%s owners:%s", res, owners)
+
+    def _inquire(self, resource, lockDisk):
+        res = sanlock.read_resource(*lockDisk[0])
+        owners = sanlock.read_resource_owners(self._sdUUID, resource, lockDisk)
+        return res, owners
 
     def inquire(self):
-        resource = sanlock.read_resource(self._leasesPath, SDM_LEASE_OFFSET)
-        owners = sanlock.read_resource_owners(self._sdUUID, SDM_LEASE_NAME,
-                                              self.getLockDisk())
-
+        resource, owners = self._inquire(SDM_LEASE_NAME, self.getLockDisk())
         if len(owners) == 1:
             return resource.get("version"), owners[0].get("host_id")
         elif len(owners) > 1:
@@ -334,19 +357,32 @@
 
         return None, None
 
-    def release(self):
+    def inquireResource(self, resource, lockDisk):
+        resource, owners = self._inquire(SDM_LEASE_NAME, self.getLockDisk())
+        return (resource.get("version"),
+                [owner.get("host_id") for owner in owners])
+
+    def _release(self, resource, lockDisk):
         with self._lock:
-            self.log.info("Releasing cluster lock for domain %s", self._sdUUID)
+            self.log.info("Releasing resource %s", resource)
 
             try:
-                sanlock.release(self._sdUUID, SDM_LEASE_NAME,
-                                self.getLockDisk(), slkfd=SANLock._sanlock_fd)
+                sanlock.release(self._sdUUID, resource, lockDisk,
+                                slkfd=SANLock._sanlock_fd)
             except sanlock.SanlockException as e:
-                raise se.ReleaseLockFailure(self._sdUUID, e)
+                raise se.ReleaseLockFailure(resource, e)
 
             self._sanlockfd = None
-            self.log.debug("Cluster lock for domain %s successfully released",
-                           self._sdUUID)
+            self.log.debug("Resource %s successfully released", resource)
+
+    def release(self):
+        self.log.info("Releasing cluster lock for domain %s", self._sdUUID)
+        self._release(SDM_LEASE_NAME, self.getLockDisk())
+        self.log.debug("Cluster lock for domain %s successfully released",
+                       self._sdUUID)
+
+    def releaseResource(self, resource, lockDisk):
+        self._release(resource, lockDisk)
 
 
 class LocalLock(object):
@@ -462,10 +498,16 @@
         self.log.debug("Local lock for domain %s successfully acquired "
                        "(id: %s)", self._sdUUID, hostId)
 
+    def acquireResource(self, resource, lockDisk, shared=False):
+        raise ResourceLeasesNotSupportedError()
+
     def inquire(self):
         with self._globalLockMapSync:
             hostId, lockFile = self._getLease()
             return self.LVER, hostId if lockFile else None, None
+
+    def inquireResource(self, resource, lockDisk):
+        raise InquireNotSupportedError()
 
     def release(self):
         with self._globalLockMapSync:
@@ -483,3 +525,6 @@
 
             self.log.debug("Local lock for domain %s successfully released",
                            self._sdUUID)
+
+    def releaseResource(self, resource, lockDisk):
+        raise ResourceLeasesNotSupportedError()
\ No newline at end of file
diff --git a/vdsm/storage/sd.py b/vdsm/storage/sd.py
index a771abf..9e6f281 100644
--- a/vdsm/storage/sd.py
+++ b/vdsm/storage/sd.py
@@ -514,6 +514,18 @@
     def inquireClusterLock(self):
         return self._clusterLock.inquire()
 
+    def acquireVolumeLease(self, imgUUID, volUUID, shared=False):
+        lockDisk = self.getVolumeLease(imgUUID, volUUID)
+        self._clusterLock.acquireResource(volUUID, [lockDisk], shared)
+
+    def releaseVolumeLease(self, imgUUID, volUUID):
+        lockDisk = self.getVolumeLease(imgUUID, volUUID)
+        self._clusterLock.releaseResource(volUUID, [lockDisk])
+
+    def inquireVolumeLease(self, imgUUID, volUUID):
+        lockDisk = self.getVolumeLease(imgUUID, volUUID)
+        return self._clusterLock.inquireResource(volUUID, [lockDisk])
+
     def attach(self, spUUID):
         self.invalidateMetadata()
         pools = self.getPools()


-- 
To view, visit https://gerrit.ovirt.org/38622
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Icca901ccd27358767c023cd55b7a3823531d2a5a
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Adam Litke <alitke at redhat.com>


More information about the vdsm-patches mailing list