mirror of
https://github.com/postgres/postgres.git
synced 2025-04-25 21:42:33 +03:00
Show more detail in nbtree rmgr descriptions.
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 <melanieplageman@gmail.com> Reviewed-By: Peter Geoghegan <pg@bowt.ie> Discussion: https://postgr.es/m/flat/20230109215842.fktuhesvayno6o4g%40awork3.anarazel.de
This commit is contained in:
parent
ce5e234085
commit
1c453cfd89
@ -15,6 +15,61 @@
|
||||
#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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user