[f23-branch 1/2] Fix include packages install size when downloading on root (#1224048)

jkonecny12 installerbot-noreply at redhat.com
Thu Sep 10 12:40:36 UTC 2015


From: Jiri Konecny <jkonecny at redhat.com>

Anaconda must compute size for downloaded and installed packages when
testing free space for installed root.

Resolves: rhbz#1224048
---
 pyanaconda/packaging/dnfpayload.py | 44 ++++++++++++++++++++++++++++++--------
 pyanaconda/ui/lib/space.py         |  4 ++--
 2 files changed, 37 insertions(+), 11 deletions(-)

diff --git a/pyanaconda/packaging/dnfpayload.py b/pyanaconda/packaging/dnfpayload.py
index ed83d50..e645205 100644
--- a/pyanaconda/packaging/dnfpayload.py
+++ b/pyanaconda/packaging/dnfpayload.py
@@ -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',
@@ -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):
@@ -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")
 
     def _install_package(self, pkg_name, required=False):
         try:
@@ -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)
@@ -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")
diff --git a/pyanaconda/ui/lib/space.py b/pyanaconda/ui/lib/space.py
index a133c8b..067e4d8 100644
--- a/pyanaconda/ui/lib/space.py
+++ b/pyanaconda/ui/lib/space.py
@@ -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
@@ -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


-- 
To view this commit on github, visit https://github.com/rhinstaller/anaconda/commit/d767f4e29916c016208012ad869c9478e0d7ff70


More information about the anaconda-patches mailing list