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

Reply via email to