Change in vdsm[master]: sp: Add resizePV verb

frolland at redhat.com frolland at redhat.com
Sun May 3 07:27:14 UTC 2015


Hello Fred Rolland,

I'd like you to do a code review.  Please visit

    https://gerrit.ovirt.org/40467

to review the following change.

Change subject: sp: Add resizePV verb
......................................................................

sp: Add resizePV verb

This command calls pvresize on a device and returns the new PV size.

This command will extend the PV after a LUN was resized on the storage
server. It should be called after invoking Refresh Device verb,
otherwise the PV size will not increase.
This is a SPM operation.

Example outputs:

    $ vdsClient -s 0 resizePV \
            d24ebee6-ec30-4270-88a2-a8f38a5a804a \
            5966cee6-ee28-454c-96bc-e318bed1291a \
            360014057fac79f7f7dc4c15b29405f4e
        size = '36104568832'

    $ vdsClient -s 0 resizePV
      Error using command: Wrong number of arguments provided, expecting 3
      (3 required) got 0

      resizePV
          <sdUUID> <spUUID> <GUID>
          Resize PV in Storage Domain - After a block device has been
          resized in storage server, this method will cause the PV to use
          the entire size of the block device

Change-Id: I38f9e603a66adbe2655173b8043766f6c04a7913
Bug-Url:https://bugzilla.redhat.com/609689
Signed-off-by: Fred Rolland <frolland at redhat.com>
---
M client/vdsClient.py
M vdsm/API.py
M vdsm/rpc/BindingXMLRPC.py
M vdsm/rpc/Bridge.py
M vdsm/rpc/vdsmapi-schema.json
M vdsm/storage/blockSD.py
M vdsm/storage/hsm.py
M vdsm/storage/lvm.py
M vdsm/storage/sd.py
M vdsm/storage/sp.py
M vdsm/storage/storage_exception.py
11 files changed, 114 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/67/40467/1

diff --git a/client/vdsClient.py b/client/vdsClient.py
index 375fa1a..8a242c7 100755
--- a/client/vdsClient.py
+++ b/client/vdsClient.py
@@ -791,6 +791,18 @@
             return dom['status']['code'], dom['status']['message']
         return 0, ''
 
+    def resizePV(self, args):
+        validateArgTypes(args, [str, str, str], requiredArgsNumber=3)
+        sdUUID = args[0]
+        spUUID = args[1]
+        guid = args[2]
+        res = self.s.resizePV(sdUUID, spUUID, guid)
+        if res['status']['code']:
+            return res['status']['code'], res['status']['message']
+        del res['status']
+        printDict(res, self.pretty)
+        return 0, ''
+
     def discoverST(self, args):
         portal = args[0].split(":")
         ip = portal[0]
@@ -2225,6 +2237,12 @@
                                  'Extend the Storage Domain by adding devices'
                                  ' devlist (list of dev GUIDs)'
                                  )),
