[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