postgresql/contrib
Alvaro Herrera e3ad3ffa68 Fix handling of multixacts predating pg_upgrade
After pg_upgrade, it is possible that some tuples' Xmax have multixacts
corresponding to the old installation; such multixacts cannot have
running members anymore.  In many code sites we already know not to read
them and clobber them silently, but at least when VACUUM tries to freeze
a multixact or determine whether one needs freezing, there's an attempt
to resolve it to its member transactions by calling GetMultiXactIdMembers,
and if the multixact value is "in the future" with regards to the
current valid multixact range, an error like this is raised:
    ERROR:  MultiXactId 123 has not been created yet -- apparent wraparound
and vacuuming fails.  Per discussion with Andrew Gierth, it is completely
bogus to try to resolve multixacts coming from before a pg_upgrade,
regardless of where they stand with regards to the current valid
multixact range.

It's possible to get from under this problem by doing SELECT FOR UPDATE
of the problem tuples, but if tables are large, this is slow and
tedious, so a more thorough solution is desirable.

To fix, we realize that multixacts in xmax created in 9.2 and previous
have a specific bit pattern that is never used in 9.3 and later (we
already knew this, per comments and infomask tests sprinkled in various
places, but we weren't leveraging this knowledge appropriately).
Whenever the infomask of the tuple matches that bit pattern, we just
ignore the multixact completely as if Xmax wasn't set; or, in the case
of tuple freezing, we act as if an unwanted value is set and clobber it
without decoding.  This guarantees that no errors will be raised, and
that the values will be progressively removed until all tables are
clean.  Most callers of GetMultiXactIdMembers are patched to recognize
directly that the value is a removable "empty" multixact and avoid
calling GetMultiXactIdMembers altogether.

To avoid changing the signature of GetMultiXactIdMembers() in back
branches, we keep the "allow_old" boolean flag but rename it to
"from_pgupgrade"; if the flag is true, we always return an empty set
instead of looking up the multixact.  (I suppose we could remove the
argument in the master branch, but I chose not to do so in this commit).

This was broken all along, but the error-facing message appeared first
because of commit 8e9a16ab8f and was partially fixed in a25c2b7c4d.
This fix, backpatched all the way back to 9.3, goes approximately in the
same direction as a25c2b7c4d but should cover all cases.

Bug analysis by Andrew Gierth and Álvaro Herrera.

A number of public reports match this bug:
  https://www.postgresql.org/message-id/20140330040029.GY4582@tamriel.snowman.net
  https://www.postgresql.org/message-id/538F3D70.6080902@publicrelay.com
  https://www.postgresql.org/message-id/556439CF.7070109@pscs.co.uk
  https://www.postgresql.org/message-id/SG2PR06MB0760098A111C88E31BD4D96FB3540@SG2PR06MB0760.apcprd06.prod.outlook.com
  https://www.postgresql.org/message-id/20160615203829.5798.4594@wrigleys.postgresql.org
2016-06-24 18:29:28 -04:00
..
adminpack Update copyright for 2016 2016-01-02 13:33:40 -05:00
auth_delay Update copyright for 2016 2016-01-02 14:19:48 -05:00
auto_explain pgindent run for 9.6 2016-06-09 18:02:36 -04:00
bloom Minor fixes in contrib installation scripts. 2016-06-14 10:47:06 -04:00
btree_gin pgindent run for 9.5 2015-05-23 21:35:49 -04:00
btree_gist Handle contrib's GIN/GIST support function signature changes honestly. 2016-06-09 16:44:25 -04:00
chkpass Avoid returning undefined bytes in chkpass_in(). 2015-02-14 12:20:56 -05:00
citext Schema-qualify some references to regprocedure. 2016-06-10 10:41:58 -04:00
cube Update extensions with GIN/GIST support for parallel query. 2016-06-14 13:34:37 -04:00
dblink Fix parallel-safety markings for contrib/dblink. 2016-06-17 23:08:21 -04:00
dict_int Update copyright for 2016 2016-01-02 13:33:40 -05:00
dict_xsyn Update copyright for 2016 2016-01-02 13:33:40 -05:00
earthdistance Update earthdistance extension for parallel query. 2016-06-07 11:26:41 -04:00
file_fdw pgindent run for 9.6 2016-06-09 18:02:36 -04:00
fuzzystrmatch Update fuzzystrmatch extension for parallel query. 2016-06-07 11:26:41 -04:00
hstore Update extensions with GIN/GIST support for parallel query. 2016-06-14 13:34:37 -04:00
hstore_plperl Minor fixes in contrib installation scripts. 2016-06-14 10:47:06 -04:00
hstore_plpython Minor fixes in contrib installation scripts. 2016-06-14 10:47:06 -04:00
intagg Schema-qualify some references to regprocedure. 2016-06-10 10:41:58 -04:00
intarray Update extensions with GIN/GIST support for parallel query. 2016-06-14 13:34:37 -04:00
isn pgindent run for 9.6 2016-06-09 18:02:36 -04:00
lo Update lo extension for parallel query. 2016-06-07 11:26:42 -04:00
ltree Update extensions with GIN/GIST support for parallel query. 2016-06-14 13:34:37 -04:00
ltree_plpython Minor fixes in contrib installation scripts. 2016-06-14 10:47:06 -04:00
oid2name Add file version information to most installed Windows binaries. 2014-07-14 14:07:52 -04:00
pageinspect pgindent run for 9.6 2016-06-09 18:02:36 -04:00
passwordcheck Update copyright for 2016 2016-01-02 13:33:40 -05:00
pg_buffercache Update pg_buffercache extension for parallel query. 2016-06-09 17:18:12 -04:00
pg_freespacemap Update pg_freespacemap extension for parallel query. 2016-06-09 17:18:16 -04:00
pg_prewarm Update pg_prewarm extension for parallel query. 2016-06-09 17:18:18 -04:00
pg_standby Don't use function definitions looking like old-style ones. 2015-08-15 17:25:00 +02:00
pg_stat_statements Update pg_stat_statements extension for parallel query. 2016-06-10 10:42:01 -04:00
pg_trgm pg_trgm's set_limit() function is parallel unsafe, not parallel restricted. 2016-06-20 11:29:54 -04:00
pg_visibility pg_visibility: Add pg_truncate_visibility_map function. 2016-06-17 17:37:30 -04:00
pgcrypto Minor fixes in contrib installation scripts. 2016-06-14 10:47:06 -04:00
pgrowlocks Fix handling of multixacts predating pg_upgrade 2016-06-24 18:29:28 -04:00
pgstattuple Minor fixes in contrib installation scripts. 2016-06-14 10:47:06 -04:00
postgres_fdw postgres_fdw: Fix incorrect NULL handling in join pushdown. 2016-06-24 15:14:15 -04:00
seg Update extensions with GIN/GIST support for parallel query. 2016-06-14 13:34:37 -04:00
sepgsql Don't use !! but != 0/NULL to force boolean evaluation. 2016-03-27 18:10:19 +02:00
spi Widen query numbers-of-tuples-processed counters to uint64. 2016-03-12 16:05:29 -05:00
sslinfo Update sslinfo extension for parallel query. 2016-06-14 14:52:55 -04:00
start-scripts Fix typo in linux startup script. 2015-04-26 09:43:15 -04:00
tablefunc Widen query numbers-of-tuples-processed counters to uint64. 2016-03-12 16:05:29 -05:00
tcn Revert CREATE INDEX ... INCLUDING ... 2016-04-08 21:52:13 +03:00
test_decoding pgindent run for 9.6 2016-06-09 18:02:36 -04:00
tsearch2 Update contrib/tsearch2/expected/tsearch2_1.out for phrase FTS. 2016-06-04 00:49:42 -04:00
tsm_system_rows Update copyright for 2016 2016-01-02 13:33:40 -05:00
tsm_system_time Update copyright for 2016 2016-01-02 13:33:40 -05:00
unaccent Update unaccent extension for parallel query. 2016-06-14 14:55:49 -04:00
uuid-ossp Update uuid-ossp extension for parallel query. 2016-06-14 14:56:21 -04:00
vacuumlo Update copyright for 2016 2016-01-02 13:33:40 -05:00
xml2 Update xml2 extension for parallel query. 2016-06-14 15:49:32 -04:00
Makefile Bloom index contrib module 2016-04-01 16:42:24 +03:00
README Rename 'gmake' to 'make' in docs and recommended commands 2014-02-12 17:29:19 -05:00
contrib-global.mk Respect TEMP_CONFIG when pg_regress_check and friends are called 2016-02-27 12:28:21 -05:00

README

The PostgreSQL contrib tree
---------------------------

This subtree contains porting tools, analysis utilities, and plug-in
features that are not part of the core PostgreSQL system, mainly
because they address a limited audience or are too experimental to be
part of the main source tree.  This does not preclude their
usefulness.

User documentation for each module appears in the main SGML
documentation.

When building from the source distribution, these modules are not
built automatically, unless you build the "world" target.  You can
also build and install them all by running "make all" and "make
install" in this directory; or to build and install just one selected
module, do the same in that module's subdirectory.

Some directories supply new user-defined functions, operators, or
types.  To make use of one of these modules, after you have installed
the code you need to register the new SQL objects in the database
system by executing a CREATE EXTENSION command.  In a fresh database,
you can simply do

    CREATE EXTENSION module_name;

See the PostgreSQL documentation for more information about this
procedure.