New patch submitted by Saggi Mizrahi (smizrahi(a)redhat.com)
You can review this change at:
http://gerrit.usersys.redhat.com/724
commit 09c7acb7099810e7730055e8715e0f4b2f7be780
Author: Saggi Mizrahi <smizrahi(a)redhat.com>
Date: Mon Jul 18 16:23:28 2011 +0300
BZ#720257 - Don't produce domain on teardown
Change-Id: Iaf3311790a7927e3bf3d5e7a4820462d213bcdb6
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index a6de936..4154724 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._preparedResources = defaultdict(list)
+
if not iscsi.isConfigured():
iscsi.setupiSCSI()
@@ -166,7 +169,6 @@ class HSM:
for spUUID in dirList:
poolPath = os.path.join(self.storage_repository, spUUID)
try:
- vars.task.getSharedLock(STORAGE, spUUID)
if os.path.exists(poolPath):
self._restorePool(spUUID)
#TODO Once we support simultaneous connection to multiple pools,
remove following line (break)
@@ -1662,19 +1664,12 @@ class HSM:
vars.task.getSharedLock(STORAGE, sdUUID)
imageResourcesNamespace = sd.getNamespace(sdUUID, IMAGE_NAMESPACE)
- imgResource = rmanager.acquireResource(imageResourcesNamespace, imgUUID,
rm.LockType.exclusive)
- imgResource.autoRelease = False
- 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
- # cache info, so we call refresh explicitely. We may want to remove
- # this refresh later, when we come up with something better.
- vol.refreshVolume()
- vol.prepare(rw=rw)
- except:
- self.log.error("Prepare volume %s in domain %s failed", volUUID,
sdUUID, exc_info=True)
- rmanager.releaseResource(imageResourcesNamespace, imgUUID)
- raise
+ lockType = rm.LockType.exclusive
+ if not rw:
+ lockType = rm.LockType.shared
+
+ imgResource = rmanager.acquireResource(imageResourcesNamespace, imgUUID,
lockType)
+ self._preparedVolumes[sdUUID + volUUID].append(imgResource)
def public_teardownVolume(self, sdUUID, spUUID, imgUUID, volUUID, rw=False, options =
None):
@@ -1694,14 +1689,13 @@ class HSM:
:type rw: bool
: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()
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..99990c8 100644
--- a/vdsm/storage/resourceFactories.py
+++ b/vdsm/storage/resourceFactories.py
@@ -36,7 +36,14 @@ class LvmActivation(object):
def __init__(self, vg, lv, lockType):
self._vg = vg
self._lv = lv
+
lvm.activateLVs(self._vg, self._lv)
+ rw = self._translateLockType(lockType)
+ lvm.setrwLV(self._vg, self._lv, rw)
+
+ @staticmethod
+ def _translateLockType(lockType):
+ return False if lockType == rm.LockType.shared else True
def close(self):
try:
@@ -48,7 +55,7 @@ class LvmActivation(object):
log.warn("Failure deactivate LV %s/%s (%s)", self._vg, self._lv,
e)
def switchLockType(self, lockType):
- rw = False if lockType == rm.LockType.shared else True
+ rw = self._translateLockType(lockType)
lvm.setrwLV(self._vg, self._lv, rw)
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
#################################################