New patch submitted by Igor Lvovsky (ilvovsky(a)redhat.com)
You can review this change at:
http://gerrit.usersys.redhat.com/626
commit a015a5919308b374add65495b1e577ee7de42677
Author: Igor Lvovsky <ilvovsky(a)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..7398a61 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,17 @@ class BlockVolume(volume.Volume):
raise
try:
- offs = mysd.mapMetaOffset(volUUID)
+ try:
+ cls._tagCreateLock.acquire()
+ 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,)))
+ finally:
+ cls._tagCreateLock.release()
+ 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,