diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2014-12-03 11:53:02 -0300 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2014-12-03 11:53:02 -0300 |
commit | 73c986adde5d73a5e2555da9b5c8facedb146dcd (patch) | |
tree | 29ee4f6c800c3614cfd3316c7026e30e552e12a4 /src/backend/access/rmgrdesc | |
parent | 6597ec9be6a9ed50390f73235d6654ec32a0b944 (diff) | |
download | postgresql-73c986adde5d73a5e2555da9b5c8facedb146dcd.tar.gz postgresql-73c986adde5d73a5e2555da9b5c8facedb146dcd.zip |
Keep track of transaction commit timestamps
Transactions can now set their commit timestamp directly as they commit,
or an external transaction commit timestamp can be fed from an outside
system using the new function TransactionTreeSetCommitTsData(). This
data is crash-safe, and truncated at Xid freeze point, same as pg_clog.
This module is disabled by default because it causes a performance hit,
but can be enabled in postgresql.conf requiring only a server restart.
A new test in src/test/modules is included.
Catalog version bumped due to the new subdirectory within PGDATA and a
couple of new SQL functions.
Authors: Álvaro Herrera and Petr Jelínek
Reviewed to varying degrees by Michael Paquier, Andres Freund, Robert
Haas, Amit Kapila, Fujii Masao, Jaime Casanova, Simon Riggs, Steven
Singer, Peter Eisentraut
Diffstat (limited to 'src/backend/access/rmgrdesc')
-rw-r--r-- | src/backend/access/rmgrdesc/Makefile | 2 | ||||
-rw-r--r-- | src/backend/access/rmgrdesc/committsdesc.c | 82 | ||||
-rw-r--r-- | src/backend/access/rmgrdesc/xlogdesc.c | 3 |
3 files changed, 86 insertions, 1 deletions
diff --git a/src/backend/access/rmgrdesc/Makefile b/src/backend/access/rmgrdesc/Makefile index 32cb985036c..d18e8ec9980 100644 --- a/src/backend/access/rmgrdesc/Makefile +++ b/src/backend/access/rmgrdesc/Makefile @@ -8,7 +8,7 @@ subdir = src/backend/access/rmgrdesc top_builddir = ../../../.. include $(top_builddir)/src/Makefile.global -OBJS = brindesc.o clogdesc.o dbasedesc.o gindesc.o gistdesc.o \ +OBJS = brindesc.o clogdesc.o committsdesc.o dbasedesc.o gindesc.o gistdesc.o \ hashdesc.o heapdesc.o \ mxactdesc.o nbtdesc.o relmapdesc.o seqdesc.o smgrdesc.o spgdesc.o \ standbydesc.o tblspcdesc.o xactdesc.o xlogdesc.o diff --git a/src/backend/access/rmgrdesc/committsdesc.c b/src/backend/access/rmgrdesc/committsdesc.c new file mode 100644 index 00000000000..6efabd9db70 --- /dev/null +++ b/src/backend/access/rmgrdesc/committsdesc.c @@ -0,0 +1,82 @@ +/*------------------------------------------------------------------------- + * + * committsdesc.c + * rmgr descriptor routines for access/transam/commit_ts.c + * + * Portions Copyright (c) 1996-2014, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/access/rmgrdesc/committsdesc.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/commit_ts.h" +#include "utils/timestamp.h" + + +void +commit_ts_desc(StringInfo buf, XLogReaderState *record) +{ + char *rec = XLogRecGetData(record); + uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; + + if (info == COMMIT_TS_ZEROPAGE) + { + int pageno; + + memcpy(&pageno, rec, sizeof(int)); + appendStringInfo(buf, "%d", pageno); + } + else if (info == COMMIT_TS_TRUNCATE) + { + int pageno; + + memcpy(&pageno, rec, sizeof(int)); + appendStringInfo(buf, "%d", pageno); + } + else if (info == COMMIT_TS_SETTS) + { + xl_commit_ts_set *xlrec = (xl_commit_ts_set *) rec; + int nsubxids; + + appendStringInfo(buf, "set %s/%d for: %u", + timestamptz_to_str(xlrec->timestamp), + xlrec->nodeid, + xlrec->mainxid); + nsubxids = ((XLogRecGetDataLen(record) - SizeOfCommitTsSet) / + sizeof(TransactionId)); + if (nsubxids > 0) + { + int i; + TransactionId *subxids; + + subxids = palloc(sizeof(TransactionId) * nsubxids); + memcpy(subxids, + XLogRecGetData(record) + SizeOfCommitTsSet, + sizeof(TransactionId) * nsubxids); + for (i = 0; i < nsubxids; i++) + appendStringInfo(buf, ", %u", subxids[i]); + pfree(subxids); + } + } +} + +const char * +commit_ts_identify(uint8 info) +{ + switch (info) + { + case COMMIT_TS_ZEROPAGE: + return "ZEROPAGE"; + case COMMIT_TS_TRUNCATE: + return "TRUNCATE"; + case COMMIT_TS_SETTS: + return "SETTS"; + default: + return NULL; + } +} diff --git a/src/backend/access/rmgrdesc/xlogdesc.c b/src/backend/access/rmgrdesc/xlogdesc.c index eba046d1fa9..6b5fea96d7b 100644 --- a/src/backend/access/rmgrdesc/xlogdesc.c +++ b/src/backend/access/rmgrdesc/xlogdesc.c @@ -45,6 +45,7 @@ xlog_desc(StringInfo buf, XLogReaderState *record) appendStringInfo(buf, "redo %X/%X; " "tli %u; prev tli %u; fpw %s; xid %u/%u; oid %u; multi %u; offset %u; " "oldest xid %u in DB %u; oldest multi %u in DB %u; " + "oldest/newest commit timestamp xid: %u/%u; " "oldest running xid %u; %s", (uint32) (checkpoint->redo >> 32), (uint32) checkpoint->redo, checkpoint->ThisTimeLineID, @@ -58,6 +59,8 @@ xlog_desc(StringInfo buf, XLogReaderState *record) checkpoint->oldestXidDB, checkpoint->oldestMulti, checkpoint->oldestMultiDB, + checkpoint->oldestCommitTs, + checkpoint->newestCommitTs, checkpoint->oldestActiveXid, (info == XLOG_CHECKPOINT_SHUTDOWN) ? "shutdown" : "online"); } |