[rhel6-branch] [PATCH] Limit the maximum swap size to 10 % of disk space

Vratislav Podzimek vpodzime at redhat.com
Mon Jan 7 12:50:29 UTC 2013


On Fri, 2013-01-04 at 10:04 -0600, David Lehman wrote:
> On Fri, 2013-01-04 at 16:20 +0100, Vratislav Podzimek wrote:
> > On e.g. virtual machines with smalls disks and high amount of
> > memory it doesn't make sense to create large swap space leaving
> > only a little for the system and user data.
> 
> We talked about this before and I expressed concerns about only
> calculating the swap suggestion once when the disk set and clearpart
> settings can change during installation. Is this handled at all?
No it isn't. I would still like to push this patch because it makes a
lot of cases (tests) work. I'm afraid I'm not able to fix this properly
(with recalculations when clearpart settings change) in a short period
of time. If in any period of time.

> 
> > 
> > Also change comment to a docstring and document parameters.
> > 
> > Related: rhbz#878907
> > 
> > Signed-off-by: Vratislav Podzimek <vpodzime at redhat.com>
> > ---
> >  iutil.py            | 28 ++++++++++++++++++++++++----
> >  kickstart.py        | 20 +++++++++++++++++---
> >  storage/__init__.py | 15 +++++++++++++++
> >  3 files changed, 56 insertions(+), 7 deletions(-)
> > 
> > diff --git a/iutil.py b/iutil.py
> > index 3e3f903..3a9a583 100644
> > --- a/iutil.py
> > +++ b/iutil.py
> > @@ -40,6 +40,9 @@ import logging
> >  log = logging.getLogger("anaconda")
> >  program_log = logging.getLogger("program")
> >  
> > +# maximum ratio of swap size to disk size (10%)
> > +MAX_SWAP_DISK_RATIO = 0.1
> > +
> >  #Python reimplementation of the shell tee process, so we can
> >  #feed the pipe output into two places at the same time
> >  class tee(threading.Thread):
> > @@ -450,10 +453,17 @@ def memInstalled():
> >  
> >      return long(mem)
> >  
> > -## Suggest the size of the swap partition that will be created.
> > -# @param quiet Should size information be logged?
> > -# @return A tuple of the minimum and maximum swap size, in megabytes.
> > -def swapSuggestion(quiet=0, hibernation=False):
> > +def swapSuggestion(quiet=0, hibernation=False, disk_space=None):
> > +    """
> > +    Suggest the size of the swap partition that will be created.
> > +
> > +    @param quiet: Should size information be logged?
> > +    @param hibernation: Suggest size of the swap partition to support hibernation?
> > +    @param disk_space: Total disk space available
> > +    @return: A tuple of the minimum and maximum swap size, in megabytes.
> > +
> > +    """
> > +
> >      mem = memInstalled()/1024
> >      mem = ((mem/16)+1)*16
> >      if not quiet:
> > @@ -479,6 +489,16 @@ def swapSuggestion(quiet=0, hibernation=False):
> >          else:
> >              log.info("Ignoring --hibernation option on systems with 64 GB of RAM or more")
> >  
> > +    if disk_space is not None:
> > +        max_swap = int(disk_space * MAX_SWAP_DISK_RATIO)
> > +        if swap > max_swap:
> > +            log.info("Suggested swap size (%(swap)d M) exceeds %(percent)d %% of "
> > +                     "disk space, using %(percent)d %% of disk space (%(size)d M) "
> > +                     "instead." % {"percent": MAX_SWAP_DISK_RATIO*100,
> > +                                   "swap": swap,
> > +                                   "size": max_swap})
> > +            swap = max_swap
> > +
> >      if not quiet:
> >  	log.info("Swap attempt of %sM", swap)
> >  
> > diff --git a/kickstart.py b/kickstart.py
> > index e4b960a..4a4ce43 100644
> > --- a/kickstart.py
> > +++ b/kickstart.py
> > @@ -481,11 +481,18 @@ class LogVolData(commands.logvol.RHEL6_LogVolData):
> >          # we might have truncated or otherwise changed the specified vg name
> >          vgname = anaconda.id.ksdata.onPart.get(self.vgname, self.vgname)
> >  
> > +        disk_space = 0
> > +        for disk in storage.disks:
> > +            if not storage.clearPartDisks \
> > +                    or disk.name in storage.clearPartDisks:
> > +                disk_space += disk.size
> > +
> >          if self.mountpoint == "swap":
> >              type = "swap"
> >              self.mountpoint = ""
> >              if self.recommended or self.hibernation:
> > -                (self.size, self.maxSizeMB) = iutil.swapSuggestion(hibernation=self.hibernation)
> > +                (self.size, self.maxSizeMB) = \
> > +                    iutil.swapSuggestion(hibernation=self.hibernation, disk_space=disk_space)
> >                  self.grow = True
> >          else:
> >              if self.fstype != "":
> > @@ -498,7 +505,7 @@ class LogVolData(commands.logvol.RHEL6_LogVolData):
> >              raise KickstartValueError, formatErrorMsg(self.lineno, msg="The mount point \"%s\" is not valid." % (self.mountpoint,))
> >  
> >          # Check that the VG this LV is a member of has already been specified.
> > -        vg = devicetree.getDeviceByName(vgname)
> > +        vg = devicetree.getDeviceByName(self.vgname)
> >          if not vg:
> >              raise KickstartValueError, formatErrorMsg(self.lineno, msg="No volume group exists with the name \"%s\".  Specify volume groups before logical volumes." % self.vgname)
> >  
> 
> Drop the chunk above. It reverses part of another recent commit.
Good catch, thanks! I'll fix this locally.

-- 
Vratislav Podzimek

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



More information about the anaconda-patches mailing list