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