postgresql/src/include
Tom Lane 5e4dd5f63b Fix race condition with toast table access from a stale syscache entry.
If a tuple in a syscache contains an out-of-line toasted field, and we
try to fetch that field shortly after some other transaction has committed
an update or deletion of the tuple, there is a race condition: vacuum
could come along and remove the toast tuples before we can fetch them.
This leads to transient failures like "missing chunk number 0 for toast
value NNNNN in pg_toast_2619", as seen in recent reports from Andrew
Hammond and Tim Uckun.

The design idea of syscache is that access to stale syscache entries
should be prevented by relation-level locks, but that fails for at least
two cases where toasted fields are possible: ANALYZE updates pg_statistic
rows without locking out sessions that might want to plan queries on the
same table, and CREATE OR REPLACE FUNCTION updates pg_proc rows without
any meaningful lock at all.

The least risky fix seems to be an idea that Heikki suggested when we
were dealing with a related problem back in August: forcibly detoast any
out-of-line fields before putting a tuple into syscache in the first place.
This avoids the problem because at the time we fetch the parent tuple from
the catalog, we should be holding an MVCC snapshot that will prevent
removal of the toast tuples, even if the parent tuple is outdated
immediately after we fetch it.  (Note: I'm not convinced that this
statement holds true at every instant where we could be fetching a syscache
entry at all, but it does appear to hold true at the times where we could
fetch an entry that could have a toasted field.  We will need to be a bit
wary of adding toast tables to low-level catalogs that don't have them
already.)  An additional benefit is that subsequent uses of the syscache
entry should be faster, since they won't have to detoast the field.

Back-patch to all supported versions.  The problem is significantly harder
to reproduce in pre-9.0 releases, because of their willingness to flush
every entry in a syscache whenever the underlying catalog is vacuumed
(cf CatalogCacheFlushRelation); but there is still a window for trouble.
2011-11-01 19:48:43 -04:00
..
access Fix race condition with toast table access from a stale syscache entry. 2011-11-01 19:48:43 -04:00
bootstrap Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
catalog Rethink behavior of CREATE OR REPLACE during CREATE EXTENSION. 2011-07-23 16:59:49 -04:00
commands Fix #include problems in 9.1 branch. 2011-09-04 19:10:09 -04:00
executor Install defenses against overflow in BuildTupleHashTable(). 2011-05-23 12:52:46 -04:00
foreign pgindent run before PG 9.1 beta 1. 2011-04-10 11:42:00 -04:00
lib Use a macro variable PG_PRINTF_ATTRIBUTE for the style used for checking printf type functions. 2011-04-28 10:56:14 -04:00
libpq pgindent run before PG 9.1 beta 1. 2011-04-10 11:42:00 -04:00
mb Fix char2wchar/wchar2char to support collations properly. 2011-04-23 12:35:41 -04:00
nodes Don't trust deferred-unique indexes for join removal. 2011-10-23 00:43:45 -04:00
optimizer Fix nested PlaceHolderVar expressions that appear only in targetlists. 2011-08-09 00:48:58 -04:00
parser Fix handling of collations in multi-row VALUES constructs. 2011-04-18 15:31:52 -04:00
port Revert "Force use of "%I64d" format for 64 bit ints on MinGW." 2011-04-27 14:55:18 -04:00
portability Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
postmaster Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
regex Teach regular expression operators to honor collations. 2011-04-10 18:03:09 -04:00
replication Back-patch assorted latch-related fixes. 2011-08-10 12:20:45 -04:00
rewrite pgindent run before PG 9.1 beta 1. 2011-04-10 11:42:00 -04:00
snowball Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
storage Fix #include problems in 9.1 branch. 2011-09-04 19:10:09 -04:00
tcop Revise the API for GUC variable assign hooks. 2011-04-07 00:12:02 -04:00
tsearch pgindent run before PG 9.1 beta 1. 2011-04-10 11:42:00 -04:00
utils Improve and simplify CREATE EXTENSION's management of GUC variables. 2011-10-05 20:44:22 -04:00
.gitignore Convert cvsignore to gitignore, and add .gitignore for build targets. 2010-09-22 12:57:04 +02:00
c.h Use a macro variable PG_PRINTF_ATTRIBUTE for the style used for checking printf type functions. 2011-04-28 10:56:14 -04:00
fmgr.h Pgindent run before 9.1 beta2. 2011-06-09 14:32:50 -04:00
funcapi.h Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
getaddrinfo.h Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
getopt_long.h Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
Makefile Add maintainer-check target 2011-03-28 22:56:52 +03:00
miscadmin.h Add postmaster/postgres undocumented -b option for binary upgrades. 2011-04-25 12:00:21 -04:00
pg_config.h.in Replace use of credential control messages with getsockopt(LOCAL_PEERCRED). 2011-05-31 16:10:46 -04:00
pg_config.h.win32 Stamp 9.1.1. 2011-09-22 17:57:57 -04:00
pg_config_manual.h Revert accidental change to pg_config_manual.h. 2011-10-09 22:23:30 -04:00
pg_trace.h Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
pgstat.h Fix VACUUM so that it always updates pg_class.reltuples/relpages. 2011-05-30 17:06:52 -04:00
pgtime.h Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
port.h setlocale() on Windows doesn't work correctly if the locale name contains 2011-09-01 11:10:23 +03:00
postgres.h Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
postgres_ext.h Remove cvs keywords from all files. 2010-09-20 22:08:53 +02:00
postgres_fe.h Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
rusagestub.h Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00
windowapi.h Stamp copyrights for year 2011. 2011-01-01 13:18:15 -05:00