last_ckpt_start_location_v1.patch

text/x-patch

Filename: last_ckpt_start_location_v1.patch
Type: text/x-patch
Part: 0
Message: Re: testing cvs HEAD - HS/SR - xlog timeline 0 pg_xlogfile_name_offset

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: context
Series: patch v1
File+
doc/src/sgml/func.sgml 20 0
src/backend/access/transam/xlog.c 22 0
src/include/access/xlog_internal.h 1 0
src/include/catalog/pg_proc.h 2 0
*** a/doc/src/sgml/func.sgml
--- b/doc/src/sgml/func.sgml
***************
*** 13048,13053 **** SELECT set_config('log_statement_stats', 'off', false);
--- 13048,13056 ----
      <primary>pg_current_xlog_insert_location</primary>
     </indexterm>
     <indexterm>
+     <primary>pg_last_checkpoint_start_location</primary>
+    </indexterm>
+    <indexterm>
      <primary>pg_xlogfile_name_offset</primary>
     </indexterm>
     <indexterm>
***************
*** 13110,13115 **** SELECT set_config('log_statement_stats', 'off', false);
--- 13113,13125 ----
        </row>
        <row>
         <entry>
+         <literal><function>pg_last_checkpoint_start_location</function>()</literal>
+         </entry>
+        <entry><type>text</type></entry>
+        <entry>Get transaction log location where last checkpoint started</entry>
+       </row>
+       <row>
+        <entry>
          <literal><function>pg_xlogfile_name_offset</function>(<parameter>location</> <type>text</>)</literal>
          </entry>
         <entry><type>text</>, <type>integer</></entry>
***************
*** 13186,13191 **** postgres=# select pg_start_backup('label_goes_here');
--- 13196,13211 ----
     </para>
  
     <para>
+     <function>pg_last_checkpoint_start_location</> displays the transaction log location
+     where the last checkpoint (or restartpoint) started. The return location indicates
+     the earliest file that must be kept to allow the server to be restartable, so this
+     information can be used to truncate the archive to just the minimum required to
+     support restarting from the current database cluster. This function may be executed
+     during both recovery and in normal running. Also this function is read-only operation
+     and does not require superuser permission.
+    </para>
+ 
+    <para>
      You can use <function>pg_xlogfile_name_offset</> to extract the
      corresponding transaction log file name and byte offset from the results of any of the
      above functions.  For example:
*** a/src/backend/access/transam/xlog.c
--- b/src/backend/access/transam/xlog.c
***************
*** 8316,8321 **** pg_last_xlog_replay_location(PG_FUNCTION_ARGS)
--- 8316,8343 ----
  }
  
  /*
+  * Report the last checkpoint (or restartpoint) start location
+  * (same format as pg_start_backup etc)
+  *
+  * This is useful for determining which archived WAL files are
+  * not required for the server and can be removed.
+  */
+ Datum
+ pg_last_checkpoint_start_location(PG_FUNCTION_ARGS)
+ {
+ 	XLogRecPtr	recptr;
+ 	char		location[MAXFNAMELEN];
+ 
+ 	LWLockAcquire(ControlFileLock, LW_SHARED);
+ 	recptr = ControlFile->checkPointCopy.redo;
+ 	LWLockRelease(ControlFileLock);
+ 
+ 	snprintf(location, sizeof(location), "%X/%X",
+ 			 recptr.xlogid, recptr.xrecoff);
+ 	PG_RETURN_TEXT_P(cstring_to_text(location));
+ }
+ 
+ /*
   * Compute an xlog file name and decimal byte offset given a WAL location,
   * such as is returned by pg_stop_backup() or pg_xlog_switch().
   *
*** a/src/include/access/xlog_internal.h
--- b/src/include/access/xlog_internal.h
***************
*** 268,273 **** extern Datum pg_current_xlog_location(PG_FUNCTION_ARGS);
--- 268,274 ----
  extern Datum pg_current_xlog_insert_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_checkpoint_start_location(PG_FUNCTION_ARGS);
  extern Datum pg_xlogfile_name_offset(PG_FUNCTION_ARGS);
  extern Datum pg_xlogfile_name(PG_FUNCTION_ARGS);
  extern Datum pg_is_in_recovery(PG_FUNCTION_ARGS);
*** a/src/include/catalog/pg_proc.h
--- b/src/include/catalog/pg_proc.h
***************
*** 3322,3327 **** DATA(insert OID = 3820 ( pg_last_xlog_receive_location	PGNSP PGUID 12 1 0 0 f f
--- 3322,3329 ----
  DESCR("current xlog flush location");
  DATA(insert OID = 3821 ( pg_last_xlog_replay_location	PGNSP PGUID 12 1 0 0 f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_last_xlog_replay_location _null_ _null_ _null_ ));
  DESCR("last xlog replay location");
+ DATA(insert OID = 3822 ( pg_last_checkpoint_start_location	PGNSP PGUID 12 1 0 0 f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_last_checkpoint_start_location _null_ _null_ _null_ ));
+ DESCR("last checkpoint start location");
  
  DATA(insert OID = 2621 ( pg_reload_conf			PGNSP PGUID 12 1 0 0 f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ pg_reload_conf _null_ _null_ _null_ ));
  DESCR("reload configuration files");