mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Improve stability of test with vacuum_truncate in reloptions.sql
This test has been using a simple VACUUM with pg_relation_size() to
check if a relation gets physically truncated or not, but forgot the
fact that some concurrent activity, like checkpoint buffer writes, could
cause some pages to be skipped.  The second test enabling
vacuum_truncate could fail, seeing a non-empty relation.  The first test
would not have failed, but could finish by testing a behavior different
than the one aimed for.  Both tests gain a FREEZE option, to make the
vacuums more aggressive and prevent page skips.
This is similar to the issues fixed in c2dc1a7.
Author: Arseny Sher
Reviewed-by: Masahiko Sawada
Discussion: https://postgr.es/m/87tuotr2hh.fsf@ars-thinkpad
backpatch-through: 12
			
			
This commit is contained in:
		@@ -102,7 +102,8 @@ SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
 | 
				
			|||||||
INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL);
 | 
					INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL);
 | 
				
			||||||
ERROR:  null value in column "i" violates not-null constraint
 | 
					ERROR:  null value in column "i" violates not-null constraint
 | 
				
			||||||
DETAIL:  Failing row contains (null, null).
 | 
					DETAIL:  Failing row contains (null, null).
 | 
				
			||||||
VACUUM reloptions_test;
 | 
					-- Do an aggressive vacuum to prevent page-skipping.
 | 
				
			||||||
 | 
					VACUUM FREEZE reloptions_test;
 | 
				
			||||||
SELECT pg_relation_size('reloptions_test') > 0;
 | 
					SELECT pg_relation_size('reloptions_test') > 0;
 | 
				
			||||||
 ?column? 
 | 
					 ?column? 
 | 
				
			||||||
----------
 | 
					----------
 | 
				
			||||||
@@ -127,7 +128,8 @@ SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
 | 
				
			|||||||
INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL);
 | 
					INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL);
 | 
				
			||||||
ERROR:  null value in column "i" violates not-null constraint
 | 
					ERROR:  null value in column "i" violates not-null constraint
 | 
				
			||||||
DETAIL:  Failing row contains (null, null).
 | 
					DETAIL:  Failing row contains (null, null).
 | 
				
			||||||
VACUUM reloptions_test;
 | 
					-- Do an aggressive vacuum to prevent page-skipping.
 | 
				
			||||||
 | 
					VACUUM FREEZE reloptions_test;
 | 
				
			||||||
SELECT pg_relation_size('reloptions_test') = 0;
 | 
					SELECT pg_relation_size('reloptions_test') = 0;
 | 
				
			||||||
 ?column? 
 | 
					 ?column? 
 | 
				
			||||||
----------
 | 
					----------
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,7 +61,8 @@ CREATE TABLE reloptions_test(i INT NOT NULL, j text)
 | 
				
			|||||||
	autovacuum_enabled=false);
 | 
						autovacuum_enabled=false);
 | 
				
			||||||
SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
 | 
					SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
 | 
				
			||||||
INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL);
 | 
					INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL);
 | 
				
			||||||
VACUUM reloptions_test;
 | 
					-- Do an aggressive vacuum to prevent page-skipping.
 | 
				
			||||||
 | 
					VACUUM FREEZE reloptions_test;
 | 
				
			||||||
SELECT pg_relation_size('reloptions_test') > 0;
 | 
					SELECT pg_relation_size('reloptions_test') > 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SELECT reloptions FROM pg_class WHERE oid =
 | 
					SELECT reloptions FROM pg_class WHERE oid =
 | 
				
			||||||
@@ -71,7 +72,8 @@ SELECT reloptions FROM pg_class WHERE oid =
 | 
				
			|||||||
ALTER TABLE reloptions_test RESET (vacuum_truncate);
 | 
					ALTER TABLE reloptions_test RESET (vacuum_truncate);
 | 
				
			||||||
SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
 | 
					SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass;
 | 
				
			||||||
INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL);
 | 
					INSERT INTO reloptions_test VALUES (1, NULL), (NULL, NULL);
 | 
				
			||||||
VACUUM reloptions_test;
 | 
					-- Do an aggressive vacuum to prevent page-skipping.
 | 
				
			||||||
 | 
					VACUUM FREEZE reloptions_test;
 | 
				
			||||||
SELECT pg_relation_size('reloptions_test') = 0;
 | 
					SELECT pg_relation_size('reloptions_test') = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- Test toast.* options
 | 
					-- Test toast.* options
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user