Show more detail in nbtree rmgr descriptions.
authorPeter Geoghegan <[email protected]>
Fri, 7 Apr 2023 23:46:23 +0000 (16:46 -0700)
committerPeter Geoghegan <[email protected]>
Fri, 7 Apr 2023 23:46:23 +0000 (16:46 -0700)
Show a detailed description of the page offset number arrays that appear
in certain nbtree WAL records.

Also brings nbtree desc routines in line with the guidelines established
by recent commit 7d8219a4.

Author: Melanie Plageman <[email protected]>
Reviewed-By: Peter Geoghegan <[email protected]>
Discussion: https://postgr.es/m/flat/20230109215842.fktuhesvayno6o4g%40awork3.anarazel.de

src/backend/access/rmgrdesc/nbtdesc.c
src/backend/access/rmgrdesc/rmgrdesc_utils.c
src/include/access/rmgrdesc_utils.h

index c5dc543a0f2d07f6de5cf806e0534108c96484da..6bc0432650f614027e579dae4eac957f24d9b2c0 100644 (file)
 #include "postgres.h"
 
 #include "access/nbtxlog.h"
+#include "access/rmgrdesc_utils.h"
+
+static void btree_del_desc(StringInfo buf, char *block_data, uint16 ndeleted,
+                          uint16 nupdated);
+static void btree_update_elem_desc(StringInfo buf, void *update, void *data);
+
+static void
+btree_del_desc(StringInfo buf, char *block_data, uint16 ndeleted,
+              uint16 nupdated)
+{
+   OffsetNumber *updatedoffsets;
+   xl_btree_update *updates;
+   OffsetNumber *data = (OffsetNumber *) block_data;
+
+   appendStringInfoString(buf, ", deleted:");
+   array_desc(buf, data, sizeof(OffsetNumber), ndeleted,
+              &offset_elem_desc, NULL);
+
+   appendStringInfoString(buf, ", updated:");
+   array_desc(buf, data, sizeof(OffsetNumber), nupdated,
+              &offset_elem_desc, NULL);
+
+   if (nupdated <= 0)
+       return;
+
+   updatedoffsets = (OffsetNumber *)
+       ((char *) data + ndeleted * sizeof(OffsetNumber));
+   updates = (xl_btree_update *) ((char *) updatedoffsets +
+                                  nupdated *
+                                  sizeof(OffsetNumber));
+
+   appendStringInfoString(buf, ", updates:");
+   array_desc(buf, updates, sizeof(xl_btree_update),
+              nupdated, &btree_update_elem_desc,
+              &updatedoffsets);
+}
+
+static void
+btree_update_elem_desc(StringInfo buf, void *update, void *data)
+{
+   xl_btree_update *new_update = (xl_btree_update *) update;
+   OffsetNumber *updated_offset = *((OffsetNumber **) data);
+
+   appendStringInfo(buf, "{ updated offset: %u, ndeleted tids: %u",
+                    *updated_offset, new_update->ndeletedtids);
+
+   appendStringInfoString(buf, ", deleted tids:");
+
+   array_desc(buf, (char *) new_update + SizeOfBtreeUpdate, sizeof(uint16),
+              new_update->ndeletedtids, &uint16_elem_desc, NULL);
+
+   updated_offset++;
+
+   appendStringInfo(buf, " }");
+}
 
 void
 btree_desc(StringInfo buf, XLogReaderState *record)
@@ -31,7 +86,7 @@ btree_desc(StringInfo buf, XLogReaderState *record)
            {
                xl_btree_insert *xlrec = (xl_btree_insert *) rec;
 
-               appendStringInfo(buf, "off %u", xlrec->offnum);
+               appendStringInfo(buf, "off: %u", xlrec->offnum);
                break;
            }
        case XLOG_BTREE_SPLIT_L:
