[PATCH] Count with the extra metadata extents for RAID consistently (#1065737)

Vratislav Podzimek vpodzime at redhat.com
Fri Feb 21 10:23:43 UTC 2014


When creating an LVM setup on top of RAID, we add some extra extents to make
sure the metadata will fit in. However, when reporting free space in a VG or
when creating an LV in a VG the size of which was pushed to the limit, we need
to take those extra metadata into account as well.

Signed-off-by: Vratislav Podzimek <vpodzime at redhat.com>
---
 blivet/devicefactory.py |  9 ++++++++-
 blivet/devices.py       | 10 ++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/blivet/devicefactory.py b/blivet/devicefactory.py
index 2d04005..5e0b7f1 100644
--- a/blivet/devicefactory.py
+++ b/blivet/devicefactory.py
@@ -1138,7 +1138,7 @@ class LVMFactory(DeviceFactory):
         if self.container and self.container.exists:
             return size
 
-        if self.container_size == 0:
+        if self.container_size == SIZE_POLICY_AUTO:
             # automatic container size management
             if self.container:
                 size += sum([p.size for p in self.container.parents])
@@ -1213,6 +1213,13 @@ class LVMFactory(DeviceFactory):
 
     def _get_new_device(self, *args, **kwargs):
         """ Create and return the factory device as a StorageDevice. """
+
+        if self.container_raid_level and self.container_size in [SIZE_POLICY_AUTO,
+                                                                 SIZE_POLICY_MAX]:
+            # container pushed to the limit, but we need some extra space for
+            # metadata, so we need to make the LV smaller
+            extra_md_space = LVM_PE_SIZE * len(self.disks) * 5
+            kwargs["size"] -= extra_md_space
         return self.storage.newLV(*args, **kwargs)
 
     def _set_name(self):
diff --git a/blivet/devices.py b/blivet/devices.py
index a607c1b..215b464 100644
--- a/blivet/devices.py
+++ b/blivet/devices.py
@@ -2424,9 +2424,19 @@ class LVMVolumeGroupDevice(DMDevice):
         """ The amount of free space in this VG (in MB). """
         # TODO: just ask lvm if isModified returns False
 
+        # get the number of disks used by PVs on RAID (if any)
+        raid_disks = 0
+        for pv in self.pvs:
+            if isinstance(pv, MDRaidArrayDevice):
+                raid_disks = max([raid_disks, len(pv.disks)])
+
         # total the sizes of any LVs
         log.debug("%s size is %dMB" % (self.name, self.size))
         used = sum(lv.vgSpaceUsed for lv in self.lvs) + self.snapshotSpace
+        if raid_disks:
+            # LV on RAID allocates (5 * num_disks) extra extents for metadata
+            # (see the devicefactory.LVMFactory._get_total_space method)
+            used += len(self.lvs) * 5 * raid_disks * self.peSize
         used += self.reservedSpace
         used += self.poolMetaData
         free = self.size - used
-- 
1.8.5.3



More information about the anaconda-patches mailing list