Andrew Dunstan <and...@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)

Reply via email to