mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +03:00
Add rmgr callback to name xlog record types for display purposes.
This is primarily useful for the upcoming pg_xlogdump --stats feature, but also allows to remove some duplicated code in the rmgr_desc routines. Due to the separation and harmonization, the output of dipsplayed records changes somewhat. But since this isn't enduser oriented content that's ok. It's potentially desirable to further change pg_xlogdump's display of records. It previously wasn't possible to show the record type separately from the description forcing it to be in the last column. But that's better done in a separate commit. Author: Abhijit Menon-Sen, slightly editorialized by me Reviewed-By: Álvaro Herrera, Andres Freund, and Heikki Linnakangas Discussion: 20140604104716.GA3989@toroid.org
This commit is contained in:
@@ -34,74 +34,26 @@ btree_desc(StringInfo buf, XLogRecord *record)
|
||||
switch (info)
|
||||
{
|
||||
case XLOG_BTREE_INSERT_LEAF:
|
||||
{
|
||||
xl_btree_insert *xlrec = (xl_btree_insert *) rec;
|
||||
|
||||
appendStringInfoString(buf, "insert: ");
|
||||
out_target(buf, &(xlrec->target));
|
||||
break;
|
||||
}
|
||||
case XLOG_BTREE_INSERT_UPPER:
|
||||
{
|
||||
xl_btree_insert *xlrec = (xl_btree_insert *) rec;
|
||||
|
||||
appendStringInfoString(buf, "insert_upper: ");
|
||||
out_target(buf, &(xlrec->target));
|
||||
break;
|
||||
}
|
||||
case XLOG_BTREE_INSERT_META:
|
||||
{
|
||||
xl_btree_insert *xlrec = (xl_btree_insert *) rec;
|
||||
|
||||
appendStringInfoString(buf, "insert_meta: ");
|
||||
out_target(buf, &(xlrec->target));
|
||||
break;
|
||||
}
|
||||
case XLOG_BTREE_SPLIT_L:
|
||||
{
|
||||
xl_btree_split *xlrec = (xl_btree_split *) rec;
|
||||
|
||||
appendStringInfo(buf, "split_l: rel %u/%u/%u ",
|
||||
xlrec->node.spcNode, xlrec->node.dbNode,
|
||||
xlrec->node.relNode);
|
||||
appendStringInfo(buf, "left %u, right %u, next %u, level %u, firstright %d",
|
||||
xlrec->leftsib, xlrec->rightsib, xlrec->rnext,
|
||||
xlrec->level, xlrec->firstright);
|
||||
break;
|
||||
}
|
||||
case XLOG_BTREE_SPLIT_R:
|
||||
{
|
||||
xl_btree_split *xlrec = (xl_btree_split *) rec;
|
||||
|
||||
appendStringInfo(buf, "split_r: rel %u/%u/%u ",
|
||||
xlrec->node.spcNode, xlrec->node.dbNode,
|
||||
xlrec->node.relNode);
|
||||
appendStringInfo(buf, "left %u, right %u, next %u, level %u, firstright %d",
|
||||
xlrec->leftsib, xlrec->rightsib, xlrec->rnext,
|
||||
xlrec->level, xlrec->firstright);
|
||||
break;
|
||||
}
|
||||
case XLOG_BTREE_SPLIT_L_ROOT:
|
||||
{
|
||||
xl_btree_split *xlrec = (xl_btree_split *) rec;
|
||||
|
||||
appendStringInfo(buf, "split_l_root: rel %u/%u/%u ",
|
||||
xlrec->node.spcNode, xlrec->node.dbNode,
|
||||
xlrec->node.relNode);
|
||||
appendStringInfo(buf, "left %u, right %u, next %u, level %u, firstright %d",
|
||||
xlrec->leftsib, xlrec->rightsib, xlrec->rnext,
|
||||
xlrec->level, xlrec->firstright);
|
||||
break;
|
||||
}
|
||||
case XLOG_BTREE_SPLIT_R_ROOT:
|
||||
{
|
||||
xl_btree_split *xlrec = (xl_btree_split *) rec;
|
||||
|
||||
appendStringInfo(buf, "split_r_root: rel %u/%u/%u ",
|
||||
appendStringInfo(buf, "rel %u/%u/%u ",
|
||||
xlrec->node.spcNode, xlrec->node.dbNode,
|
||||
xlrec->node.relNode);
|
||||
appendStringInfo(buf, "left %u, right %u, next %u, level %u, firstright %d",
|
||||
xlrec->leftsib, xlrec->rightsib, xlrec->rnext,
|
||||
xlrec->leftsib, xlrec->rightsib, xlrec->rnext,
|
||||
xlrec->level, xlrec->firstright);
|
||||
break;
|
||||
}
|
||||
@@ -109,7 +61,7 @@ btree_desc(StringInfo buf, XLogRecord *record)
|
||||
{
|
||||
xl_btree_vacuum *xlrec = (xl_btree_vacuum *) rec;
|
||||
|
||||
appendStringInfo(buf, "vacuum: rel %u/%u/%u; blk %u, lastBlockVacuumed %u",
|
||||
appendStringInfo(buf, "rel %u/%u/%u; blk %u, lastBlockVacuumed %u",
|
||||
xlrec->node.spcNode, xlrec->node.dbNode,
|
||||
xlrec->node.relNode, xlrec->block,
|
||||
xlrec->lastBlockVacuumed);
|
||||
@@ -119,8 +71,8 @@ btree_desc(StringInfo buf, XLogRecord *record)
|
||||
{
|
||||
xl_btree_delete *xlrec = (xl_btree_delete *) rec;
|
||||
|
||||
appendStringInfo(buf, "delete: index %u/%u/%u; iblk %u, heap %u/%u/%u;",
|
||||
xlrec->node.spcNode, xlrec->node.dbNode, xlrec->node.relNode,
|
||||
appendStringInfo(buf, "index %u/%u/%u; iblk %u, heap %u/%u/%u;",
|
||||
xlrec->node.spcNode, xlrec->node.dbNode, xlrec->node.relNode,
|
||||
xlrec->block,
|
||||
xlrec->hnode.spcNode, xlrec->hnode.dbNode, xlrec->hnode.relNode);
|
||||
break;
|
||||
@@ -129,7 +81,6 @@ btree_desc(StringInfo buf, XLogRecord *record)
|
||||
{
|
||||
xl_btree_mark_page_halfdead *xlrec = (xl_btree_mark_page_halfdead *) rec;
|
||||
|
||||
appendStringInfoString(buf, "mark_page_halfdead: ");
|
||||
out_target(buf, &(xlrec->target));
|
||||
appendStringInfo(buf, "; topparent %u; leaf %u; left %u; right %u",
|
||||
xlrec->topparent, xlrec->leafblk, xlrec->leftblk, xlrec->rightblk);
|
||||
@@ -140,8 +91,8 @@ btree_desc(StringInfo buf, XLogRecord *record)
|
||||
{
|
||||
xl_btree_unlink_page *xlrec = (xl_btree_unlink_page *) rec;
|
||||
|
||||
appendStringInfo(buf, "unlink_page: rel %u/%u/%u; ",
|
||||
xlrec->node.spcNode, xlrec->node.dbNode, xlrec->node.relNode);
|
||||
appendStringInfo(buf, "rel %u/%u/%u; ",
|
||||
xlrec->node.spcNode, xlrec->node.dbNode, xlrec->node.relNode);
|
||||
appendStringInfo(buf, "dead %u; left %u; right %u; btpo_xact %u; ",
|
||||
xlrec->deadblk, xlrec->leftsib, xlrec->rightsib, xlrec->btpo_xact);
|
||||
appendStringInfo(buf, "leaf %u; leafleft %u; leafright %u; topparent %u",
|
||||
@@ -152,7 +103,7 @@ btree_desc(StringInfo buf, XLogRecord *record)
|
||||
{
|
||||
xl_btree_newroot *xlrec = (xl_btree_newroot *) rec;
|
||||
|
||||
appendStringInfo(buf, "newroot: rel %u/%u/%u; root %u lev %u",
|
||||
appendStringInfo(buf, "rel %u/%u/%u; root %u lev %u",
|
||||
xlrec->node.spcNode, xlrec->node.dbNode,
|
||||
xlrec->node.relNode,
|
||||
xlrec->rootblk, xlrec->level);
|
||||
@@ -162,13 +113,64 @@ btree_desc(StringInfo buf, XLogRecord *record)
|
||||
{
|
||||
xl_btree_reuse_page *xlrec = (xl_btree_reuse_page *) rec;
|
||||
|
||||
appendStringInfo(buf, "reuse_page: rel %u/%u/%u; latestRemovedXid %u",
|
||||
appendStringInfo(buf, "rel %u/%u/%u; latestRemovedXid %u",
|
||||
xlrec->node.spcNode, xlrec->node.dbNode,
|
||||
xlrec->node.relNode, xlrec->latestRemovedXid);
|
||||
xlrec->node.relNode, xlrec->latestRemovedXid);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
appendStringInfoString(buf, "UNKNOWN");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const char *
|
||||
btree_identify(uint8 info)
|
||||
{
|
||||
const char *id = NULL;
|
||||
|
||||
switch (info)
|
||||
{
|
||||
case XLOG_BTREE_INSERT_LEAF:
|
||||
id = "INSERT_LEAF";
|
||||
break;
|
||||
case XLOG_BTREE_INSERT_UPPER:
|
||||
id = "INSERT_UPPER";
|
||||
break;
|
||||
case XLOG_BTREE_INSERT_META:
|
||||
id = "INSERT_META";
|
||||
break;
|
||||
case XLOG_BTREE_SPLIT_L:
|
||||
id = "SPLIT_L";
|
||||
break;
|
||||
case XLOG_BTREE_SPLIT_R:
|
||||
id = "SPLIT_R";
|
||||
break;
|
||||
case XLOG_BTREE_SPLIT_L_ROOT:
|
||||
id = "SPLIT_L_ROOT";
|
||||
break;
|
||||
case XLOG_BTREE_SPLIT_R_ROOT:
|
||||
id = "SPLIT_R_ROOT";
|
||||
break;
|
||||
case XLOG_BTREE_VACUUM:
|
||||
id = "VACUUM";
|
||||
break;
|
||||
case XLOG_BTREE_DELETE:
|
||||
id = "DELETE";
|
||||
break;
|
||||
case XLOG_BTREE_MARK_PAGE_HALFDEAD:
|
||||
id = "MARK_PAGE_HALFDEAD";
|
||||
break;
|
||||
case XLOG_BTREE_UNLINK_PAGE:
|
||||
id = "UNLINK_PAGE";
|
||||
break;
|
||||
case XLOG_BTREE_UNLINK_PAGE_META:
|
||||
id = "UNLINK_PAGE_META";
|
||||
break;
|
||||
case XLOG_BTREE_NEWROOT:
|
||||
id = "NEWROOT";
|
||||
break;
|
||||
case XLOG_BTREE_REUSE_PAGE:
|
||||
id = "REUSE_PAGE";
|
||||
break;
|
||||
}
|
||||
|
||||
return id;
|
||||
}
|
||||
|
Reference in New Issue
Block a user