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

Samantha N. Bueno sbueno+anaconda at redhat.com
Mon Dec 8 17:06:00 UTC 2014


On Mon, Dec 08, 2014 at 09:35:35AM +0100, Vratislav Podzimek wrote:
> 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.

https://bugzilla.redhat.com/show_bug.cgi?id=1083459 has been approved.

Samantha


More information about the anaconda-patches mailing list