Merge the various forms of transaction commit & abort records

Enterprise / PostgreSQL - Andres Freund [anarazel.de] - 15 March 2015 11:37 UTC

Since 465883b0a two versions of commit records have existed. A compact
version that was used when no cache invalidations, smgr unlinks and similar were needed, and a full version that could deal with all that. Additionally the full version was embedded into twophase commit records.

That resulted in a measurable reduction in the size of the logged WAL in some workloads. But more recently additions like logical decoding, which e.g. needs information about the database something was executed on, made it applicable in fewer situations. The static split generally made it hard to expand the commit record, because concerns over the size made it hard to add anything to the compact version.

Additionally it's not particularly pretty to have twophase.c insert RM_XACT records.

Rejigger things so that the commit and abort records only have one form each, including the twophase equivalents. The presence of the various optional (in the sense of not being in every record) pieces is indicated by a bits in the 'xinfo' flag. That flag previously was not included in compact commit records. To prevent an increase in size due to its presence, it's only included if necessary; signalled by a bit in the xl_info bits available for xact.c, similar to heapam.c's XLOG_HEAP_OPMASK/XLOG_HEAP_INIT_PAGE.

Twophase commit/aborts are now the same as their normal counterparts. The original transaction's xid is included in an optional data field.

This means that commit records generally are smaller, except in the case of a transaction with subtransactions, but no other special cases; the increase there is four bytes, which seems acceptable given that the more common case of not having subtransactions shrank. The savings are especially measurable for twophase commits, which previously always used the full version; but will in practice only infrequently have required that.

The motivation for this work are not the space savings and and deduplication though; it's that it makes it easier to extend commit records with additional information. That's just a few lines of code now; without impacting the common case where that information is not needed.

Discussion: 20150220152150.GD4149@awork2.anarazel.de, 235610.92468.qm%40web29004.mail.ird.yahoo.com

4f1b890 Merge the various forms of transaction commit & abort records.
src/backend/access/rmgrdesc/xactdesc.c | 245 ++++++++++-----
src/backend/access/transam/twophase.c | 59 +---
src/backend/access/transam/xact.c | 475 ++++++++++++++++++------------
src/backend/access/transam/xlog.c | 126 ++++----
src/backend/replication/logical/decode.c | 133 +++------
src/include/access/xact.h | 215 ++++++++++----
src/include/access/xlog_internal.h | 2 +-
7 files changed, 748 insertions(+), 507 deletions(-)

Upstream: git.postgresql.org


  • Share