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)