aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Riggs <simon@2ndQuadrant.com>2016-01-12 07:54:52 +0000
committerSimon Riggs <simon@2ndQuadrant.com>2016-01-12 07:54:52 +0000
commite63bb4549a2f47b86de9fc21c9f8b00440f34f99 (patch)
tree79c4138b111ad43caf0a4c7a77d1261b63e49b05
parent1e29e6324ca7d52eb751c8d63881d1f7c44e3921 (diff)
downloadpostgresql-e63bb4549a2f47b86de9fc21c9f8b00440f34f99.tar.gz
postgresql-e63bb4549a2f47b86de9fc21c9f8b00440f34f99.zip
Add new user fn pg_current_xlog_flush_location()
Tomas Vondra, reviewed by Michael Paquier and Amit Kapila Minor edits by me
-rw-r--r--doc/src/sgml/func.sgml23
-rw-r--r--src/backend/access/transam/xlogfuncs.c21
-rw-r--r--src/include/access/xlog_fn.h1
-rw-r--r--src/include/catalog/pg_proc.h2
4 files changed, 41 insertions, 6 deletions
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 8591aa3e5a5..0af01d9f10b 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -16789,6 +16789,9 @@ SELECT set_config('log_statement_stats', 'off', false);
<primary>pg_create_restore_point</primary>
</indexterm>
<indexterm>
+ <primary>pg_current_xlog_flush_location</primary>
+ </indexterm>
+ <indexterm>
<primary>pg_current_xlog_insert_location</primary>
</indexterm>
<indexterm>
@@ -16845,6 +16848,13 @@ SELECT set_config('log_statement_stats', 'off', false);
</row>
<row>
<entry>
+ <literal><function>pg_current_xlog_flush_location()</function></literal>
+ </entry>
+ <entry><type>pg_lsn</type></entry>
+ <entry>Get current transaction log flush location</entry>
+ </row>
+ <row>
+ <entry>
<literal><function>pg_current_xlog_insert_location()</function></literal>
</entry>
<entry><type>pg_lsn</type></entry>
@@ -16977,13 +16987,14 @@ postgres=# select pg_start_backup('label_goes_here');
<function>pg_current_xlog_location</> displays the current transaction log write
location in the same format used by the above functions. Similarly,
<function>pg_current_xlog_insert_location</> displays the current transaction log
- insertion point. The insertion point is the <quote>logical</> end
- of the transaction log
- at any instant, while the write location is the end of what has actually
- been written out from the server's internal buffers. The write location
- is the end of what can be examined from outside the server, and is usually
+ insertion point and <function>pg_current_xlog_flush_location</> displays the
+ current transaction log flush point. The insertion point is the <quote>logical</>
+ end of the transaction log at any instant, while the write location is the end of
+ what has actually been written out from the server's internal buffers and flush
+ location is the location guaranteed to be written to durable storage. The write
+ location is the end of what can be examined from outside the server, and is usually
what you want if you are interested in archiving partially-complete transaction log
- files. The insertion point is made available primarily for server
+ files. The insertion and flush points are made available primarily for server
debugging purposes. These are both read-only operations and do not
require superuser permissions.
</para>
diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c
index 42168985e0c..31cbb01ce47 100644
--- a/src/backend/access/transam/xlogfuncs.c
+++ b/src/backend/access/transam/xlogfuncs.c
@@ -216,6 +216,27 @@ pg_current_xlog_insert_location(PG_FUNCTION_ARGS)
}
/*
+ * Report the current WAL flush location (same format as pg_start_backup etc)
+ *
+ * This function is mostly for debugging purposes.
+ */
+Datum
+pg_current_xlog_flush_location(PG_FUNCTION_ARGS)
+{
+ XLogRecPtr current_recptr;
+
+ if (RecoveryInProgress())
+ ereport(ERROR,
+ (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("recovery is in progress"),
+ errhint("WAL control functions cannot be executed during recovery.")));
+
+ current_recptr = GetFlushRecPtr();
+
+ PG_RETURN_LSN(current_recptr);
+}
+
+/*
* Report the last WAL receive location (same format as pg_start_backup etc)
*
* This is useful for determining how much of WAL is guaranteed to be received
diff --git a/src/include/access/xlog_fn.h b/src/include/access/xlog_fn.h
index 73046b0a4fa..762df8bea30 100644
--- a/src/include/access/xlog_fn.h
+++ b/src/include/access/xlog_fn.h
@@ -19,6 +19,7 @@ extern Datum pg_switch_xlog(PG_FUNCTION_ARGS);
extern Datum pg_create_restore_point(PG_FUNCTION_ARGS);
extern Datum pg_current_xlog_location(PG_FUNCTION_ARGS);
extern Datum pg_current_xlog_insert_location(PG_FUNCTION_ARGS);
+extern Datum pg_current_xlog_flush_location(PG_FUNCTION_ARGS);
extern Datum pg_last_xlog_receive_location(PG_FUNCTION_ARGS);
extern Datum pg_last_xlog_replay_location(PG_FUNCTION_ARGS);
extern Datum pg_last_xact_replay_timestamp(PG_FUNCTION_ARGS);
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 95d683c8ff5..f58672e4a7c 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -3158,6 +3158,8 @@ DATA(insert OID = 2849 ( pg_current_xlog_location PGNSP PGUID 12 1 0 0 0 f f f f
DESCR("current xlog write location");
DATA(insert OID = 2852 ( pg_current_xlog_insert_location PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_current_xlog_insert_location _null_ _null_ _null_ ));
DESCR("current xlog insert location");
+DATA(insert OID = 3330 ( pg_current_xlog_flush_location PGNSP PGUID 12 1 0 0 0 f f f f t f v s 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_current_xlog_flush_location _null_ _null_ _null_ ));
+DESCR("current xlog flush location");
DATA(insert OID = 2850 ( pg_xlogfile_name_offset PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 2249 "3220" "{3220,25,23}" "{i,o,o}" "{wal_location,file_name,file_offset}" _null_ _null_ pg_xlogfile_name_offset _null_ _null_ _null_ ));
DESCR("xlog filename and byte offset, given an xlog location");
DATA(insert OID = 2851 ( pg_xlogfile_name PGNSP PGUID 12 1 0 0 0 f f f f t f i s 1 0 25 "3220" _null_ _null_ _null_ _null_ _null_ pg_xlogfile_name _null_ _null_ _null_ ));