Commit c2dc1a79 authored by Tom Lane's avatar Tom Lane

Disable vacuum page skipping in selected test cases.

By default VACUUM will skip pages that it can't immediately get
exclusive access to, which means that even activities as harmless
and unpredictable as checkpoint buffer writes might prevent a page
from being processed.  Ordinarily this is no big deal, but we have
a small number of test cases that examine the results of VACUUM's
processing and therefore will fail if the page of interest is skipped.
This seems to be the explanation for some rare buildfarm failures.
To fix, add the DISABLE_PAGE_SKIPPING option to the VACUUM commands
in tests where this could be an issue.

In passing, remove a duplicated query in pageinspect/sql/page.sql.

Back-patch as necessary (some of these cases are as old as v10).

Discussion: https://postgr.es/m/413923.1611006484@sss.pgh.pa.us
parent 6b4d3046
...@@ -109,7 +109,7 @@ ERROR: ending block number must be between 0 and 0 ...@@ -109,7 +109,7 @@ ERROR: ending block number must be between 0 and 0
SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 10000, endblock := 11000); SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 10000, endblock := 11000);
ERROR: starting block number must be between 0 and 0 ERROR: starting block number must be between 0 and 0
-- Vacuum freeze to change the xids encountered in subsequent tests -- Vacuum freeze to change the xids encountered in subsequent tests
VACUUM FREEZE heaptest; VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) heaptest;
-- Check that valid options are not rejected nor corruption reported -- Check that valid options are not rejected nor corruption reported
-- for a non-empty frozen table -- for a non-empty frozen table
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'none'); SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'none');
......
...@@ -51,7 +51,7 @@ SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 0, endblock := ...@@ -51,7 +51,7 @@ SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 0, endblock :=
SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 10000, endblock := 11000); SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 10000, endblock := 11000);
-- Vacuum freeze to change the xids encountered in subsequent tests -- Vacuum freeze to change the xids encountered in subsequent tests
VACUUM FREEZE heaptest; VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) heaptest;
-- Check that valid options are not rejected nor corruption reported -- Check that valid options are not rejected nor corruption reported
-- for a non-empty frozen table -- for a non-empty frozen table
......
...@@ -46,7 +46,7 @@ detects_heap_corruption( ...@@ -46,7 +46,7 @@ detects_heap_corruption(
# Check a corrupt table with all-frozen data # Check a corrupt table with all-frozen data
# #
fresh_test_table('test'); fresh_test_table('test');
$node->safe_psql('postgres', q(VACUUM FREEZE test)); $node->safe_psql('postgres', q(VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) test));
corrupt_first_page('test'); corrupt_first_page('test');
detects_heap_corruption("verify_heapam('test')", detects_heap_corruption("verify_heapam('test')",
"all-frozen corrupted table"); "all-frozen corrupted table");
......
CREATE EXTENSION pageinspect; CREATE EXTENSION pageinspect;
CREATE TABLE test1 (a int, b int); CREATE TABLE test1 (a int, b int);
INSERT INTO test1 VALUES (16777217, 131584); INSERT INTO test1 VALUES (16777217, 131584);
VACUUM test1; -- set up FSM VACUUM (DISABLE_PAGE_SKIPPING) test1; -- set up FSM
-- The page contents can vary, so just test that it can be read -- The page contents can vary, so just test that it can be read
-- successfully, but don't keep the output. -- successfully, but don't keep the output.
SELECT octet_length(get_raw_page('test1', 'main', 0)) AS main_0; SELECT octet_length(get_raw_page('test1', 'main', 0)) AS main_0;
...@@ -87,18 +87,8 @@ SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0)); ...@@ -87,18 +87,8 @@ SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0));
(1 row) (1 row)
-- If we freeze the only tuple on test1, the infomask should -- If we freeze the only tuple on test1, the infomask should
-- always be the same in all test runs. we show raw flags by -- always be the same in all test runs.
-- default: HEAP_XMIN_COMMITTED and HEAP_XMIN_INVALID. VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) test1;
VACUUM FREEZE test1;
SELECT t_infomask, t_infomask2, raw_flags, combined_flags
FROM heap_page_items(get_raw_page('test1', 0)),
LATERAL heap_tuple_infomask_flags(t_infomask, t_infomask2);
t_infomask | t_infomask2 | raw_flags | combined_flags
------------+-------------+-----------------------------------------------------------+--------------------
2816 | 2 | {HEAP_XMIN_COMMITTED,HEAP_XMIN_INVALID,HEAP_XMAX_INVALID} | {HEAP_XMIN_FROZEN}
(1 row)
SELECT t_infomask, t_infomask2, raw_flags, combined_flags SELECT t_infomask, t_infomask2, raw_flags, combined_flags
FROM heap_page_items(get_raw_page('test1', 0)), FROM heap_page_items(get_raw_page('test1', 0)),
LATERAL heap_tuple_infomask_flags(t_infomask, t_infomask2); LATERAL heap_tuple_infomask_flags(t_infomask, t_infomask2);
......
...@@ -3,7 +3,7 @@ CREATE EXTENSION pageinspect; ...@@ -3,7 +3,7 @@ CREATE EXTENSION pageinspect;
CREATE TABLE test1 (a int, b int); CREATE TABLE test1 (a int, b int);
INSERT INTO test1 VALUES (16777217, 131584); INSERT INTO test1 VALUES (16777217, 131584);
VACUUM test1; -- set up FSM VACUUM (DISABLE_PAGE_SKIPPING) test1; -- set up FSM
-- The page contents can vary, so just test that it can be read -- The page contents can vary, so just test that it can be read
-- successfully, but don't keep the output. -- successfully, but don't keep the output.
...@@ -34,15 +34,9 @@ SELECT tuple_data_split('test1'::regclass, t_data, t_infomask, t_infomask2, t_bi ...@@ -34,15 +34,9 @@ SELECT tuple_data_split('test1'::regclass, t_data, t_infomask, t_infomask2, t_bi
SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0)); SELECT * FROM fsm_page_contents(get_raw_page('test1', 'fsm', 0));
-- If we freeze the only tuple on test1, the infomask should -- If we freeze the only tuple on test1, the infomask should
-- always be the same in all test runs. we show raw flags by -- always be the same in all test runs.
-- default: HEAP_XMIN_COMMITTED and HEAP_XMIN_INVALID. VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) test1;
SELECT t_infomask, t_infomask2, raw_flags, combined_flags
FROM heap_page_items(get_raw_page('test1', 0)),
LATERAL heap_tuple_infomask_flags(t_infomask, t_infomask2);
SELECT t_infomask, t_infomask2, raw_flags, combined_flags SELECT t_infomask, t_infomask2, raw_flags, combined_flags
FROM heap_page_items(get_raw_page('test1', 0)), FROM heap_page_items(get_raw_page('test1', 0)),
LATERAL heap_tuple_infomask_flags(t_infomask, t_infomask2); LATERAL heap_tuple_infomask_flags(t_infomask, t_infomask2);
......
...@@ -105,7 +105,7 @@ ERROR: "test_foreign_table" is not a table, materialized view, or TOAST table ...@@ -105,7 +105,7 @@ ERROR: "test_foreign_table" is not a table, materialized view, or TOAST table
create table regular_table (a int, b text); create table regular_table (a int, b text);
alter table regular_table alter column b set storage external; alter table regular_table alter column b set storage external;
insert into regular_table values (1, repeat('one', 1000)), (2, repeat('two', 1000)); insert into regular_table values (1, repeat('one', 1000)), (2, repeat('two', 1000));
vacuum regular_table; vacuum (disable_page_skipping) regular_table;
select count(*) > 0 from pg_visibility('regular_table'); select count(*) > 0 from pg_visibility('regular_table');
?column? ?column?
---------- ----------
...@@ -132,7 +132,7 @@ select count(*) > 0 from pg_visibility((select reltoastrelid from pg_class where ...@@ -132,7 +132,7 @@ select count(*) > 0 from pg_visibility((select reltoastrelid from pg_class where
(1 row) (1 row)
create materialized view matview_visibility_test as select * from regular_table; create materialized view matview_visibility_test as select * from regular_table;
vacuum matview_visibility_test; vacuum (disable_page_skipping) matview_visibility_test;
select count(*) > 0 from pg_visibility('matview_visibility_test'); select count(*) > 0 from pg_visibility('matview_visibility_test');
?column? ?column?
---------- ----------
...@@ -149,7 +149,7 @@ select count(*) > 0 from pg_visibility('matview_visibility_test'); ...@@ -149,7 +149,7 @@ select count(*) > 0 from pg_visibility('matview_visibility_test');
-- regular tables which are part of a partition *do* have visibility maps -- regular tables which are part of a partition *do* have visibility maps
insert into test_partition values (1); insert into test_partition values (1);
vacuum test_partition; vacuum (disable_page_skipping) test_partition;
select count(*) > 0 from pg_visibility('test_partition', 0); select count(*) > 0 from pg_visibility('test_partition', 0);
?column? ?column?
---------- ----------
......
...@@ -71,7 +71,7 @@ select pg_truncate_visibility_map('test_foreign_table'); ...@@ -71,7 +71,7 @@ select pg_truncate_visibility_map('test_foreign_table');
create table regular_table (a int, b text); create table regular_table (a int, b text);
alter table regular_table alter column b set storage external; alter table regular_table alter column b set storage external;
insert into regular_table values (1, repeat('one', 1000)), (2, repeat('two', 1000)); insert into regular_table values (1, repeat('one', 1000)), (2, repeat('two', 1000));
vacuum regular_table; vacuum (disable_page_skipping) regular_table;
select count(*) > 0 from pg_visibility('regular_table'); select count(*) > 0 from pg_visibility('regular_table');
select count(*) > 0 from pg_visibility((select reltoastrelid from pg_class where relname = 'regular_table')); select count(*) > 0 from pg_visibility((select reltoastrelid from pg_class where relname = 'regular_table'));
truncate regular_table; truncate regular_table;
...@@ -79,7 +79,7 @@ select count(*) > 0 from pg_visibility('regular_table'); ...@@ -79,7 +79,7 @@ select count(*) > 0 from pg_visibility('regular_table');
select count(*) > 0 from pg_visibility((select reltoastrelid from pg_class where relname = 'regular_table')); select count(*) > 0 from pg_visibility((select reltoastrelid from pg_class where relname = 'regular_table'));
create materialized view matview_visibility_test as select * from regular_table; create materialized view matview_visibility_test as select * from regular_table;
vacuum matview_visibility_test; vacuum (disable_page_skipping) matview_visibility_test;
select count(*) > 0 from pg_visibility('matview_visibility_test'); select count(*) > 0 from pg_visibility('matview_visibility_test');
insert into regular_table values (1), (2); insert into regular_table values (1), (2);
refresh materialized view matview_visibility_test; refresh materialized view matview_visibility_test;
...@@ -87,7 +87,7 @@ select count(*) > 0 from pg_visibility('matview_visibility_test'); ...@@ -87,7 +87,7 @@ select count(*) > 0 from pg_visibility('matview_visibility_test');
-- regular tables which are part of a partition *do* have visibility maps -- regular tables which are part of a partition *do* have visibility maps
insert into test_partition values (1); insert into test_partition values (1);
vacuum test_partition; vacuum (disable_page_skipping) test_partition;
select count(*) > 0 from pg_visibility('test_partition', 0); select count(*) > 0 from pg_visibility('test_partition', 0);
select count(*) > 0 from pg_visibility_map('test_partition'); select count(*) > 0 from pg_visibility_map('test_partition');
select count(*) > 0 from pg_visibility_map_summary('test_partition'); select count(*) > 0 from pg_visibility_map_summary('test_partition');
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment