Skip to content

Commit

Permalink
Fix include packages install size when downloading on root (#1224048)
Browse files Browse the repository at this point in the history
Anaconda must compute size for downloaded and installed packages when
testing free space for installed root.

Resolves: rhbz#1224048
  • Loading branch information
jkonecny12 committed Sep 10, 2015
1 parent 7f5e5dc commit d767f4e
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 11 deletions.
44 changes: 35 additions & 9 deletions pyanaconda/packaging/dnfpayload.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
DNF_CACHE_DIR = '/tmp/dnf.cache'
DNF_PLUGINCONF_DIR = '/tmp/dnf.pluginconf'
DNF_PACKAGE_CACHE_DIR_SUFFIX = 'dnf.package.cache'
INSTALL_ROOT_MPOINT = '/mnt/sysimage'
DOWNLOAD_MPOINTS = {'/tmp',
'/',
'/mnt/sysimage',
Expand Down Expand Up @@ -104,14 +105,19 @@ def paced_fn(self, *args):
return fn(self, *args)
return paced_fn

def _pick_mpoint(df, requested):
def _pick_mpoint(df, download_size, install_size):
def reasonable_mpoint(mpoint):
return mpoint in DOWNLOAD_MPOINTS

# reserve extra
requested = requested + Size("150 MB")
sufficients = {key : val for (key, val) in df.items() if val > requested
and reasonable_mpoint(key)}
requested = download_size
requested_root = requested + install_size
sufficients = {key : val for (key, val) in df.items()
# for root we need to take in count both download and install size
if ((key != INSTALL_ROOT_MPOINT and val > requested)
or val > requested_root) and reasonable_mpoint(key)}
log.debug('Estimated size: download %s & install %s - df: %s', requested,
(requested_root - requested), df)
log.info('Sufficient mountpoints found: %s', sufficients)

if not len(sufficients):
Expand Down Expand Up @@ -423,7 +429,7 @@ def _download_space(self):
return Size(0)

size = sum(tsi.installed.downloadsize for tsi in transaction)
return Size(size)
return Size(size) + Size("150 MB")

This comment has been minimized.

Copy link
@vpodzime

vpodzime Sep 10, 2015

I think the # reserve extra comment should be moved right above this line.


def _install_package(self, pkg_name, required=False):
try:
Expand All @@ -446,11 +452,10 @@ def _miss(self, exn):
sys.exit(1)

def _pick_download_location(self):
required = self._download_space
download_size = self._download_space
install_size = self._spaceRequired()
df_map = _df_map()
mpoint = _pick_mpoint(df_map, required)
log.info("Download space required: %s, use filesystem at: %s", required,
mpoint)
mpoint = _pick_mpoint(df_map, download_size, install_size)
if mpoint is None:
msg = "Not enough disk space to download the packages."
raise packaging.PayloadError(msg)
Expand Down Expand Up @@ -538,6 +543,27 @@ def repos(self):

@property
def spaceRequired(self):
size = self._spaceRequired()
download_size = self._download_space
valid_points = _df_map()
future_mpoints = dict()
for (key, val) in self.storage.mountpoints.items():
new_key = key
if key.endswith('/'):
new_key = key[:-1]
# we can ignore swap
if key.startswith('/') and ((INSTALL_ROOT_MPOINT + new_key) not in valid_points):
valid_points[INSTALL_ROOT_MPOINT + new_key] = val.format.freeSpaceEstimate(val.size)

m_points = _pick_mpoint(valid_points, download_size, size)
if not m_points or m_points == INSTALL_ROOT_MPOINT:
# download and install to the same mount point
size = size + download_size
log.debug("Instalation space required %s for mpoints %s", size, m_points)
return size


def _spaceRequired(self):
transaction = self._base.transaction
if transaction is None:
return Size("3000 MB")
Expand Down
4 changes: 2 additions & 2 deletions pyanaconda/ui/lib/space.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ def check(self):
free = Size(self.storage.fileSystemFreeSpace)
needed = self.payload.spaceRequired
log.info("fs space: %s needed: %s", free, needed)
self.success = (free >= needed)
self.success = (free > needed)
if not self.success:
self.deficit = needed - free
self.error_message = _(self.error_template) % self.deficit
Expand Down Expand Up @@ -106,7 +106,7 @@ def check(self):
free = Size(stat.f_bsize * stat.f_bfree)
needed = self.payload.spaceRequired
log.info("fs space: %s needed: %s", free, needed)
self.success = (free >= needed)
self.success = (free > needed)
if not self.success:
self.deficit = needed - free
self.error_message = _(self.error_template) % self.deficit
Expand Down

0 comments on commit d767f4e

Please sign in to comment.