Hello Fred Rolland, I'd like you to do a code review. Please visit
https://gerrit.ovirt.org/46417 to review the following change. Change subject: storage: Initial size for thin provisioning disk ...................................................................... storage: Initial size for thin provisioning disk Add the possibility to specify the volume initial size, for block disk with thin provisioning. If not specify, the initial size is 1G. Change-Id: Iaf5f142541bf0b311a77a0544a1c4ffb689a9fde Bug-Url: https://bugzilla.redhat.com/1221603 Signed-off-by: Fred Rolland <froll...@redhat.com> --- M client/vdsClient.py M vdsm/API.py M vdsm/rpc/bindingxmlrpc.py M vdsm/rpc/vdsmapi-schema.json M vdsm/storage/blockVolume.py M vdsm/storage/fileVolume.py M vdsm/storage/hsm.py M vdsm/storage/sd.py M vdsm/storage/sp.py M vdsm/storage/volume.py 10 files changed, 57 insertions(+), 24 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/17/46417/1 diff --git a/client/vdsClient.py b/client/vdsClient.py index cda9b81..12899c9 100755 --- a/client/vdsClient.py +++ b/client/vdsClient.py @@ -1078,10 +1078,21 @@ srcVolUUID = args[10] else: srcVolUUID = BLANK_UUID - image = self.s.createVolume(sdUUID, spUUID, imgUUID, size, - volFormat, preallocate, - diskType, newVol, descr, - srcImgUUID, srcVolUUID) + if len(args) > 11: + initialSize = int(args[11]) * convertFactor + else: + initialSize = None + + if initialSize: + image = self.s.createVolume(sdUUID, spUUID, imgUUID, size, + volFormat, preallocate, + diskType, newVol, descr, + srcImgUUID, srcVolUUID, initialSize) + else: + image = self.s.createVolume(sdUUID, spUUID, imgUUID, size, + volFormat, preallocate, + diskType, newVol, descr, + srcImgUUID, srcVolUUID) if image['status']['code']: return image['status']['code'], image['status']['message'] return 0, image['uuid'] @@ -2520,7 +2531,7 @@ 'createVolume': (serv.createVolume, ('<sdUUID> <spUUID> <imgUUID> <size> <volFormat> ' '<preallocate> <diskType> <newVolUUID> <descr> ' - '<srcImgUUID> <srcVolUUID>', + '<srcImgUUID> <srcVolUUID> <initialSize>', 'Creates new volume or snapshot' )), 'extendVolumeSize': (serv.extendVolumeSize, ( diff --git a/vdsm/API.py b/vdsm/API.py index e3b9241..72d563d 100644 --- a/vdsm/API.py +++ b/vdsm/API.py @@ -825,11 +825,11 @@ volFormat, preallocate, postZero, force) def create(self, size, volFormat, preallocate, diskType, desc, - srcImgUUID, srcVolUUID): + srcImgUUID, srcVolUUID, actualSize): return self._irs.createVolume(self._sdUUID, self._spUUID, self._imgUUID, size, volFormat, preallocate, diskType, self._UUID, desc, - srcImgUUID, srcVolUUID) + srcImgUUID, srcVolUUID, actualSize) def delete(self, postZero, force): return self._irs.deleteVolume(self._sdUUID, self._spUUID, diff --git a/vdsm/rpc/bindingxmlrpc.py b/vdsm/rpc/bindingxmlrpc.py index 4c69b32..951c107 100644 --- a/vdsm/rpc/bindingxmlrpc.py +++ b/vdsm/rpc/bindingxmlrpc.py @@ -918,10 +918,10 @@ def volumeCreate(self, sdUUID, spUUID, imgUUID, size, volFormat, preallocate, diskType, volUUID, desc, srcImgUUID=API.Image.BLANK_UUID, - srcVolUUID=API.Volume.BLANK_UUID): + srcVolUUID=API.Volume.BLANK_UUID, initialSize=None): volume = API.Volume(volUUID, spUUID, sdUUID, imgUUID) return volume.create(size, volFormat, preallocate, diskType, desc, - srcImgUUID, srcVolUUID) + srcImgUUID, srcVolUUID, initialSize) def volumeExtendSize(self, spUUID, sdUUID, imgUUID, volUUID, newSize): volume = API.Volume(volUUID, spUUID, sdUUID, imgUUID) diff --git a/vdsm/rpc/vdsmapi-schema.json b/vdsm/rpc/vdsmapi-schema.json index e0e95b9..d3bd1d4 100644 --- a/vdsm/rpc/vdsmapi-schema.json +++ b/vdsm/rpc/vdsmapi-schema.json @@ -8282,6 +8282,8 @@ # # @srcVolUUID: If specified, create a snapshot from this Volume # +# @initialSize: #optional if specified, initial size of volume for thin provsioning +# # Returns: # A task UUID # @@ -8292,7 +8294,8 @@ 'storagedomainID': 'UUID', 'imageID': 'UUID', 'size': 'int', 'volFormat': 'VolumeFormat', 'preallocate': 'VolumeAllocation', 'diskType': 'DiskType', - 'desc': 'str', 'srcImgUUID': 'UUID', 'srcVolUUID': 'UUID'}, + 'desc': 'str', 'srcImgUUID': 'UUID', 'srcVolUUID': 'UUID', + '*initialSize': 'int'}, 'returns': 'UUID'} ## diff --git a/vdsm/storage/blockVolume.py b/vdsm/storage/blockVolume.py index ac29f40..7c03f8e 100644 --- a/vdsm/storage/blockVolume.py +++ b/vdsm/storage/blockVolume.py @@ -118,14 +118,20 @@ @classmethod def _create(cls, dom, imgUUID, volUUID, size, volFormat, preallocate, - volParent, srcImgUUID, srcVolUUID, volPath): + volParent, srcImgUUID, srcVolUUID, volPath, initialSize): """ Class specific implementation of volumeCreate. All the exceptions are properly handled and logged in volume.create() """ if preallocate == volume.SPARSE_VOL: - volSize = "%s" % config.get("irs", "volume_utilization_chunk_mb") + if initialSize: + volSize = int(((initialSize + SECTORS_TO_MB - 1) + / SECTORS_TO_MB) * 1.1) + # %10 more for cow metadata + else: + volSize = "%s" % config.get("irs", + "volume_utilization_chunk_mb") else: volSize = "%s" % ((size + SECTORS_TO_MB - 1) / SECTORS_TO_MB) diff --git a/vdsm/storage/fileVolume.py b/vdsm/storage/fileVolume.py index 1259472..8fd38d8 100644 --- a/vdsm/storage/fileVolume.py +++ b/vdsm/storage/fileVolume.py @@ -99,11 +99,16 @@ @classmethod def _create(cls, dom, imgUUID, volUUID, size, volFormat, preallocate, - volParent, srcImgUUID, srcVolUUID, volPath): + volParent, srcImgUUID, srcVolUUID, volPath, initialSize): """ Class specific implementation of volumeCreate. All the exceptions are properly handled and logged in volume.create() """ + if initialSize: + cls.log.info("Request to create %s volume %s with initial size" + " = %s sectors. Initial size is not supported in " + "File Volumes", volume.type2name(volFormat), + volPath, initialSize) sizeBytes = size * BLOCK_SIZE truncSize = sizeBytes if volFormat == volume.RAW_FORMAT else 0 diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py index 397c95a..503b608 100644 --- a/vdsm/storage/hsm.py +++ b/vdsm/storage/hsm.py @@ -1432,7 +1432,8 @@ def createVolume(self, sdUUID, spUUID, imgUUID, size, volFormat, preallocate, diskType, volUUID, desc, srcImgUUID=volume.BLANK_UUID, - srcVolUUID=volume.BLANK_UUID): + srcVolUUID=volume.BLANK_UUID, + initialSize=None): """ Create a new volume Function Type: SPM @@ -1441,10 +1442,10 @@ """ argsStr = ("sdUUID=%s, spUUID=%s, imgUUID=%s, size=%s, volFormat=%s, " "preallocate=%s, diskType=%s, volUUID=%s, desc=%s, " - "srcImgUUID=%s, srcVolUUID=%s" % + "srcImgUUID=%s, srcVolUUID=%s, sparseSize=%s" % (sdUUID, spUUID, imgUUID, size, volFormat, preallocate, - diskType, volUUID, desc, - srcImgUUID, srcVolUUID)) + diskType, volUUID, desc, srcImgUUID, srcVolUUID, + initialSize)) vars.task.setDefaultException(se.VolumeCreationError(argsStr)) # Validates that the pool is connected. WHY? pool = self.getPool(spUUID) @@ -1469,7 +1470,7 @@ vars.task.getSharedLock(STORAGE, sdUUID) self._spmSchedule(spUUID, "createVolume", pool.createVolume, sdUUID, imgUUID, size, volFormat, preallocate, diskType, - volUUID, desc, srcImgUUID, srcVolUUID) + volUUID, desc, srcImgUUID, srcVolUUID, initialSize) @public def deleteVolume(self, sdUUID, spUUID, imgUUID, volumes, postZero=False, diff --git a/vdsm/storage/sd.py b/vdsm/storage/sd.py index f6cb8e3..532b6c7 100644 --- a/vdsm/storage/sd.py +++ b/vdsm/storage/sd.py @@ -605,13 +605,14 @@ preallocate) def createVolume(self, imgUUID, size, volFormat, preallocate, diskType, - volUUID, desc, srcImgUUID, srcVolUUID): + volUUID, desc, srcImgUUID, srcVolUUID, initialSize=None): """ Create a new volume """ return self.getVolumeClass().create( self._getRepoPath(), self.sdUUID, imgUUID, size, volFormat, - preallocate, diskType, volUUID, desc, srcImgUUID, srcVolUUID) + preallocate, diskType, volUUID, desc, srcImgUUID, srcVolUUID, + initialSize) def getMDPath(self): return self._manifest.getMDPath() diff --git a/vdsm/storage/sp.py b/vdsm/storage/sp.py index 247d322..b8fd8f3 100644 --- a/vdsm/storage/sp.py +++ b/vdsm/storage/sp.py @@ -1804,7 +1804,8 @@ def createVolume(self, sdUUID, imgUUID, size, volFormat, preallocate, diskType, volUUID=None, desc="", srcImgUUID=volume.BLANK_UUID, - srcVolUUID=volume.BLANK_UUID): + srcVolUUID=volume.BLANK_UUID, + initialSize=None): """ Creates a new volume. @@ -1836,6 +1837,9 @@ :param srcVolUUID: The UUID of the volume that will be the base of the new volume. :type srcVolUUID: UUID + :param initialSize: The initial size of the volume in case of thin + provisioning. + :type initialSize: int :returns: a dict with the UUID of the new volume. :rtype: dict @@ -1864,7 +1868,8 @@ newVolUUID = sdCache.produce(sdUUID).createVolume( imgUUID=imgUUID, size=size, volFormat=volFormat, preallocate=preallocate, diskType=diskType, volUUID=volUUID, - desc=desc, srcImgUUID=srcImgUUID, srcVolUUID=srcVolUUID) + desc=desc, srcImgUUID=srcImgUUID, srcVolUUID=srcVolUUID, + initialSize=initialSize) return dict(uuid=newVolUUID) def deleteVolume(self, sdUUID, imgUUID, volumes, postZero, force): diff --git a/vdsm/storage/volume.py b/vdsm/storage/volume.py index b46eab1..b659ea7 100644 --- a/vdsm/storage/volume.py +++ b/vdsm/storage/volume.py @@ -358,7 +358,7 @@ @classmethod def create(cls, repoPath, sdUUID, imgUUID, size, volFormat, preallocate, - diskType, volUUID, desc, srcImgUUID, srcVolUUID): + diskType, volUUID, desc, srcImgUUID, srcVolUUID, initialSize): """ Create a new volume with given size or snapshot 'size' - in sectors @@ -367,6 +367,7 @@ 'diskType' - enum (API.Image.DiskTypes) 'srcImgUUID' - source image UUID 'srcVolUUID' - source volume UUID + 'initialSize' - initial volume size in case of thin provisioning """ dom = sdCache.produce(sdUUID) dom.validateCreateVolumeParams(volFormat, srcVolUUID, @@ -432,7 +433,7 @@ try: metaId = cls._create(dom, imgUUID, volUUID, size, volFormat, preallocate, volParent, srcImgUUID, - srcVolUUID, volPath) + srcVolUUID, volPath, initialSize) except (se.VolumeAlreadyExists, se.CannotCreateLogicalVolume) as e: cls.log.error("Failed to create volume %s: %s", volPath, e) vars.task.popRecovery() -- To view, visit https://gerrit.ovirt.org/46417 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iaf5f142541bf0b311a77a0544a1c4ffb689a9fde Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Freddy Rolland <froll...@redhat.com> Gerrit-Reviewer: Fred Rolland <froll...@redhat.com> _______________________________________________ vdsm-patches mailing list vdsm-patches@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches