Re: Reducing the cycle time for CLOBBER_CACHE_ALWAYS buildfarm members - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Reducing the cycle time for CLOBBER_CACHE_ALWAYS buildfarm members
Date
Msg-id 1799344.1624396289@sss.pgh.pa.us
Whole thread Raw
In response to Re: Reducing the cycle time for CLOBBER_CACHE_ALWAYS buildfarm members  (Andrew Dunstan <andrew@dunslane.net>)
Responses Re: Reducing the cycle time for CLOBBER_CACHE_ALWAYS buildfarm members
List pgsql-hackers
Andrew Dunstan <andrew@dunslane.net> writes:
> On 6/20/21 6:10 PM, Tom Lane wrote:
>> (3) Since this only works in v14 and up, older branches would
>> have to fall back to -DCLOBBER_CACHE_ALWAYS.  Perhaps we could
>> improve the buildfarm client script so that buildfarm owners
>> just configure "clobber_cache_testing => 1" and then the script
>> would do the right branch-dependent thing.

> Maybe. Let's see what you come up with.

Here's a couple of draft-quality patches --- one for initdb, one
for the buildfarm --- to implement this idea.  These are just
lightly tested; in particular I've not had the patience to run
full BF cycles to see how much is actually saved.

            regards, tom lane

diff --git a/doc/src/sgml/ref/initdb.sgml b/doc/src/sgml/ref/initdb.sgml
index afd344b4c0..3077530c7b 100644
--- a/doc/src/sgml/ref/initdb.sgml
+++ b/doc/src/sgml/ref/initdb.sgml
@@ -388,6 +388,17 @@ PostgreSQL documentation
     Other, less commonly used, options are also available:

     <variablelist>
+     <varlistentry>
+      <term><option>--clobber-cache</option></term>
+      <listitem>
+       <para>
+        Run the bootstrap backend with the
+        <literal>debug_invalidate_system_caches_always=1</literal> option.
+        This takes a very long time and is only of use for deep debugging.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>-d</option></term>
       <term><option>--debug</option></term>
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 152d21e88b..0945d70061 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -202,6 +202,9 @@ static bool authwarning = false;
 static const char *boot_options = "-F";
 static const char *backend_options = "--single -F -O -j -c search_path=pg_catalog -c exit_on_error=true";

+/* Additional switches to pass to backend (either boot or standalone) */
+static char *extra_options = "";
+
 static const char *const subdirs[] = {
     "global",
     "pg_wal/archive_status",
@@ -962,12 +965,12 @@ test_config_settings(void)
         test_buffs = MIN_BUFS_FOR_CONNS(test_conns);

         snprintf(cmd, sizeof(cmd),
-                 "\"%s\" --boot -x0 %s "
+                 "\"%s\" --boot -x0 %s %s "
                  "-c max_connections=%d "
                  "-c shared_buffers=%d "
                  "-c dynamic_shared_memory_type=%s "
                  "< \"%s\" > \"%s\" 2>&1",
-                 backend_exec, boot_options,
+                 backend_exec, boot_options, extra_options,
                  test_conns, test_buffs,
                  dynamic_shared_memory_type,
                  DEVNULL, DEVNULL);
@@ -998,12 +1001,12 @@ test_config_settings(void)
         }

         snprintf(cmd, sizeof(cmd),
-                 "\"%s\" --boot -x0 %s "
+                 "\"%s\" --boot -x0 %s %s "
                  "-c max_connections=%d "
                  "-c shared_buffers=%d "
                  "-c dynamic_shared_memory_type=%s "
                  "< \"%s\" > \"%s\" 2>&1",
-                 backend_exec, boot_options,
+                 backend_exec, boot_options, extra_options,
                  n_connections, test_buffs,
                  dynamic_shared_memory_type,
                  DEVNULL, DEVNULL);
@@ -1403,11 +1406,11 @@ bootstrap_template1(void)
     unsetenv("PGCLIENTENCODING");

     snprintf(cmd, sizeof(cmd),
-             "\"%s\" --boot -x1 -X %u %s %s %s",
+             "\"%s\" --boot -x1 -X %u %s %s %s %s",
              backend_exec,
              wal_segment_size_mb * (1024 * 1024),
              data_checksums ? "-k" : "",
-             boot_options,
+             boot_options, extra_options,
              debug ? "-d 5" : "");


@@ -2263,6 +2266,7 @@ usage(const char *progname)
     printf(_("  -X, --waldir=WALDIR       location for the write-ahead log directory\n"));
     printf(_("      --wal-segsize=SIZE    size of WAL segments, in megabytes\n"));
     printf(_("\nLess commonly used options:\n"));
+    printf(_("      --clobber-cache       use cache-clobbering debug option\n"));
     printf(_("  -d, --debug               generate lots of debugging output\n"));
     printf(_("  -L DIRECTORY              where to find the input files\n"));
     printf(_("  -n, --no-clean            do not clean up after errors\n"));
