lib/repo: Allow min-free-space-size and -percent to co-exist
authorUmang Jain <umang@endlessm.com>
Mon, 16 Jul 2018 12:27:20 +0000 (17:57 +0530)
committerAtomic Bot <atomic-devel@projectatomic.io>
Fri, 20 Jul 2018 14:58:40 +0000 (14:58 +0000)
Previously, we would error out if both of the options were mentioned
in the config file (even if one of them is disabled with 0). There
were few suggestions that this behavior was not quite right.

Therefore, instead of throwing error and exiting, it's preferred to
warn the user. Hence, the solution that worked out is:
* Allow both options to exist simulateneously
* Check each config's value and decide:
  * If both are present and are non-zero, warn the user. Also, prefer
    to use min-free-space-size over the another.
  * If both are absent, then use -percent=3% as fallback
  * Every other case is valid hence, no warning

https://phabricator.endlessm.com/T13698
(cherry picked from commit be68991cf80f0aa1da7d36ab6e1d2c4d6c7cd3fb)
Signed-off-by: Robert McQueen <rob@endlessm.com>
Closes: #1685
Approved by: cgwalters

man/ostree.repo-config.xml
src/libostree/ostree-repo.c

index 602d412e7b7132ab3f107c9a108dbb83778ff19f..4aedc13869debfa77bd4440401f5274415db4852 100644 (file)
@@ -121,7 +121,10 @@ Boston, MA 02111-1307, USA.
         <term><varname>min-free-space-percent</varname></term>
         <listitem><para>Integer percentage value (0-99) that specifies a minimum
         percentage of total space (in blocks) in the underlying filesystem to
-        keep free. The default value is 3.</para></listitem>
+        keep free. The default value is 3.</para>
+        <para>In case this option is co-existing with min-free-space-size (see below),
+        it would be ignored and min-free-space-size check would be enforced instead.
+        </para></listitem>
       </varlistentry>
 
      <varlistentry>
index cae38e6d85850de966d988932ab2e96466ebcd57..f4dcb703fc1f3146fe11634181987941da16b5eb 100644 (file)
@@ -2818,12 +2818,10 @@ reload_core_config (OstreeRepo          *self,
   }
 
   {
-    if (g_key_file_has_key (self->config, "core", "min-free-space-size", NULL) &&
-        g_key_file_has_key (self->config, "core", "min-free-space-percent", NULL))
-      {
-        return glnx_throw (error, "min-free-space-percent and min-free-space-size are mutually exclusive");
-      }
-    else if (g_key_file_has_key (self->config, "core", "min-free-space-size", NULL))
+    /* Try to parse both min-free-space-* config options first. If both are absent, fallback on 3% free space.
+     * If both are present and are non-zero, use min-free-space-size unconditionally and display a warning.
+     */
+    if (g_key_file_has_key (self->config, "core", "min-free-space-size", NULL))
       {
         g_autofree char *min_free_space_size_str = NULL;
 
@@ -2835,21 +2833,31 @@ reload_core_config (OstreeRepo          *self,
         if (!min_free_space_size_validate_and_convert (self, min_free_space_size_str, error))
           return glnx_prefix_error (error, "Invalid min-free-space-size '%s'", min_free_space_size_str);
       }
-    else
+
+    if (g_key_file_has_key (self->config, "core", "min-free-space-percent", NULL))
       {
         g_autofree char *min_free_space_percent_str = NULL;
-        /* If changing this, be sure to change the man page too */
-        const char *default_min_free_space = "3";
 
         if (!ot_keyfile_get_value_with_default (self->config, "core", "min-free-space-percent",
-                                                default_min_free_space,
-                                                &min_free_space_percent_str, error))
+                                                NULL, &min_free_space_percent_str, error))
           return FALSE;
 
         self->min_free_space_percent = g_ascii_strtoull (min_free_space_percent_str, NULL, 10);
         if (self->min_free_space_percent > 99)
           return glnx_throw (error, "Invalid min-free-space-percent '%s'", min_free_space_percent_str);
       }
+    else if (!g_key_file_has_key (self->config, "core", "min-free-space-size", NULL))
+      {
+        /* Default fallback of 3% free space. If changing this, be sure to change the man page too */
+        self->min_free_space_percent = 3;
+        self->min_free_space_mb = 0;
+      }
+
+    if (self->min_free_space_percent != 0 && self->min_free_space_mb != 0)
+      {
+        self->min_free_space_percent = 0;
+        g_debug ("Both min-free-space-percent and -size are mentioned in config. Enforcing min-free-space-size check only.");
+      }
   }
 
   {