+        'resizePV': (serv.resizePV,
+                     ('<sdUUID> <spUUID> <GUID>',
+                      'Resize PV in Storage Domain - After a block device has '
+                      'been resized in storage server, this method will cause '
+                      'the PV to use the entire size of the block device'
+                      )),
         'discoverST': (serv.discoverST,
                        ('ip[:port] [[username password] [auth=]]',
                         'Discover the available iSCSI targetnames on a '
diff --git a/vdsm/API.py b/vdsm/API.py
index 3cdc465..c66cf4c 100644
--- a/vdsm/API.py
+++ b/vdsm/API.py
@@ -1013,6 +1013,9 @@
         return self._irs.extendStorageDomain(self._UUID, storagepoolID,
                                              devlist, force)
 
+    def resizePV(self, storagepoolID, guid):
+        return self._irs.resizePV(self._UUID, storagepoolID, guid)
+
     def format(self, autoDetach):
         return self._irs.formatStorageDomain(self._UUID, autoDetach)
 
diff --git a/vdsm/rpc/BindingXMLRPC.py b/vdsm/rpc/BindingXMLRPC.py
index 9a1da99..62957bd 100644
--- a/vdsm/rpc/BindingXMLRPC.py
+++ b/vdsm/rpc/BindingXMLRPC.py
@@ -636,6 +636,10 @@
         domain = API.StorageDomain(sdUUID)
         return domain.extend(spUUID, devlist, force)
 
+    def resizePV(self, sdUUID, spUUID, guid, options=None):
+        domain = API.StorageDomain(sdUUID)
+        return domain.resizePV(spUUID, guid)
+
     def domainFormat(self, sdUUID,
                      autoDetach=False, options=None):
         domain = API.StorageDomain(sdUUID)
@@ -1046,6 +1050,7 @@
                 (self.domainDetach, 'detachStorageDomain'),
                 (self.domainDetachForced, 'forcedDetachStorageDomain'),
                 (self.domainExtend, 'extendStorageDomain'),
+                (self.resizePV, 'resizePV'),
                 (self.domainFormat, 'formatStorageDomain'),
                 (self.domainGetFileStats, 'getFileStats'),
                 (self.domainGetImages, 'getImagesList'),
diff --git a/vdsm/rpc/Bridge.py b/vdsm/rpc/Bridge.py
index cb149bc..5f1fc17 100644
--- a/vdsm/rpc/Bridge.py
+++ b/vdsm/rpc/Bridge.py
@@ -442,6 +442,7 @@
     'StorageDomain_getInfo': {'ret': 'info'},
     'StorageDomain_getStats': {'ret': 'stats'},
     'StorageDomain_getVolumes': {'ret': 'uuidlist'},
+    'StorageDomain_resizePV': {'ret': 'size'},
     'StoragePool_connectStorageServer': {'ret': 'statuslist'},
     'StoragePool_disconnectStorageServer': {'ret': 'statuslist'},
     'StoragePool_fence': {'ret': 'spm_st'},
diff --git a/vdsm/rpc/vdsmapi-schema.json b/vdsm/rpc/vdsmapi-schema.json
index 0c73078..48ee624 100644
--- a/vdsm/rpc/vdsmapi-schema.json
+++ b/vdsm/rpc/vdsmapi-schema.json
@@ -5124,6 +5124,28 @@
           'devlist': ['str'], '*force': 'bool'}}
 
 ##
+# @StorageDomain.resizePV:
+#
+# Resize PV will cause the PV to use the entire size of the block device,
+# after the block device was resized on the storage server.
+#
+# @storagedomainID:  The UUID of the Storage Domain
+#
+# @storagepoolID:    The UUID of the Storage Pool
+#
+# @guid:             A block device GUID
+#
+# Returns:
+# The size in bytes of the device after resize
+#
+# Since: 4.17.0
+##
+{'command': {'class': 'StorageDomain', 'name': 'resizePV'},
+ 'data': {'storagedomainID': 'UUID', 'storagepoolID': 'UUID',
+          'guid': 'str'},
+ 'returns': 'uint'}
+
+##
 # @StorageDomain.format:
 #
 # Format a storage domain and erase all of its data.
diff --git a/vdsm/storage/blockSD.py b/vdsm/storage/blockSD.py
index caaef6b..66bcea3 100644
--- a/vdsm/storage/blockSD.py
+++ b/vdsm/storage/blockSD.py
@@ -711,6 +711,13 @@
             newsize = self.metaSize(self.sdUUID)
             lvm.extendLV(self.sdUUID, sd.METADATA, newsize)
 
+    def resizePV(self, guid):
+        with self._extendlock:
+            lvm.resizePV(self.sdUUID, guid)
+            self.updateMapping()
+            newsize = self.metaSize(self.sdUUID)
+            lvm.extendLV(self.sdUUID, sd.METADATA, newsize)
+
     def getVolumeMetadataSlot(self, vol_name, slotSize):
         if self.getVersion() in VERS_METADATA_LV:
             return self.getVolumeMetadataOffsetFromPvMapping(vol_name)
diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index 4aa6c2e..f23462e 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -762,6 +762,33 @@
                        in guids)
         pool.extendSD(sdUUID, dmDevs, force)
 
