pgsql: Fix rare startup failure induced by MVCC-catalog-scans patch. - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Fix rare startup failure induced by MVCC-catalog-scans patch.
Date
Msg-id E1YdstN-00063u-E3@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Fix rare startup failure induced by MVCC-catalog-scans patch.

While a new backend nominally participates in sinval signaling starting
from the SharedInvalBackendInit call near the top of InitPostgres, it
cannot recognize sinval messages for unshared catalogs of its database
until it has set up MyDatabaseId.  This is not problematic for the catcache
or relcache, which by definition won't have loaded any data from or about
such catalogs before that point.  However, commit 568d4138c646cd7c
introduced a mechanism for re-using MVCC snapshots for catalog scans, and
made invalidation of those depend on recognizing relevant sinval messages.
So it's possible to establish a catalog snapshot to read pg_authid and
pg_database, then before we set MyDatabaseId, receive sinval messages that
should result in invalidating that snapshot --- but do not, because we
don't realize they are for our database.  This mechanism explains the
intermittent buildfarm failures we've seen since commit 31eae6028eca4365.
That commit was not itself at fault, but it introduced a new regression
test that does reconnections concurrently with the "vacuum full pg_am"
command in vacuum.sql.  This allowed the pre-existing error to be exposed,
given just the right timing, because we'd fail to update our information
about how to access pg_am.  In principle any VACUUM FULL on a system
catalog could have created a similar hazard for concurrent incoming
connections.  Perhaps there are more subtle failure cases as well.

To fix, force invalidation of the catalog snapshot as soon as we've
set MyDatabaseId.

Back-patch to 9.4 where the error was introduced.

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/bc49d9324a464fce8f60e1bc14531631883021d4

Modified Files
--------------
src/backend/utils/init/postinit.c |    8 ++++++++
1 file changed, 8 insertions(+)


pgsql-committers by date:

Previous
From: Fujii Masao
Date:
Subject: pgsql: Add markup for replaceable parameters to pg_rewind doc.
Next
From: Tom Lane
Date:
Subject: pgsql: Fix rare startup failure induced by MVCC-catalog-scans patch.