[NEW PATCH] BZ#716833 - Fix race in metadata offset computation during simultaneously volume creation in block storage domain (via gerrit-bot)
Igor Lvovsky
ilvovsky at redhat.com
Tue Jun 28 13:33:41 UTC 2011
New patch submitted by Igor Lvovsky (ilvovsky at redhat.com)
You can review this change at: http://gerrit.usersys.redhat.com/626
commit 12d9edd17f301e587d64480fc1ef7510790787d8
Author: Igor Lvovsky <ilvovsky at redhat.com>
Date: Mon Jun 27 21:51:26 2011 +0300
BZ#716833 - Fix race in metadata offset computation during simultaneously volume creation in block storage domain
Change-Id: I94af85026809f3a776f664c88197bdcbe1a1e3bd
diff --git a/vdsm/storage/blockSD.py b/vdsm/storage/blockSD.py
index 6f68d49..214e8a4 100644
--- a/vdsm/storage/blockSD.py
+++ b/vdsm/storage/blockSD.py
@@ -506,7 +506,7 @@ class BlockStorageDomain(sd.StorageDomain):
break
if offset is None:
- self.log.warn("Could not find mapping for lv %s", lv.name)
+ self.log.warn("Could not find mapping for lv %s/%s", self.sdUUID, lv.name)
continue
if size is None:
@@ -533,6 +533,7 @@ class BlockStorageDomain(sd.StorageDomain):
freeSlot = offset + size
+ self.log.debug("Found freeSlot %s in VG %s", freeSlot, self.sdUUID)
return freeSlot
def getVolumeMetadataOffsetFromPvMapping(self, vol_name):
diff --git a/vdsm/storage/blockVolume.py b/vdsm/storage/blockVolume.py
index d2d6044..ae411be 100644
--- a/vdsm/storage/blockVolume.py
+++ b/vdsm/storage/blockVolume.py
@@ -10,6 +10,7 @@
import os.path
import uuid
+import threading
from config import config
import storage_exception as se
@@ -42,6 +43,8 @@ rmanager = rm.ResourceManager.getInstance()
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
volume.Volume.__init__(self, repoPath, sdUUID, imgUUID, volUUID)
@@ -201,12 +204,14 @@ class BlockVolume(volume.Volume):
raise
try:
- offs = mysd.mapMetaOffset(volUUID)
+ with cls._tagCreateLock:
+ offs = mysd.mapMetaOffset(volUUID)
+ lvm.addLVTags(sdUUID, volUUID, ("%s%s" % (TAG_PREFIX_MD, offs),
+ "%s%s" % (TAG_PREFIX_PARENT, srcVolUUID,),
+ "%s%s" % (TAG_PREFIX_IMAGE, imgUUID,)))
+ lvm.deactivateLVs(sdUUID, volUUID)
vars.task.pushRecovery(task.Recovery("create block volume metadata rollback", "blockVolume", "BlockVolume", "createVolumeMetadataRollback",
[sdUUID, str(offs)]))
- lvm.addLVTags(sdUUID, volUUID, ("%s%s" % (TAG_PREFIX_MD, offs),
- "%s%s" % (TAG_PREFIX_PARENT, srcVolUUID,), "%s%s" % (TAG_PREFIX_IMAGE, imgUUID,)))
- lvm.deactivateLVs(sdUUID, volUUID)
# Set metadata and mark volume as legal.
# FIXME: In next version we should remove imgUUID and srcVolUUID, as they are saved on lvm tags
cls.newMetadata([sdUUID, offs], sdUUID, imgUUID, srcVolUUID,
More information about the vdsm-patches
mailing list