Change in vdsm[master]: StorageDomainManifest: move extend and extendVolume
alitke at redhat.com
alitke at redhat.com
Fri Jun 12 09:59:37 UTC 2015
Adam Litke has uploaded a new change for review.
Change subject: StorageDomainManifest: move extend and extendVolume
......................................................................
StorageDomainManifest: move extend and extendVolume
Change-Id: I0ad1769d7e4db6fc0883b37a67d071c278b96c8b
Signed-off-by: Adam Litke <alitke at redhat.com>
---
M vdsm/storage/blockSD.py
M vdsm/storage/sd.py
2 files changed, 142 insertions(+), 118 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/66/42266/1
diff --git a/vdsm/storage/blockSD.py b/vdsm/storage/blockSD.py
index e368e0b..caa7baf 100644
--- a/vdsm/storage/blockSD.py
+++ b/vdsm/storage/blockSD.py
@@ -404,6 +404,10 @@
metadata = selectMetadata(sdUUID)
sd.StorageDomainManifest.__init__(self, sdUUID, domaindir, metadata)
+ # _extendlock is used to prevent race between
+ # VG extend and LV extend.
+ self._extendlock = threading.Lock()
+
try:
self.logBlkSize = self.getMetaParam(DMDK_LOGBLKSIZE)
self.phyBlkSize = self.getMetaParam(DMDK_PHYBLKSIZE)
@@ -414,6 +418,15 @@
# Such domains supported only 512 sizes
self.logBlkSize = 512
self.phyBlkSize = 512
+
+ def readMetadataMapping(self):
+ meta = self.getMetadata()
+ for key in meta.keys():
+ if not DMDK_PV_REGEX.match(key):
+ del meta[key]
+
+ self.log.info("META MAPPING: %s" % meta)
+ return meta
def getReadDelay(self):
stats = misc.readspeed(lvm.lvPath(self.sdUUID, sd.METADATA), 4096)
@@ -444,6 +457,119 @@
lvm.activateLVs(self.sdUUID, [sd.IDS])
return lvm.lvPath(self.sdUUID, sd.IDS)
+ def extendVolume(self, volumeUUID, size, isShuttingDown=None):
+ self._extendlock.acquire()
+ try:
+ # FIXME: following line.
+ lvm.extendLV(self.sdUUID, volumeUUID, size) # , isShuttingDown)
+ finally:
+ self._extendlock.release()
+
+ @classmethod
+ def getMetaDataMapping(cls, vgName, oldMapping={}):
+ firstDev, firstExtent = lvm.getFirstExt(vgName, sd.METADATA)
+ firstExtent = int(firstExtent)
+ if firstExtent != 0:
+ cls.log.error("INTERNAL: metadata ext is not 0")
+ raise se.MetaDataMappingError("vg %s: metadata extent is not the "
+ "first extent" % vgName)
+
+ pvlist = list(lvm.listPVNames(vgName))
+
+ pvlist.remove(firstDev)
+ pvlist.insert(0, firstDev)
+ cls.log.info("Create: SORT MAPPING: %s" % pvlist)
+
+ mapping = {}
+ devNum = len(oldMapping)
+ for dev in pvlist:
+ knownDev = False
+ for pvID, oldInfo in oldMapping.iteritems():
+ if os.path.basename(dev) == oldInfo["guid"]:
+ mapping[pvID] = oldInfo
+ knownDev = True
+ break
+
+ if knownDev:
+ continue
+
+ pv = lvm.getPV(dev)
+ pvInfo = {}
+ pvInfo["guid"] = os.path.basename(pv.name)
+ pvInfo["uuid"] = pv.uuid
+ # this is another trick, it's not the
+ # the pestart value you expect, it's just
+ # 0, always
+ pvInfo["pestart"] = 0
+ pvInfo["pecount"] = pv.pe_count
+ if devNum == 0:
+ mapOffset = 0
+ else:
+ prevDevNum = devNum - 1
+ try:
+ prevInfo = mapping["PV%d" % (prevDevNum,)]
+ except KeyError:
+ prevInfo = oldMapping["PV%d" % (prevDevNum,)]
+
+ mapOffset = int(prevInfo["mapoffset"]) + \
+ int(prevInfo["pecount"])
+
+ pvInfo["mapoffset"] = mapOffset
+ mapping["PV%d" % devNum] = pvInfo
+ devNum += 1
+
+ return mapping
+
+ def updateMapping(self):
+ # First read existing mapping from metadata
+ with self._metadata.transaction():
+ mapping = self.getMetaDataMapping(self.sdUUID,
+ self.readMetadataMapping())
+ for key in set(self._metadata.keys() + mapping.keys()):
+ if DMDK_PV_REGEX.match(key):
+ if key in mapping:
+ self._metadata[key] = mapping[key]
+ else:
+ del self._metadata[key]
+
+ @classmethod
+ def metaSize(cls, vgroup):
+ ''' Calc the minimal meta volume size in MB'''
+ # In any case the metadata volume cannot be less than 512MB for the
+ # case of 512 bytes per volume metadata, 2K for domain metadata and
+ # extent size of 128MB. In any case we compute the right size on line.
+ vg = lvm.getVG(vgroup)
+ minmetasize = (SD_METADATA_SIZE / sd.METASIZE * int(vg.extent_size) +
+ (1024 * 1024 - 1)) / (1024 * 1024)
+ metaratio = int(vg.extent_size) / sd.METASIZE
+ metasize = (int(vg.extent_count) * sd.METASIZE +
+ (1024 * 1024 - 1)) / (1024 * 1024)
+ metasize = max(minmetasize, metasize)
+ if metasize > int(vg.free) / (1024 * 1024):
+ raise se.VolumeGroupSizeError(
+ "volume group has not enough extents %s (Minimum %s), VG may "
+ "be too small" % (vg.extent_count,
+ (1024 * 1024) / sd.METASIZE))
+ cls.log.info("size %s MB (metaratio %s)" % (metasize, metaratio))
+ return metasize
+
+ def extend(self, devlist, force):
+ with self._extendlock:
+ if self.getVersion() in VERS_METADATA_LV:
+ mapping = self.readMetadataMapping().values()
+ if len(mapping) + len(devlist) > MAX_PVS:
+ raise se.StorageDomainIsMadeFromTooManyPVs()
+
+ knowndevs = set(multipath.getMPDevNamesIter())
+ unknowndevs = set(devlist) - knowndevs
+ if unknowndevs:
+ raise se.InaccessiblePhysDev(unknowndevs)
+
+ lvm.extendVG(self.sdUUID, devlist, force)
+ self.updateMapping()
+ newsize = self.metaSize(self.sdUUID)
+ lvm.extendLV(self.sdUUID, sd.METADATA, newsize)
+
class BlockStorageDomain(sd.StorageDomain):
manifestClass = BlockStorageDomainManifest
@@ -458,9 +584,6 @@
# block sizes.
lvm.checkVGBlockSizes(sdUUID, (self.logBlkSize, self.phyBlkSize))
- # _extendlock is used to prevent race between
- # VG extend and LV extend.
- self._extendlock = threading.Lock()
self.imageGarbageCollector()
self._registerResourceNamespaces()
self._lastUncachedSelftest = 0
@@ -495,24 +618,7 @@
@classmethod
def metaSize(cls, vgroup):
- ''' Calc the minimal meta volume size in MB'''
- # In any case the metadata volume cannot be less than 512MB for the
- # case of 512 bytes per volume metadata, 2K for domain metadata and
- # extent size of 128MB. In any case we compute the right size on line.
- vg = lvm.getVG(vgroup)
- minmetasize = (SD_METADATA_SIZE / sd.METASIZE * int(vg.extent_size) +
- (1024 * 1024 - 1)) / (1024 * 1024)
- metaratio = int(vg.extent_size) / sd.METASIZE
- metasize = (int(vg.extent_count) * sd.METASIZE +
- (1024 * 1024 - 1)) / (1024 * 1024)
- metasize = max(minmetasize, metasize)
- if metasize > int(vg.free) / (1024 * 1024):
- raise se.VolumeGroupSizeError(
- "volume group has not enough extents %s (Minimum %s), VG may "
- "be too small" % (vg.extent_count,
- (1024 * 1024) / sd.METASIZE))
- cls.log.info("size %s MB (metaratio %s)" % (metasize, metaratio))
- return metasize
+ return cls.manifestClass.metaSize(vgroup)
@classmethod
def create(cls, sdUUID, domainName, domClass, vgUUID, storageType,
@@ -657,87 +763,10 @@
@classmethod
def getMetaDataMapping(cls, vgName, oldMapping={}):
- firstDev, firstExtent = lvm.getFirstExt(vgName, sd.METADATA)
- firstExtent = int(firstExtent)
- if firstExtent != 0:
- cls.log.error("INTERNAL: metadata ext is not 0")
- raise se.MetaDataMappingError("vg %s: metadata extent is not the "
- "first extent" % vgName)
-
- pvlist = list(lvm.listPVNames(vgName))
-
- pvlist.remove(firstDev)
- pvlist.insert(0, firstDev)
- cls.log.info("Create: SORT MAPPING: %s" % pvlist)
-
- mapping = {}
- devNum = len(oldMapping)
- for dev in pvlist:
- knownDev = False
- for pvID, oldInfo in oldMapping.iteritems():
- if os.path.basename(dev) == oldInfo["guid"]:
- mapping[pvID] = oldInfo
- knownDev = True
- break
-
- if knownDev:
- continue
-
- pv = lvm.getPV(dev)
- pvInfo = {}
- pvInfo["guid"] = os.path.basename(pv.name)
- pvInfo["uuid"] = pv.uuid
- # this is another trick, it's not the
- # the pestart value you expect, it's just
- # 0, always
- pvInfo["pestart"] = 0
- pvInfo["pecount"] = pv.pe_count
- if devNum == 0:
- mapOffset = 0
- else:
- prevDevNum = devNum - 1
- try:
- prevInfo = mapping["PV%d" % (prevDevNum,)]
- except KeyError:
- prevInfo = oldMapping["PV%d" % (prevDevNum,)]
-
- mapOffset = int(prevInfo["mapoffset"]) + \
- int(prevInfo["pecount"])
-
- pvInfo["mapoffset"] = mapOffset
- mapping["PV%d" % devNum] = pvInfo
- devNum += 1
-
- return mapping
-
- def updateMapping(self):
- # First read existing mapping from metadata
- with self._metadata.transaction():
- mapping = self.getMetaDataMapping(self.sdUUID,
- self.readMetadataMapping())
- for key in set(self._metadata.keys() + mapping.keys()):
- if DMDK_PV_REGEX.match(key):
- if key in mapping:
- self._metadata[key] = mapping[key]
- else:
- del self._metadata[key]
+ return cls.manifestClass.getMetaDataMapping(vgName, oldMapping)
def extend(self, devlist, force):
- with self._extendlock:
- if self.getVersion() in VERS_METADATA_LV:
- mapping = self.readMetadataMapping().values()
- if len(mapping) + len(devlist) > MAX_PVS:
- raise se.StorageDomainIsMadeFromTooManyPVs()
-
- knowndevs = set(multipath.getMPDevNamesIter())
- unknowndevs = set(devlist) - knowndevs
- if unknowndevs:
- raise se.InaccessiblePhysDev(unknowndevs)
-
- lvm.extendVG(self.sdUUID, devlist, force)
- self.updateMapping()
- newsize = self.metaSize(self.sdUUID)
- lvm.extendLV(self.sdUUID, sd.METADATA, newsize)
+ self._manifest.extend(devlist, force)
_lvTagMetaSlotLock = threading.Lock()
@@ -822,13 +851,7 @@
(self.sdUUID, dev, ext))
def readMetadataMapping(self):
- meta = self.getMetadata()
- for key in meta.keys():
- if not DMDK_PV_REGEX.match(key):
- del meta[key]
-
- self.log.info("META MAPPING: %s" % meta)
- return meta
+ return self._manifest.readMetadataMapping()
def getLeasesFileSize(self):
lv = lvm.getLV(self.sdUUID, sd.LEASES)
@@ -1325,12 +1348,7 @@
os.symlink(src, dst)
def extendVolume(self, volumeUUID, size, isShuttingDown=None):
- self._extendlock.acquire()
- try:
- # FIXME: following line.
- lvm.extendLV(self.sdUUID, volumeUUID, size) # , isShuttingDown)
- finally:
- self._extendlock.release()
+ return self._manifest.extendVolume(volumeUUID, size, isShuttingDown)
def refresh(self):
self.refreshDirTree()
diff --git a/vdsm/storage/sd.py b/vdsm/storage/sd.py
index 4a89805..1f3ec36 100644
--- a/vdsm/storage/sd.py
+++ b/vdsm/storage/sd.py
@@ -317,8 +317,17 @@
return os.path.join(self.domaindir, DOMAIN_META_DATA)
return None
+ def getMetadata(self):
+ """
+ Unified Metadata accessor/mutator
+ """
+ return self._metadata.copy()
+
def getMetaParam(self, key):
return self._metadata[key]
+
+ def getVersion(self):
+ return self.getMetaParam(DMDK_VERSION)
class StorageDomain(object):
@@ -502,7 +511,7 @@
exc_info=True)
def getVersion(self):
- return self.getMetaParam(DMDK_VERSION)
+ return self._manifest.getVersion()
def getFormat(self):
return str(self.getVersion())
@@ -778,10 +787,7 @@
pass
def getMetadata(self):
- """
- Unified Metadata accessor/mutator
- """
- return self._metadata.copy()
+ return self._manifest.getMetadata()
def setMetadata(self, newMetadata):
# Backup old md (rotate old backup files)
--
To view, visit https://gerrit.ovirt.org/42266
To unsubscribe, visit https://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0ad1769d7e4db6fc0883b37a67d071c278b96c8b
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Adam Litke <alitke at redhat.com>
More information about the vdsm-patches
mailing list