pgsql: Forget about targeting catalog cache invalidations by tuple TID.

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Forget about targeting catalog cache invalidations by tuple TID.
Date: 2011-08-16 19:26:53
Message-ID: E1QtPHp-0005De-Ar@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Forget about targeting catalog cache invalidations by tuple TID.

The TID isn't stable enough: we might queue an sinval event before a VACUUM
FULL, and then process it afterwards, when the target tuple no longer has
the same TID. So we must invalidate entries on the basis of hash value
only. The old coding can be shown to result in various bizarre,
hard-to-reproduce errors in the presence of concurrent VACUUM FULLs on
system catalogs, and could easily result in permanent catalog corruption,
up to and including complete loss of tables.

This commit is just a minimal fix that removes the unsafe comparison.
We should remove transmission of the tuple TID from sinval messages
altogether, and then arrange to suppress the extra message in the common
case of a heap_update that doesn't change the key hashvalue. But that's
going to be much more invasive, and will only produce a probably-marginal
performance gain, so it doesn't seem like material for a back-patch.

Back-patch to 9.0. Before that, VACUUM FULL refused to do any tuple moving
if it found any INSERT_IN_PROGRESS or DELETE_IN_PROGRESS tuples (and
CLUSTER would give up altogether), so there was no risk of moving a tuple
that might be the subject of an unsent sinval message.

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/632ae6829f7abda34e15082c91d9dfb3fc0f298b

Modified Files
--------------
src/backend/utils/cache/catcache.c | 35 ++++++++++++++---------------------
1 files changed, 14 insertions(+), 21 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Tom Lane 2011-08-16 23:28:09 pgsql: Revise sinval code to remove no-longer-used tuple TID from inval
Previous Message Tom Lane 2011-08-16 18:38:55 pgsql: Fix incorrect order of operations during sinval reset processing