@@ -2863,8 +2867,8 @@ initialize_data_directory(void)
     fflush(stdout);

     snprintf(cmd, sizeof(cmd),
-             "\"%s\" %s template1 >%s",
-             backend_exec, backend_options,
+             "\"%s\" %s %s template1 >%s",
+             backend_exec, backend_options, extra_options,
              DEVNULL);

     PG_CMD_OPEN;
@@ -2943,6 +2947,7 @@ main(int argc, char *argv[])
         {"wal-segsize", required_argument, NULL, 12},
         {"data-checksums", no_argument, NULL, 'k'},
         {"allow-group-access", no_argument, NULL, 'g'},
+        {"clobber-cache", no_argument, NULL, 14},
         {NULL, 0, NULL, 0}
     };

@@ -3084,6 +3089,11 @@ main(int argc, char *argv[])
             case 'g':
                 SetDataDirectoryCreatePerm(PG_DIR_MODE_GROUP);
                 break;
+            case 14:
+                extra_options = psprintf("%s %s",
+                                         extra_options,
+                                         "-c debug_invalidate_system_caches_always=1");
+                break;
             default:
                 /* getopt_long already emitted a complaint */
                 fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
diff --git a/build-farm.conf.sample b/build-farm.conf.sample
index 7e80451..d7e6a62 100644
--- a/build-farm.conf.sample
+++ b/build-farm.conf.sample
@@ -98,6 +98,11 @@ my $confdir = File::Spec->rel2abs(File::Basename::dirname(__FILE__));
           --leak-check=no --gen-suppressions=all   --error-limit=no}
     ),

+    # if true run tests with debug_invalidate_system_caches_always=1, or
+    # the equivalent on older branches.  Do not set CLOBBER_CACHE_ALWAYS
+    # if you use this.
+    use_clobber_cache => undef,
+
     # path to directory with auxiliary web script
     # if relative, the must be relative to buildroot/branch
     # Now only used on older Msys installations
diff --git a/run_build.pl b/run_build.pl
index 9ed6056..5c945b0 100755
--- a/run_build.pl
+++ b/run_build.pl
@@ -178,6 +178,7 @@ my (
     $wait_timeout,              $use_accache,
     $use_valgrind,              $valgrind_options,
     $use_installcheck_parallel, $max_load_avg,
+    $use_clobber_cache,
     $archive_reports
   )
   = @PGBuild::conf{
@@ -186,7 +187,7 @@ my (
       use_vpath tar_log_cmd using_msvc extra_config make_jobs core_file_glob
       ccache_failure_remove wait_timeout use_accache
       use_valgrind valgrind_options use_installcheck_parallel max_load_avg
-      archive_reports)
+      use_clobber_cache archive_reports)
   };

 $ts_prefix = sprintf('%s:%-13s ', $animal, $branch);
@@ -651,6 +652,19 @@ if ($extra_config && $extra_config->{DEFAULT})
     }
 }

+if ($use_clobber_cache && ($branch eq 'HEAD' || $branch ge 'REL_14'))
+{
+    if (!exists $extra_config->{$branch})
+    {
+    $extra_config->{$branch} = ["debug_invalidate_system_caches_always = 1"];
+    }
+    else
+    {
+    push(@{ $extra_config->{$branch} },
+         "debug_invalidate_system_caches_always = 1");
+    }
+}
+
 if ($extra_config && $extra_config->{$branch})
 {
     my $tmpname = "$tmpdir/bfextra.conf";
@@ -1340,9 +1354,15 @@ sub initdb

     chdir $installdir;

+    my $initdbopts = qq{-A trust -U buildfarm --locale=$locale};
+
+    if ($use_clobber_cache && ($branch eq 'HEAD' || $branch ge 'REL_14'))
+    {
+        $initdbopts .= " --clobber-cache";
+    }
+
     @initout =
-      run_log(
-        qq{"bin/initdb" -A trust -U buildfarm --locale=$locale data-$locale});
+      run_log(qq{"bin/initdb" $initdbopts data-$locale});

     my $status = $? >> 8;

@@ -2370,6 +2390,17 @@ sub configure
             }
         }
     }
+    if ($use_clobber_cache && $branch ne 'HEAD' && $branch lt 'REL_14')
+    {
+        if (defined $env->{CPPFLAGS})
+        {
+        $env->{CPPFLAGS} .= " -DCLOBBER_CACHE_ALWAYS";
+        }
+        else
+        {
+        $env->{CPPFLAGS} = "-DCLOBBER_CACHE_ALWAYS";
+        }
+    }

     my $envstr = "";
     while (my ($key, $val) = each %$env)

pgsql-hackers by date:

Previous
From: Alexander Korotkov
Date:
Subject: Re: Decouple operator classes from index access methods
Next
From: Mike
Date:
Subject: Fwd: Emit namespace in post-copy output