@@ -39,7 +94,7 @@ btree_desc(StringInfo buf, XLogReaderState *record)
            {
                xl_btree_split *xlrec = (xl_btree_split *) rec;
 
-               appendStringInfo(buf, "level %u, firstrightoff %d, newitemoff %d, postingoff %d",
+               appendStringInfo(buf, "level: %u, firstrightoff: %d, newitemoff: %d, postingoff: %d",
                                 xlrec->level, xlrec->firstrightoff,
                                 xlrec->newitemoff, xlrec->postingoff);
                break;
@@ -48,31 +103,41 @@ btree_desc(StringInfo buf, XLogReaderState *record)
            {
                xl_btree_dedup *xlrec = (xl_btree_dedup *) rec;
 
-               appendStringInfo(buf, "nintervals %u", xlrec->nintervals);
+               appendStringInfo(buf, "nintervals: %u", xlrec->nintervals);
                break;
            }
        case XLOG_BTREE_VACUUM:
            {
                xl_btree_vacuum *xlrec = (xl_btree_vacuum *) rec;
 
-               appendStringInfo(buf, "ndeleted %u; nupdated %u",
+               appendStringInfo(buf, "ndeleted: %u, nupdated: %u",
                                 xlrec->ndeleted, xlrec->nupdated);
+
+               if (!XLogRecHasBlockImage(record, 0))
+                   btree_del_desc(buf, XLogRecGetBlockData(record, 0, NULL),
+                                  xlrec->ndeleted, xlrec->nupdated);
+
                break;
            }
        case XLOG_BTREE_DELETE:
            {
                xl_btree_delete *xlrec = (xl_btree_delete *) rec;
 
-               appendStringInfo(buf, "snapshotConflictHorizon %u; ndeleted %u; nupdated %u",
+               appendStringInfo(buf, "snapshotConflictHorizon: %u, ndeleted: %u, nupdated: %u",
                                 xlrec->snapshotConflictHorizon,
                                 xlrec->ndeleted, xlrec->nupdated);
+
+               if (!XLogRecHasBlockImage(record, 0))
+                   btree_del_desc(buf, XLogRecGetBlockData(record, 0, NULL),
+                                  xlrec->ndeleted, xlrec->nupdated);
+
                break;
            }
        case XLOG_BTREE_MARK_PAGE_HALFDEAD:
            {
                xl_btree_mark_page_halfdead *xlrec = (xl_btree_mark_page_halfdead *) rec;
 
-               appendStringInfo(buf, "topparent %u; leaf %u; left %u; right %u",
+               appendStringInfo(buf, "topparent: %u; leaf: %u; left: %u; right: %u",
                                 xlrec->topparent, xlrec->leafblk, xlrec->leftblk, xlrec->rightblk);
                break;
            }
@@ -81,11 +146,11 @@ btree_desc(StringInfo buf, XLogReaderState *record)
            {
                xl_btree_unlink_page *xlrec = (xl_btree_unlink_page *) rec;
 
-               appendStringInfo(buf, "left %u; right %u; level %u; safexid %u:%u; ",
+               appendStringInfo(buf, "left: %u; right: %u; level: %u; safexid: %u:%u; ",
                                 xlrec->leftsib, xlrec->rightsib, xlrec->level,
                                 EpochFromFullTransactionId(xlrec->safexid),
                                 XidFromFullTransactionId(xlrec->safexid));
-               appendStringInfo(buf, "leafleft %u; leafright %u; leaftopparent %u",
+               appendStringInfo(buf, "leafleft: %u; leafright: %u; leaftopparent: %u",
                                 xlrec->leafleftsib, xlrec->leafrightsib,
                                 xlrec->leaftopparent);
                break;
@@ -94,14 +159,14 @@ btree_desc(StringInfo buf, XLogReaderState *record)
            {
                xl_btree_newroot *xlrec = (xl_btree_newroot *) rec;
 
-               appendStringInfo(buf, "lev %u", xlrec->level);
+               appendStringInfo(buf, "lev: %u", xlrec->level);
                break;
            }
        case XLOG_BTREE_REUSE_PAGE:
            {
                xl_btree_reuse_page *xlrec = (xl_btree_reuse_page *) rec;
 
-               appendStringInfo(buf, "rel %u/%u/%u; snapshotConflictHorizon %u:%u",
+               appendStringInfo(buf, "rel: %u/%u/%u, snapshotConflictHorizon: %u:%u",
                                 xlrec->locator.spcOid, xlrec->locator.dbOid,
                                 xlrec->locator.relNumber,
                                 EpochFromFullTransactionId(xlrec->snapshotConflictHorizon),
@@ -114,7 +179,7 @@ btree_desc(StringInfo buf, XLogReaderState *record)
 
                xlrec = (xl_btree_metadata *) XLogRecGetBlockData(record, 0,
                                                                  NULL);
-               appendStringInfo(buf, "last_cleanup_num_delpages %u",
+               appendStringInfo(buf, "last_cleanup_num_delpages: %u",
                                 xlrec->last_cleanup_num_delpages);
                break;
            }
index 180f64bf84bf4d1751716c3d4c91b346f50e6327..c95a41a254b236b2288f70869f58032b7e86b582 100644 (file)
@@ -82,3 +82,9 @@ relid_desc(StringInfo buf, void *relid, void *data)
 {
    appendStringInfo(buf, "%u", *(Oid *) relid);
 }
+
+void
+uint16_elem_desc(StringInfo buf, void *value, void *data)
+{
+   appendStringInfo(buf, "%u", *(uint16 *) value);
+}
index aa6d0290d9c71930c719083d66b42759fac219c6..13552d6f350c3c788515d323309b22dbe8c56c2b 100644 (file)
@@ -18,5 +18,6 @@ extern void array_desc(StringInfo buf, void *array, size_t elem_size, int count,
 extern void offset_elem_desc(StringInfo buf, void *offset, void *data);
 extern void redirect_elem_desc(StringInfo buf, void *offset, void *data);
 extern void relid_desc(StringInfo buf, void *relid, void *data);
+extern void uint16_elem_desc(StringInfo buf, void *value, void *data);
 
 #endif                         /* RMGRDESC_UTILS_H */