[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