Change in vdsm[master]: gluster: fix brick devices are created with incorrect data a...

tjeyasin at redhat.com tjeyasin at redhat.com
Mon Nov 2 12:31:53 UTC 2015


Timothy Asir has uploaded a new change for review.

Change subject: gluster: fix brick devices are created with incorrect data alignment
......................................................................

gluster: fix brick devices are created with incorrect data alignment

Removed make partition function and pv create will not create
any partition on the given device.

Change-Id: I58cc322cb5140de2d2006d59b4c1dceaba2e5968
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1270792
Signed-off-by: Timothy Asir Jeyasingh <tjeyasin at redhat.com>
---
M vdsm/gluster/storagedev.py
1 file changed, 28 insertions(+), 44 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/59/47959/1

diff --git a/vdsm/gluster/storagedev.py b/vdsm/gluster/storagedev.py
index 1e4402c..4da753e 100644
--- a/vdsm/gluster/storagedev.py
+++ b/vdsm/gluster/storagedev.py
@@ -76,7 +76,7 @@
             'uuid': '',
             'createBrick': createBrick}
     if isinstance(device.size, blivet.size.Size):
-        info['size'] = '%s' % device.size.convertTo(spec="MiB")
+        info['size'] = '%s' % device.size.convertTo(blivet.size.MiB)
     else:
         info['size'] = '%s' % device.size
     if not info['bus'] and device.parents:
@@ -137,49 +137,24 @@
         return [blivetEnv.devicetree.getDeviceByName(devName.split("/")[-1])
                 for devName in devNameList]
 
-    def _makePartition(deviceList):
-        pvDeviceList = []
-        doPartitioning = False
-        for dev in deviceList:
-            if dev.type not in ['disk', 'dm-multipath']:
-                pvDeviceList.append(dev)
-            else:
-                blivetEnv.initializeDisk(dev)
-                part = blivetEnv.newPartition(fmt_type="lvmpv", grow=True,
-                                              parents=[dev])
-                blivetEnv.createDevice(part)
-                pvDeviceList.append(part)
-                doPartitioning = True
-
-        if doPartitioning:
-            blivet.partitioning.doPartitioning(blivetEnv)
-        return pvDeviceList
-
     def _createPV(deviceList, alignment=0):
-        def _createAlignedPV(deviceList, alignment):
-            for dev in deviceList:
-                # bz#1178705: Blivet always creates pv with 1MB dataalignment
-                # Workaround: Till blivet fixes the issue, we use lvm pvcreate
+        for dev in deviceList:
+            # bz#1178705: Blivet always creates pv with 1MB dataalignment
+            # Workaround: Till blivet fixes the issue, we use lvm pvcreate
+            if alignment:
                 rc, out, err = utils.execCmd([_pvCreateCommandPath.cmd,
                                               '--dataalignment',
                                               '%sk' % alignment,
                                               dev.path])
-                if rc:
-                    raise ge.GlusterHostStorageDevicePVCreateFailedException(
-                        dev.path, alignment, rc, out, err)
-            _reset_blivet(blivetEnv)
-            return _getDeviceList([dev.name for dev in deviceList])
+            else:
+                rc, out, err = utils.execCmd([_pvCreateCommandPath.cmd,
+                                              dev.path])
 
-        if alignment:
-            blivetEnv.doIt()
-            return _createAlignedPV(deviceList, alignment)
-
-        for dev in deviceList:
-            lvmpv = blivet.formats.getFormat("lvmpv", device=dev.path)
-            blivetEnv.formatDevice(dev, lvmpv)
-
-        blivet.partitioning.doPartitioning(blivetEnv)
-        return deviceList
+            if rc:
+                raise ge.GlusterHostStorageDevicePVCreateFailedException(
+                    dev.path, alignment, rc, out, err)
+        _reset_blivet(blivetEnv)
+        return _getDeviceList([dev.name for dev in deviceList])
 
     def _createVG(vgName, deviceList, stripeSize=0):
         if stripeSize:
@@ -204,8 +179,11 @@
         if not alignment:
             # bz#1180228: blivet doesn't handle percentage-based sizes properly
             # Workaround: Till the bz gets fixed, we take only 99% size from vg
+            vgSizeByte = (vg.size * 99 / 100).convertTo(blivet.size.B)
+            # calculate roundSize to avoid 'Size is not a multiple of 512' error
             pool = LVMThinPoolDevice(poolName, parents=[vg],
-                                     size=(vg.size * 99 / 100),
+                                     size=blivet.size.Size(
+                                         (vgSizeByte - vgSizeByte % 512)),
                                      grow=True)
             blivetEnv.createDevice(pool)
             return pool
@@ -283,8 +261,7 @@
     if inUseList:
         raise ge.GlusterHostStorageDeviceInUseException(inUseList)
 
-    pvDeviceList = _makePartition(deviceList)
-    pvDeviceList = _createPV(pvDeviceList, alignment)
+    pvDeviceList = _createPV(deviceList, alignment)
     vg = _createVG(vgName, pvDeviceList, raidParams.get('stripeSize', 0))
 
     # The following calculation is based on the redhat storage performance doc
@@ -297,8 +274,8 @@
     # and create data LV (poolDataSize) that has a size which is
     # a multiple of stripe width
     if alignment:
-        vgSizeKib = int(vg.size.convertTo(spec="KiB"))
-        if vg.size.convertTo(spec='MiB') < MIN_VG_SIZE:
+        vgSizeKib = int(vg.size.convertTo(blivet.size.KiB))
+        if vg.size.convertTo(blivet.size.MiB) < MIN_VG_SIZE:
             metaDataSize = vgSizeKib * MIN_METADATA_PERCENT
         poolDataSize = vgSizeKib - metaDataSize
         metaDataSize = (metaDataSize - (metaDataSize % alignment))
@@ -308,8 +285,15 @@
     # lvconvert --chunksize alignment --thinpool VOLGROUP/thin_pool
     #     --poolmetadata VOLGROUP/metadata_device_name
     pool = _createThinPool(poolName, vg, chunkSize, metaDataSize, poolDataSize)
+
+    if alignment:
+        poolSize = pool.size
+    else:
+        # Calculate roundSize to avoid 'Size is not a multiple of 512' error
+        poolSize = pool.size.convertTo(blivet.size.B)/512 * 512
+
     thinlv = LVMThinLogicalVolumeDevice(brickName, parents=[pool],
-                                        size=pool.size, grow=True)
+                                        size=poolSize, grow=True)
     blivetEnv.createDevice(thinlv)
     blivetEnv.doIt()
 


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I58cc322cb5140de2d2006d59b4c1dceaba2e5968
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Timothy Asir <tjeyasin at redhat.com>


More information about the vdsm-patches mailing list