On Fri, Apr 7, 2023 at 7:09 PM Peter Geoghegan <p...@bowt.ie> wrote: > > On Fri, Apr 7, 2023 at 4:01 PM Melanie Plageman > <melanieplage...@gmail.com> wrote: > > LGTM > > Pushed, thanks.
It's come to my attention that I forgot to include the btree patch earlier. PFA
From 4f502b2513ba79d738e7ed87aaf7d18ed2a2e30f Mon Sep 17 00:00:00 2001 From: Melanie Plageman <melanieplage...@gmail.com> Date: Mon, 13 Mar 2023 18:15:17 -0400 Subject: [PATCH v4 2/2] Add detail to some btree xlog record descs Suggested by Peter Geoghegan Discussion: https://postgr.es/m/flat/20230109215842.fktuhesvayno6o4g%40awork3.anarazel.de --- src/backend/access/rmgrdesc/nbtdesc.c | 84 +++++++++++++++++--- src/backend/access/rmgrdesc/rmgrdesc_utils.c | 6 ++ src/include/access/rmgrdesc_utils.h | 2 + 3 files changed, 81 insertions(+), 11 deletions(-) diff --git a/src/backend/access/rmgrdesc/nbtdesc.c b/src/backend/access/rmgrdesc/nbtdesc.c index c5dc543a0f..9ffece109d 100644 --- a/src/backend/access/rmgrdesc/nbtdesc.c +++ b/src/backend/access/rmgrdesc/nbtdesc.c @@ -15,6 +15,58 @@ #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 *restrict update, void + *restrict 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 *restrict update, void *restrict 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 +83,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 +91,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 +100,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 +143,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 +156,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 +176,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; } diff --git a/src/backend/access/rmgrdesc/rmgrdesc_utils.c b/src/backend/access/rmgrdesc/rmgrdesc_utils.c index 2bfd11cb6e..1268d6131e 100644 --- a/src/backend/access/rmgrdesc/rmgrdesc_utils.c +++ b/src/backend/access/rmgrdesc/rmgrdesc_utils.c @@ -80,3 +80,9 @@ relid_desc(StringInfo buf, void *restrict relid, void *restrict data) { appendStringInfo(buf, "%u", *(Oid *) relid); } + +void +uint16_elem_desc(StringInfo buf, void *restrict value, void *restrict data) +{ + appendStringInfo(buf, "%u", *(uint16 *) value); +} diff --git a/src/include/access/rmgrdesc_utils.h b/src/include/access/rmgrdesc_utils.h index 763ae81859..ce24accc3b 100644 --- a/src/include/access/rmgrdesc_utils.h +++ b/src/include/access/rmgrdesc_utils.h @@ -25,5 +25,7 @@ extern void redirect_elem_desc(StringInfo buf, void *restrict offset, void *rest extern void relid_desc(StringInfo buf, void *restrict relid, void *restrict data); +extern void uint16_elem_desc(StringInfo buf, void *restrict value, void *restrict data); + #endif /* RMGRDESC_UTILS_H */ -- 2.37.2