Change in vdsm[master]: block: use the contextmanager for mapMetaOffset

Federico Simoncelli fsimonce at redhat.com
Fri Mar 21 18:24:21 UTC 2014


Federico Simoncelli has uploaded a new change for review.

Change subject: block: use the contextmanager for mapMetaOffset
......................................................................

block: use the contextmanager for mapMetaOffset

Change-Id: Id1496238ea4f9a1902f816b20959ce3379e87871
Signed-off-by: Federico Simoncelli <fsimonce at redhat.com>
---
M vdsm/storage/blockSD.py
M vdsm/storage/blockVolume.py
M vdsm/storage/imageRepository/formatConverter.py
3 files changed, 13 insertions(+), 10 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/88/25988/1

diff --git a/vdsm/storage/blockSD.py b/vdsm/storage/blockSD.py
index cac59fa..02c7dfd 100644
--- a/vdsm/storage/blockSD.py
+++ b/vdsm/storage/blockSD.py
@@ -29,6 +29,7 @@
 import time
 import functools
 from collections import namedtuple
+from contextlib import contextmanager
 from operator import itemgetter
 
 from vdsm.config import config
@@ -732,11 +733,15 @@
             newsize = self.metaSize(self.sdUUID)
             lvm.extendLV(self.sdUUID, sd.METADATA, newsize)
 
+    _mdSlotLock = threading.Lock()
+
+    @contextmanager
     def mapMetaOffset(self, vol_name, slotSize):
-        if self.getVersion() in VERS_METADATA_LV:
-            return self.getVolumeMetadataOffsetFromPvMapping(vol_name)
-        else:
-            return self.getFreeMetadataSlot(slotSize)
+        with self._mdSlotLock:
+            if self.getVersion() in VERS_METADATA_LV:
+                yield self.getVolumeMetadataOffsetFromPvMapping(vol_name)
+            else:
+                yield self.getFreeMetadataSlot(slotSize)
 
     def _getOccupiedMetadataSlots(self):
         stripPrefix = lambda s, pfx: s[len(pfx):]
diff --git a/vdsm/storage/blockVolume.py b/vdsm/storage/blockVolume.py
index 36bfa1f..9a7fa81 100644
--- a/vdsm/storage/blockVolume.py
+++ b/vdsm/storage/blockVolume.py
@@ -73,7 +73,6 @@
 class BlockVolume(volume.Volume):
     """ Actually represents a single volume (i.e. part of virtual disk).
     """
-    _tagCreateLock = threading.Lock()
 
     def __init__(self, repoPath, sdUUID, imgUUID, volUUID):
         self.metaoff = None
@@ -169,8 +168,7 @@
                          imgUUID, volUUID, srcImgUUID, srcVolUUID)
             volParent.clone(imgPath, volUUID, volFormat, preallocate)
 
-        with cls._tagCreateLock:
-            mdSlot = dom.mapMetaOffset(volUUID, VOLUME_MDNUMBLKS)
+        with dom.mapMetaOffset(volUUID, VOLUME_MDNUMBLKS) as mdSlot:
             mdTags = ["%s%s" % (TAG_PREFIX_MD, mdSlot),
                       "%s%s" % (TAG_PREFIX_PARENT, srcVolUUID),
                       "%s%s" % (TAG_PREFIX_IMAGE, imgUUID)]
diff --git a/vdsm/storage/imageRepository/formatConverter.py b/vdsm/storage/imageRepository/formatConverter.py
index c701163..11a0039 100644
--- a/vdsm/storage/imageRepository/formatConverter.py
+++ b/vdsm/storage/imageRepository/formatConverter.py
@@ -180,9 +180,9 @@
                       metaOffset, vol.volUUID)
             metaContent = vol.getMetadata()
 
-            with vol._tagCreateLock:
-                newMetaOffset = domain.mapMetaOffset(
-                    vol.volUUID, blockVolume.VOLUME_MDNUMBLKS)
+            with domain.mapMetaOffset(
+                    vol.volUUID, blockVolume.VOLUME_MDNUMBLKS) \
+                    as newMetaOffset:
                 if newMetaOffset > metaMaxSlot:
                     raise se.NoSpaceLeftOnDomain(domain.sdUUID)
 


-- 
To view, visit http://gerrit.ovirt.org/25988
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id1496238ea4f9a1902f816b20959ce3379e87871
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Federico Simoncelli <fsimonce at redhat.com>


More information about the vdsm-patches mailing list