Add block information in error context of WAL REDO apply loop
authorMichael Paquier <michael@paquier.xyz>
Fri, 2 Oct 2020 00:31:50 +0000 (09:31 +0900)
committerMichael Paquier <michael@paquier.xyz>
Fri, 2 Oct 2020 00:31:50 +0000 (09:31 +0900)
Providing this information can be useful for example when diagnosing
problems related to recovery conflicts or for recovery issues without
having to go through the output generated by pg_waldump to get some
information about the blocks a WAL record works on.

The block information is printed in the same format as pg_waldump.  This
already existed in xlog.c for debugging purposes with -DWAL_DEBUG, so
adding the block information in the callback has required just a small
refactoring.

Author: Bertrand Drouvot
Reviewed-by: Michael Paquier, Masahiko Sawada
Discussion: https://postgr.es/m/c31e2cba-efda-762c-f4ad-5c25e5dac3d0@amazon.com

src/backend/access/transam/xlog.c

index 79a77ebbfe24dba01cbf347a3d9d33665f128fd8..03c089b9a966aede4b595a312919880ab7009cb2 100644 (file)
@@ -940,6 +940,7 @@ static bool CheckForStandbyTrigger(void);
 #ifdef WAL_DEBUG
 static void xlog_outrec(StringInfo buf, XLogReaderState *record);
 #endif
+static void xlog_block_info(StringInfo buf, XLogReaderState *record);
 static void xlog_outdesc(StringInfo buf, XLogReaderState *record);
 static void pg_start_backup_callback(int code, Datum arg);
 static void pg_stop_backup_callback(int code, Datum arg);
@@ -10258,6 +10259,19 @@ xlog_outrec(StringInfo buf, XLogReaderState *record)
    appendStringInfo(buf, "; len %u",
                     XLogRecGetDataLen(record));
 
+   xlog_block_info(buf, record);
+}
+#endif                         /* WAL_DEBUG */
+
+/*
+ * Returns a string giving information about all the blocks in an
+ * XLogRecord.
+ */
+static void
+xlog_block_info(StringInfo buf, XLogReaderState *record)
+{
+   int         block_id;
+
    /* decode block references */
    for (block_id = 0; block_id <= record->max_block_id; block_id++)
    {
@@ -10284,7 +10298,6 @@ xlog_outrec(StringInfo buf, XLogReaderState *record)
            appendStringInfoString(buf, " FPW");
    }
 }
-#endif                         /* WAL_DEBUG */
 
 /*
  * Returns a string describing an XLogRecord, consisting of its identity
@@ -11765,6 +11778,7 @@ rm_redo_error_callback(void *arg)
 
    initStringInfo(&buf);
    xlog_outdesc(&buf, record);
+   xlog_block_info(&buf, record);
 
    /* translator: %s is a WAL record description */
    errcontext("WAL redo at %X/%X for %s",