diff options
author | Thomas Munro <tmunro@postgresql.org> | 2019-08-28 13:37:03 +1200 |
---|---|---|
committer | Thomas Munro <tmunro@postgresql.org> | 2019-08-28 17:59:50 +1200 |
commit | eeb68c1cddf3cdbfbd543a7aa24e6cbbe0e31b16 (patch) | |
tree | 58b04dd7161a012f01e9c65940d6f7385b37cda4 /src/include/utils/snapmgr.h | |
parent | 19bfa15a8274a8429883d08ab4c5b3881ac65f07 (diff) |
Avoid catalog lookups in RelationAllowsEarlyPruning().
RelationAllowsEarlyPruning() performed a catalog scan, but is used
in two contexts where that was a bad idea:
1. In heap_page_prune_opt(), which runs very frequently in some large
scans. This caused major performance problems in a field report
that was easy to reproduce.
2. In TestForOldSnapshot(), which runs while we hold a buffer content
lock. It's not clear if this was guaranteed to be free of buffer
deadlock risk.
The check was introduced in commit 2cc41acd8 and defended against a
real problem: 9.6's hash indexes have no page LSN and so we can't
allow early pruning (ie the snapshot-too-old feature). We can remove
the check from all later releases though: hash indexes are now logged,
and there is no way to create UNLOGGED indexes on regular logged
tables.
If a future release allows such a combination, it might need to put
a similar check in place, but it'll need some more thought.
Back-patch to 10.
Author: Thomas Munro
Reviewed-by: Tom Lane, who spotted the second problem
Discussion: https://postgr.es/m/CA%2BhUKGKT8oTkp5jw_U4p0S-7UG9zsvtw_M47Y285bER6a2gD%2Bg%40mail.gmail.com
Discussion: https://postgr.es/m/CAA4eK1%2BWy%2BN4eE5zPm765h68LrkWc3Biu_8rzzi%2BOYX4j%2BiHRw%40mail.gmail.com
Diffstat (limited to 'src/include/utils/snapmgr.h')
-rw-r--r-- | src/include/utils/snapmgr.h | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 8585194e785..7b428fe9c01 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -40,7 +40,6 @@ RelationNeedsWAL(rel) \ && !IsCatalogRelation(rel) \ && !RelationIsAccessibleInLogicalDecoding(rel) \ - && !RelationHasUnloggedIndex(rel) \ ) #define EarlyPruningEnabled(rel) (old_snapshot_threshold >= 0 && RelationAllowsEarlyPruning(rel)) |