+    @public
+    def resizePV(self, sdUUID, spUUID, guid, options=None):
+        """
+        Calls pvresize with specified pv guid
+        and returns the size after the resize
+
+        :param sdUUID: The UUID of the storage domain that owns the PV.
+        :type sdUUID: UUID
+        :param spUUID: The UUID of the storage pool that owns the PV.
+        :type spUUID: UUID
+        :param guid: A block device GUID
+        :type guid: str
+        :param options: unused
+        :returns: dictionary with one item :size
+        :rtype: dict
+        """
+        vars.task.setDefaultException(
+            se.StorageDomainActionError(
+                "sdUUID=%s, PV=%s" % (sdUUID, guid)))
+
+        vars.task.getSharedLock(STORAGE, sdUUID)
+        pool = self.getPool(spUUID)
+        pool.resizePV(sdUUID, guid)
+
+        pv = lvm.getPV(guid)
+        return dict(size=str(pv.size))
+
     def _deatchStorageDomainFromOldPools(self, sdUUID):
         # We are called with blank pool uuid, to avoid changing exiting
         # API which we want to drop in next version anyway.
diff --git a/vdsm/storage/lvm.py b/vdsm/storage/lvm.py
index 12e988f..f93e5b9 100644
--- a/vdsm/storage/lvm.py
+++ b/vdsm/storage/lvm.py
@@ -867,6 +867,23 @@
     return unusedDevs, usedDevs
 
 
+def resizePV(vgName, guid):
+    """
+    In case the LUN was increased on storage server, in order to see the
+    changes it is needed to resize the PV after the multipath devices have
+    been resized
+
+    Raises se.CouldNotResizePhysicalVolume if pvresize fails
+    """
+    pvName = _fqpvname(guid)
+    cmd = ["pvresize", pvName]
+    rc, out, err = _lvminfo.cmd(cmd, (pvName,))
+    if rc != 0:
+        raise se.CouldNotResizePhysicalVolume(pvName, err)
+    _lvminfo._invalidatepvs(pvName)
+    _lvminfo._invalidatevgs(vgName)
+
+
 def getVG(vgName):
     vg = _lvminfo.getVg(vgName)  # returns single VG namedtuple
     if not vg:
diff --git a/vdsm/storage/sd.py b/vdsm/storage/sd.py
index a771abf..865cb39 100644
--- a/vdsm/storage/sd.py
+++ b/vdsm/storage/sd.py
@@ -794,6 +794,9 @@
     def extend(self, devlist, force):
         pass
 
+    def resizePV(self, guid):
+        pass
+
     def isMaster(self):
         return self.getMetaParam(DMDK_ROLE).capitalize() == MASTER_DOMAIN
 
diff --git a/vdsm/storage/sp.py b/vdsm/storage/sp.py
index 34a8fbf..8574bac 100644
--- a/vdsm/storage/sp.py
+++ b/vdsm/storage/sp.py
@@ -1946,6 +1946,10 @@
         self.validatePoolSD(sdUUID)
         sdCache.produce(sdUUID).extend(devlist, force)
 
+    def resizePV(self, sdUUID, guid):
+        self.validatePoolSD(sdUUID)
+        sdCache.produce(sdUUID).resizePV(guid)
+
     def setSDDescription(self, sd, description):
         self.validatePoolSD(sd.sdUUID)
         sd.setDescription(descr=description)
diff --git a/vdsm/storage/storage_exception.py b/vdsm/storage/storage_exception.py
index 1cfc8e4..d0ca6f9 100644
--- a/vdsm/storage/storage_exception.py
+++ b/vdsm/storage/storage_exception.py
@@ -1514,6 +1514,13 @@
                  issue and how to resolve it"""
 
 
+class CouldNotResizePhysicalVolume(StorageException):
+    def __init__(self, pvname, err):
+        self.value = "pvname=%s err=%s" % (pvname, err)
+    code = 615
+    message = "Could not resize PV"
+
+
 #################################################
 #  SPM/HSM Exceptions
 #################################################


-- 
To view, visit https://gerrit.ovirt.org/40467
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I38f9e603a66adbe2655173b8043766f6c04a7913
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Freddy Rolland <frolland at redhat.com>
Gerrit-Reviewer: Fred Rolland <frolland at redhat.com>


More information about the vdsm-patches mailing list