1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-27 22:56:53 +03:00

Change recently added test code for stability

The test code added with ff9f111bce24 fails under valgrind, and probably
other slow cases too, because if (say) autovacuum runs in between and
produces WAL of its own, the large INSERT fails to account for that in
the LSN calculations.  Rewrite to use a DO loop.

Per complaint from Andres Freund

Backpatch to all branches.

Discussion: https://postgr.es/m/20211013180338.5guyqzpkcisqugrl@alap3.anarazel.de
This commit is contained in:
Alvaro Herrera 2021-10-13 18:49:27 -03:00
parent eb55dcbeed
commit 41cce23261
No known key found for this signature in database
GPG Key ID: 1C20ACB9D5C564AE

View File

@ -22,34 +22,34 @@ $node->init(allows_streaming => 1);
$node->append_conf('postgresql.conf', 'wal_keep_segments=16'); $node->append_conf('postgresql.conf', 'wal_keep_segments=16');
$node->start; $node->start;
$node->safe_psql('postgres', 'create table filler (a int)'); $node->safe_psql('postgres', 'create table filler (a int, b text)');
# First, measure how many bytes does the insertion of 1000 rows produce
my $start_lsn =
$node->safe_psql('postgres', q{select pg_current_wal_insert_lsn() - '0/0'});
$node->safe_psql('postgres',
'insert into filler select * from generate_series(1, 1000)');
my $end_lsn =
$node->safe_psql('postgres', q{select pg_current_wal_insert_lsn() - '0/0'});
my $rows_walsize = $end_lsn - $start_lsn;
# Now consume all remaining room in the current WAL segment, leaving # Now consume all remaining room in the current WAL segment, leaving
# space enough only for the start of a largish record. # space enough only for the start of a largish record.
$node->safe_psql( $node->safe_psql(
'postgres', qq{ 'postgres', q{
WITH segsize AS ( DO $$
SELECT setting::int DECLARE
FROM pg_settings WHERE name = 'wal_segment_size' wal_segsize int :=
), walblksz AS ( (max(setting) filter (where name = 'wal_segment_size'))::int *
SELECT setting::int (max(setting) filter (where name = 'wal_block_size'))::int from pg_settings ;
FROM pg_settings WHERE name = 'wal_block_size' remain int;
), setting AS ( iters int := 0;
SELECT segsize.setting * walblksz.setting AS wal_segsize BEGIN
FROM segsize, walblksz LOOP
) INSERT into filler
INSERT INTO filler select g, repeat(md5(g::text), (random() * 60 + 1)::int)
SELECT g FROM setting, from generate_series(1, 10) g;
generate_series(1, 1000 * (wal_segsize - ((pg_current_wal_insert_lsn() - '0/0') % wal_segsize)) / $rows_walsize) g
remain := wal_segsize - (pg_current_wal_insert_lsn() - '0/0') % wal_segsize;
IF remain < 2 * setting::int from pg_settings where name = 'block_size' THEN
RAISE log 'exiting after % iterations, % bytes to end of WAL segment', iters, remain;
EXIT;
END IF;
iters := iters + 1;
END LOOP;
END
$$;
}); });
my $initfile = $node->safe_psql('postgres', my $initfile = $node->safe_psql('postgres',