postgresql/src/test/isolation/expected/vacuum-no-cleanup-lock.out

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

190 lines
4.3 KiB
Plaintext
Raw Normal View History

Set relfrozenxid to oldest extant XID seen by VACUUM. When VACUUM set relfrozenxid before now, it set it to whatever value was used to determine which tuples to freeze -- the FreezeLimit cutoff. This approach was very naive. The relfrozenxid invariant only requires that new relfrozenxid values be <= the oldest extant XID remaining in the table (at the point that the VACUUM operation ends), which in general might be much more recent than FreezeLimit. VACUUM now carefully tracks the oldest remaining XID/MultiXactId as it goes (the oldest remaining values _after_ lazy_scan_prune processing). The final values are set as the table's new relfrozenxid and new relminmxid in pg_class at the end of each VACUUM. The oldest XID might come from a tuple's xmin, xmax, or xvac fields. It might even come from one of the table's remaining MultiXacts. Final relfrozenxid values must still be >= FreezeLimit in an aggressive VACUUM (FreezeLimit still acts as a lower bound on the final value that aggressive VACUUM can set relfrozenxid to). Since standard VACUUMs still make no guarantees about advancing relfrozenxid, they might as well set relfrozenxid to a value from well before FreezeLimit when the opportunity presents itself. In general standard VACUUMs may now set relfrozenxid to any value > the original relfrozenxid and <= OldestXmin. Credit for the general idea of using the oldest extant XID to set pg_class.relfrozenxid at the end of VACUUM goes to Andres Freund. Author: Peter Geoghegan <pg@bowt.ie> Reviewed-By: Andres Freund <andres@anarazel.de> Reviewed-By: Robert Haas <robertmhaas@gmail.com> Discussion: https://postgr.es/m/CAH2-WzkymFbz6D_vL+jmqSn_5q1wsFvFrE+37yLgL_Rkfd6Gzg@mail.gmail.com
2022-04-03 18:57:21 +02:00
Parsed test spec with 4 sessions
starting permutation: vacuumer_pg_class_stats dml_insert vacuumer_nonaggressive_vacuum vacuumer_pg_class_stats
step vacuumer_pg_class_stats:
SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass;
relpages|reltuples
--------+---------
1| 20
(1 row)
step dml_insert:
INSERT INTO smalltbl SELECT max(id) + 1 FROM smalltbl;
step vacuumer_nonaggressive_vacuum:
VACUUM smalltbl;
step vacuumer_pg_class_stats:
SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass;
relpages|reltuples
--------+---------
1| 21
(1 row)
starting permutation: vacuumer_pg_class_stats dml_insert pinholder_cursor vacuumer_nonaggressive_vacuum vacuumer_pg_class_stats pinholder_commit
step vacuumer_pg_class_stats:
SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass;
relpages|reltuples
--------+---------
1| 20
(1 row)
step dml_insert:
INSERT INTO smalltbl SELECT max(id) + 1 FROM smalltbl;
step pinholder_cursor:
BEGIN;
DECLARE c1 CURSOR FOR SELECT 1 AS dummy FROM smalltbl;
FETCH NEXT FROM c1;
dummy
-----
1
(1 row)
step vacuumer_nonaggressive_vacuum:
VACUUM smalltbl;
step vacuumer_pg_class_stats:
SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass;
relpages|reltuples
--------+---------
1| 21
(1 row)
step pinholder_commit:
COMMIT;
starting permutation: vacuumer_pg_class_stats pinholder_cursor dml_insert dml_delete dml_insert vacuumer_nonaggressive_vacuum vacuumer_pg_class_stats pinholder_commit
step vacuumer_pg_class_stats:
SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass;
relpages|reltuples
--------+---------
1| 20
(1 row)
step pinholder_cursor:
BEGIN;
DECLARE c1 CURSOR FOR SELECT 1 AS dummy FROM smalltbl;
FETCH NEXT FROM c1;
dummy
-----
1
(1 row)
step dml_insert:
INSERT INTO smalltbl SELECT max(id) + 1 FROM smalltbl;
step dml_delete:
DELETE FROM smalltbl WHERE id = (SELECT min(id) FROM smalltbl);
step dml_insert:
INSERT INTO smalltbl SELECT max(id) + 1 FROM smalltbl;
step vacuumer_nonaggressive_vacuum:
VACUUM smalltbl;
step vacuumer_pg_class_stats:
SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass;
relpages|reltuples
--------+---------
1| 21
(1 row)
step pinholder_commit:
COMMIT;
starting permutation: vacuumer_pg_class_stats dml_insert dml_delete pinholder_cursor dml_insert vacuumer_nonaggressive_vacuum vacuumer_pg_class_stats pinholder_commit
step vacuumer_pg_class_stats:
SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass;
relpages|reltuples
--------+---------
1| 20
(1 row)
step dml_insert:
INSERT INTO smalltbl SELECT max(id) + 1 FROM smalltbl;
step dml_delete:
DELETE FROM smalltbl WHERE id = (SELECT min(id) FROM smalltbl);
step pinholder_cursor:
BEGIN;
DECLARE c1 CURSOR FOR SELECT 1 AS dummy FROM smalltbl;
FETCH NEXT FROM c1;
dummy
-----
1
(1 row)
step dml_insert:
INSERT INTO smalltbl SELECT max(id) + 1 FROM smalltbl;
step vacuumer_nonaggressive_vacuum:
VACUUM smalltbl;
step vacuumer_pg_class_stats:
SELECT relpages, reltuples FROM pg_class WHERE oid = 'smalltbl'::regclass;
relpages|reltuples
--------+---------
1| 21
(1 row)
step pinholder_commit:
COMMIT;
starting permutation: dml_begin dml_other_begin dml_key_share dml_other_key_share vacuumer_nonaggressive_vacuum pinholder_cursor dml_other_update dml_commit dml_other_commit vacuumer_nonaggressive_vacuum pinholder_commit vacuumer_nonaggressive_vacuum
step dml_begin: BEGIN;
step dml_other_begin: BEGIN;
step dml_key_share: SELECT id FROM smalltbl WHERE id = 3 FOR KEY SHARE;
id
--
3
(1 row)
step dml_other_key_share: SELECT id FROM smalltbl WHERE id = 3 FOR KEY SHARE;
id
--
3
(1 row)
step vacuumer_nonaggressive_vacuum:
VACUUM smalltbl;
step pinholder_cursor:
BEGIN;
DECLARE c1 CURSOR FOR SELECT 1 AS dummy FROM smalltbl;
FETCH NEXT FROM c1;
dummy
-----
1
(1 row)
step dml_other_update: UPDATE smalltbl SET t = 'u' WHERE id = 3;
step dml_commit: COMMIT;
step dml_other_commit: COMMIT;
step vacuumer_nonaggressive_vacuum:
VACUUM smalltbl;
step pinholder_commit:
COMMIT;
step vacuumer_nonaggressive_vacuum:
VACUUM smalltbl;