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@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)