summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2014-02-17 17:21:01 +0000
committerTom Lane2014-02-17 17:21:01 +0000
commit81f4c2867f37f1a2a1c5a4ce337d4f5cd3013bc1 (patch)
tree54a964095bf4d7139ed420086db9f68ae76a81cc
parent6fc2868e4f97c2918138f0cc43a54d64e6a810fd (diff)
Improve documentation about multixact IDs.
Per gripe from Josh Berkus.
-rw-r--r--doc/src/sgml/maintenance.sgml21
-rw-r--r--doc/src/sgml/release-9.3.sgml8
2 files changed, 17 insertions, 12 deletions
diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml
index 291f48a472f..f57c2818159 100644
--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -618,13 +618,16 @@ HINT: Stop the postmaster and use a standalone backend to VACUUM in "mydb".
</indexterm>
<para>
- <firstterm>Multixacts</> are used to implement row locking by
- multiple transactions: since there is limited space in the tuple
- header to store lock information, that information is stored as a
- multixact separately in the <filename>pg_multixact</> subdirectory,
- and only its ID is in the <structfield>xmax</> field
- in the tuple header.
- Similar to transaction IDs, multixact IDs are implemented as a
+ <firstterm>Multixact IDs</> are used to support row locking by
+ multiple transactions. Since there is only limited space in a tuple
+ header to store lock information, that information is encoded as
+ a <quote>multiple transaction ID</>, or multixact ID for short,
+ whenever there is more than one transaction concurrently locking a
+ row. Information about which transaction IDs are included in any
+ particular multixact ID is stored separately in
+ the <filename>pg_multixact</> subdirectory, and only the multixact ID
+ appears in the <structfield>xmax</> field in the tuple header.
+ Like transaction IDs, multixact IDs are implemented as a
32-bit counter and corresponding storage, all of which requires
careful aging management, storage cleanup, and wraparound handling.
</para>
@@ -636,8 +639,8 @@ HINT: Stop the postmaster and use a standalone backend to VACUUM in "mydb".
is replaced by a different value, which can be the zero value, a single
transaction ID, or a newer multixact ID. For each table,
<structname>pg_class</>.<structfield>relminmxid</> stores the oldest
- possible value still stored in any tuple of that table. Every time this
- value is older than
+ possible multixact ID still appearing in any tuple of that table.
+ If this value is older than
<xref linkend="guc-vacuum-multixact-freeze-table-age">, a whole-table
scan is forced. Whole-table <command>VACUUM</> scans, regardless of
what causes them, enable advancing the value for that table.
diff --git a/doc/src/sgml/release-9.3.sgml b/doc/src/sgml/release-9.3.sgml
index acc0b9d2024..11e429bb65d 100644
--- a/doc/src/sgml/release-9.3.sgml
+++ b/doc/src/sgml/release-9.3.sgml
@@ -64,9 +64,11 @@ Branch: REL9_3_STABLE [8e9a16ab8] 2013-12-16 11:29:51 -0300
</para>
<para>
- The method for tuple freezing was unable to handle some cases
- involving freezing of <quote>multixact</> IDs, with the practical
- effect that shared row-level locks might be forgotten once old enough.
+ The logic for tuple freezing was unable to handle some cases involving
+ freezing of
+ <link linkend="vacuum-for-multixact-wraparound"><firstterm>multixact</>
+ IDs</link>, with the practical effect that shared row-level locks
+ might be forgotten once old enough.
</para>
<para>