[NEW PATCH] BZ#720257 - Resouce manage volume activation properly (via gerrit-bot)

Saggi Mizrahi smizrahi at redhat.com
Tue Jul 26 15:17:33 UTC 2011


New patch submitted by Saggi Mizrahi (smizrahi at redhat.com)

You can review this change at: http://gerrit.usersys.redhat.com/724

commit ceda43f2717b5e7a6ea237bdc6b159fed77900a9
Author: Saggi Mizrahi <smizrahi at redhat.com>
Date:   Mon Jul 18 16:23:28 2011 +0300

    BZ#720257 - Resouce manage volume activation properly
    
    - Instead of using autorelese = False, hsm will save a record of all
    prepare operations so whenever you teardown a volume you know that the
    operation is accounted for.
    - Ignore errors in domain production after release.
    
    Change-Id: Iaf3311790a7927e3bf3d5e7a4820462d213bcdb6

diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index ef472af..558e162 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -18,6 +18,7 @@ from fnmatch import fnmatch
 from copy import deepcopy
 from config import config
 from itertools import imap
+from collections import defaultdict
 
 import sp
 import sd
@@ -139,6 +140,8 @@ class HSM:
         self._cachedStats = {}
         self._statslock = threading.Lock()
 
+        self._preparedVolumes = defaultdict(list)
+
         if not iscsi.isConfigured():
             iscsi.setupiSCSI()
 
@@ -1662,8 +1665,9 @@ class HSM:
 
         vars.task.getSharedLock(STORAGE, sdUUID)
         imageResourcesNamespace = sd.getNamespace(sdUUID, IMAGE_NAMESPACE)
-        imgResource = rmanager.acquireResource(imageResourcesNamespace, imgUUID, rm.LockType.exclusive)
-        imgResource.autoRelease = False
+        lockType = rm.LockType.exclusive if rw else rm.LockType.shared
+
+        imgResource = rmanager.acquireResource(imageResourcesNamespace, imgUUID, lockType)
         try:
             vol = SDF.produce(sdUUID=sdUUID).produceVolume(imgUUID=imgUUID, volUUID=volUUID)
             # NB We want to be sure that at this point HSM does not use stale LVM
@@ -1671,9 +1675,11 @@ class HSM:
             # this refresh later, when we come up with something better.
             vol.refreshVolume()
             vol.prepare(rw=rw)
+
+            self._preparedVolumes[sdUUID + volUUID].append(imgResource)
         except:
             self.log.error("Prepare volume %s in domain %s failed", volUUID, sdUUID, exc_info=True)
-            rmanager.releaseResource(imageResourcesNamespace, imgUUID)
+            imgResource.release()
             raise
 
 
@@ -1690,18 +1696,22 @@ class HSM:
         :type imgUUID: UUID
         :param volUUID: The UUID of the volume you want to teardown.
         :type volUUID: UUID
-        :param rw: Should the voulme be set as RW. ?
-        :type rw: bool
+        :param rw: deprecated
         :param options: ?
         """
-        self.validatePoolSD(spUUID, sdUUID)
-
         vars.task.getSharedLock(STORAGE, sdUUID)
-        volclass = SDF.produce(sdUUID).getVolumeClass()
-        volclass.teardown(sdUUID=sdUUID, volUUID=volUUID)
-        imageResourcesNamespace = sd.getNamespace(sdUUID, IMAGE_NAMESPACE)
-        rmanager.releaseResource(imageResourcesNamespace, imgUUID)
+        try:
+            imgResource = self._preparedVolumes[sdUUID + volUUID].pop()
+        except IndexError:
+            raise se.VolumeWasNotPreparedBeforeTeardown()
 
+        imgResource.release()
+
+        try:
+            volclass = SDF.produce(sdUUID).getVolumeClass()
+            volclass.teardown(sdUUID=sdUUID, volUUID=volUUID)
+        except Exception:
+            self.log.warn("Problem tearing down volume", exc_info=True)
 
     def public_getVolumesList(self, sdUUID, spUUID, imgUUID=volume.BLANK_UUID, options = None):
         """
diff --git a/vdsm/storage/resourceFactories.py b/vdsm/storage/resourceFactories.py
index ce3ec70..0948084 100644
--- a/vdsm/storage/resourceFactories.py
+++ b/vdsm/storage/resourceFactories.py
@@ -36,7 +36,9 @@ class LvmActivation(object):
     def __init__(self, vg, lv, lockType):
         self._vg = vg
         self._lv = lv
+
         lvm.activateLVs(self._vg, self._lv)
+        self.switchLockType(lockType)
 
     def close(self):
         try:
diff --git a/vdsm/storage/storage_exception.py b/vdsm/storage/storage_exception.py
index c9df109..1496bbc 100644
--- a/vdsm/storage/storage_exception.py
+++ b/vdsm/storage/storage_exception.py
@@ -245,6 +245,10 @@ class createVolumeSizeError(StorageException):
     code = 229
     message = "Requested size is too small. Must be larger or equal to 1"
 
+class VolumeWasNotPreparedBeforeTeardown(StorageException):
+    code = 230
+    message = "Volume was not prepared before being torn down"
+
 #################################################
 #  Images Exceptions
 #################################################




More information about the vdsm-patches mailing list