[rhel6] Shrink the LV if the VG is out of space (#1153376)

Vratislav Podzimek vpodzime at redhat.com
Mon Dec 8 08:35:35 UTC 2014


On Fri, 2014-12-05 at 12:27 -0800, Brian C. Lane wrote:
> lvm doesn't always create the sizes that we expect it to. This can lead
> to errors like this:
> 
> Volume group "VolGroup" has insufficient free space (1965 extents): 1968
> required.
> 
> This change checks the LV's size against the VG's actual free space and
> shrinks the LV to fit if it would be to big.
> 
> This is a port of commit 0c40779fa8f from python-blivet.
> 
> Resolves: rhbz#1153376
> ---
>  storage/devices.py | 33 +++++++++++++++++++++++++++++++++
>  1 file changed, 33 insertions(+)
> 
> diff --git a/storage/devices.py b/storage/devices.py
> index e179339..8bdf2a5 100644
> --- a/storage/devices.py
> +++ b/storage/devices.py
> @@ -2545,6 +2545,36 @@ class LVMLogicalVolumeDevice(DMDevice):
>  
>          return [validpvs[0].path]
>  
> +    def _preCreate(self):
> +        """ Adjust the size of the LV if there isn't enough space in the VG.
> +
> +        size calculations sometimes don't match what lvm actually creates,
> +        so check the actual free space of the VG and use that if the LV is
> +        too big.
> +        """
> +        try:
> +            vg_info = lvm.vginfo(self.vg.name)
> +        except errors.LVMError as lvmerr:
> +            log.error("Failed to get free space for the %s VG: %s", self.vg.name, lvmerr)
> +            # nothing more can be done, we don't know the VG's free space
> +            return
> +
> +        try:
> +            extent_size = float(vg_info["pe_size"])
> +            extents_free = int(vg_info["pe_free"])
> +        except ValueError as e:
> +            log.error("Failed to get PE information for the %s VG: %s", self.vg.name, e)
> +            return
> +
> +        log.debug("VG has %s free PEs of size %s", extents_free, extent_size)
> +
> +        can_use = extent_size * extents_free
> +        if self.size > can_use:
> +            msg = ("%s LV's size (%s) exceeds the VG's usable free space (%s),"
> +                    "shrinking the LV") % (self.name, self.size, can_use)
> +            log.warning(msg)
> +            self.size = can_use
> +
>      def create(self, intf=None):
>          """ Create the device. """
>          log_method_call(self, self.name, status=self.status)
> @@ -2561,6 +2591,9 @@ class LVMLogicalVolumeDevice(DMDevice):
>              self.createParents()
>              self.setupParents()
>  
> +            # Make sure the LV will fit into the real VG size
> +            self._preCreate()
> +
>              # should we use --zero for safety's sake?
>              if self.singlePV:
>                  lvm.lvcreate(self.vg.name, self._name, self.size, progress=w,
Looks good to me. We just need to remember we have this if we ever add
ThinP to RHEL6 anaconda because that required a follow-up patch in
python-blivet.

Also I always thought if we should just always do the shrink or if we
should put some threshold there so that we don't hide some real bug in
our partitioning code. That's more an idea for blivet/master than rhel6,
however.

-- 
Vratislav Podzimek

Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic



More information about the anaconda-patches mailing list