[NEW PATCH] BZ#726400 - Remove lvm operations from StoragePool.__rebuild(). (via gerrit-bot)

Dan Kenigsberg danken at redhat.com
Thu Sep 15 08:37:04 UTC 2011


New patch submitted by Dan Kenigsberg (danken at redhat.com)

You can review this change at: http://gerrit.usersys.redhat.com/832

commit 7f3434e95aa8cc998a0eb08a90fd6a6f48f75bc6
Author: Eduardo Warszawski <ewarszaw at redhat.com>
Date:   Thu Aug 18 16:23:51 2011 +0300

    BZ#726400 - Remove lvm operations from StoragePool.__rebuild().
    
    Change-Id: I712d57d3d16aba5e394ed42f247b14cf86c44b2d

diff --git a/vdsm/storage/lvm.py b/vdsm/storage/lvm.py
index 9bf8533..ce99f92 100644
--- a/vdsm/storage/lvm.py
+++ b/vdsm/storage/lvm.py
@@ -628,6 +628,16 @@ class LVMCache(object):
             vg = vgs.get(vgName)
         return vg
 
+    def getVgs(self, vgNames):
+        """Reloads all the VGs of the set.
+
+        Can block for suspended devices.
+        Fills the cache but not uses it.
+        Only returns found VGs.
+        """
+        return [vg for vgName, vg in self._reloadvgs(vgNames).iteritems() if vgName in vgNames]
+
+
     def getAllVgs(self):
         # Get everything we have
         if self._stalevg:
@@ -817,6 +827,9 @@ def getVG(vgName):
     else:
         return vg
 
+def getVGs(vgNames):
+    return _lvminfo.getVgs(vgNames) #returns list
+
 def getAllVGs():
     return _lvminfo.getAllVgs() #returns list
 
diff --git a/vdsm/storage/sp.py b/vdsm/storage/sp.py
index c1a3a38..ef1b314 100644
--- a/vdsm/storage/sp.py
+++ b/vdsm/storage/sp.py
@@ -30,6 +30,7 @@ import codecs
 import constants
 import storage_mailbox
 import blockSD
+import fileSD
 import sd
 import misc
 from misc import Event
@@ -512,6 +513,7 @@ class StoragePool:
     def __masterMigrate(self, sdUUID, msdUUID, masterVersion):
         curmsd = SDF.produce(sdUUID)
         newmsd = SDF.produce(msdUUID)
+        self._refreshDomainLinks(newmsd)
         curmsd.invalidateMetadata()
         newmsd.upgrade(curmsd.getVersion())
 
@@ -847,24 +849,29 @@ class StoragePool:
         if msdUUID in domUUIDs:
             domUUIDs.remove(msdUUID)
 
-        for domUUID in domUUIDs:
-            try:
-                d = SDF.produce(domUUID)
-            except se.StorageDomainDoesNotExist:
-                # We should not rebuild a non-master active domain
-                # if it is disconnected. Log the error and continue
-                self.log.error("pool %s metadata contains an unknown domain %s", self.spUUID, domUUID, exc_info=True)
-                continue
-
-            try:
-                self._refreshDomainLinks(d)
-            except (se.StorageException, OSError):
-                self.log.error("Can't refresh domain links", exc_info=True)
-                continue
-            # Remove domain from potential cleanup
+        #TODO: Consider to remove this whole block. UGLY!
+        #We want to avoid lookups (vgs) of unknown block domains.
+        #domUUIDs includes all the domains, file or block.
+        block_mountpoint = os.path.join(sd.StorageDomain.storage_repository,
+                sd.DOMAIN_MNT_POINT, sd.BLOCKSD_DIR)
+        blockDomUUIDs = blockSD.lvm.getVGs(domUUIDs)
+        domDirs = {} # {domUUID: domaindir}
+        #Add the block domains
+        for domUUID in blockDomUUIDs:
+            domaindir = os.path.join(block_mountpoint, domUUID)
+            domDirs[domUUID] = domaindir
+            # create domain special volumes folder
+            fileUtils.createdir(os.path.join(domaindir, sd.DOMAIN_META_DATA))
+            fileUtils.createdir(os.path.join(domaindir, sd.DOMAIN_IMAGES))
+        #Add the file domains
+        for domUUID, domaindir in fileSD.scanDomains(): #[(fileDomUUID, file_domaindir)]
+            domDirs[domUUID] = domaindir
+
+        #Link all the domains to the pool
+        for domUUID, domaindir in domDirs.iteritems():
             linkName = os.path.join(self.poolPath, domUUID)
-            if linkName in oldLinks:
-                oldLinks.remove(linkName)
+            self._linkStorageDomain(domaindir, linkName)
+
         # Always try to build master links
         try:
             self._refreshDomainLinks(self.masterDomain)
@@ -876,13 +883,14 @@ class StoragePool:
 
         # Cleanup old trash from the pool
         for oldie in oldLinks:
-            try:
-                os.remove(oldie)
-            except OSError as e:
-                if e.errno != errno.ENOENT:
-                    self.log.warn("Could not clean all trash from the pool dom `%s` (%s)", oldie, e)
-            except Exception as e:
-                    self.log.warn("Could not clean all trash from the pool dom `%s` (%s)", oldie, e)
+            if oldie not in domUUIDs:
+                try:
+                    os.remove(oldie)
+                except OSError as e:
+                    if e.errno != errno.ENOENT:
+                        self.log.warn("Could not clean all trash from the pool dom `%s` (%s)", oldie, e)
+                except Exception as e:
+                        self.log.warn("Could not clean all trash from the pool dom `%s` (%s)", oldie, e)
 
 
     def refresh(self, msdUUID=None, masterVersion=None):




More information about the vdsm-patches mailing list