diff options
Diffstat (limited to 'contrib/pg_xlogdump/pg_xlogdump.c')
-rw-r--r-- | contrib/pg_xlogdump/pg_xlogdump.c | 128 |
1 files changed, 78 insertions, 50 deletions
diff --git a/contrib/pg_xlogdump/pg_xlogdump.c b/contrib/pg_xlogdump/pg_xlogdump.c index 7f151f961c8..26556dc82de 100644 --- a/contrib/pg_xlogdump/pg_xlogdump.c +++ b/contrib/pg_xlogdump/pg_xlogdump.c @@ -17,6 +17,7 @@ #include "access/xlogreader.h" #include "access/xlogrecord.h" +#include "access/xlog_internal.h" #include "access/transam.h" #include "common/fe_memutils.h" #include "getopt_long.h" @@ -343,90 +344,117 @@ XLogDumpReadPage(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, * Store per-rmgr and per-record statistics for a given record. */ static void -XLogDumpCountRecord(XLogDumpConfig *config, XLogDumpStats *stats, XLogRecPtr ReadRecPtr, XLogRecord *record) +XLogDumpCountRecord(XLogDumpConfig *config, XLogDumpStats *stats, + XLogReaderState *record) { RmgrId rmid; uint8 recid; + uint32 rec_len; + uint32 fpi_len; stats->count++; /* Update per-rmgr statistics */ - rmid = record->xl_rmid; + rmid = XLogRecGetRmid(record); + rec_len = XLogRecGetDataLen(record) + SizeOfXLogRecord; + fpi_len = record->decoded_record->xl_tot_len - rec_len; stats->rmgr_stats[rmid].count++; - stats->rmgr_stats[rmid].rec_len += - record->xl_len + SizeOfXLogRecord; - stats->rmgr_stats[rmid].fpi_len += - record->xl_tot_len - (record->xl_len + SizeOfXLogRecord); + stats->rmgr_stats[rmid].rec_len += rec_len; + stats->rmgr_stats[rmid].fpi_len += fpi_len; /* * Update per-record statistics, where the record is identified by a - * combination of the RmgrId and the four bits of the xl_info field - * that are the rmgr's domain (resulting in sixteen possible entries - * per RmgrId). + * combination of the RmgrId and the four bits of the xl_info field that + * are the rmgr's domain (resulting in sixteen possible entries per + * RmgrId). */ - recid = record->xl_info >> 4; + recid = XLogRecGetInfo(record) >> 4; stats->record_stats[rmid][recid].count++; - stats->record_stats[rmid][recid].rec_len += - record->xl_len + SizeOfXLogRecord; - stats->record_stats[rmid][recid].fpi_len += - record->xl_tot_len - (record->xl_len + SizeOfXLogRecord); + stats->record_stats[rmid][recid].rec_len += rec_len; + stats->record_stats[rmid][recid].fpi_len += fpi_len; } /* * Print a record to stdout */ static void -XLogDumpDisplayRecord(XLogDumpConfig *config, XLogRecPtr ReadRecPtr, XLogRecord *record) +XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record) { - const char *id; - const RmgrDescData *desc = &RmgrDescTable[record->xl_rmid]; - - id = desc->rm_identify(record->xl_info); + const char *id; + const RmgrDescData *desc = &RmgrDescTable[XLogRecGetRmid(record)]; + RelFileNode rnode; + ForkNumber forknum; + BlockNumber blk; + int block_id; + uint8 info = XLogRecGetInfo(record); + XLogRecPtr xl_prev = XLogRecGetPrev(record); + + id = desc->rm_identify(info); if (id == NULL) - id = psprintf("UNKNOWN (%x)", record->xl_info & ~XLR_INFO_MASK); + id = psprintf("UNKNOWN (%x)", info & ~XLR_INFO_MASK); - printf("rmgr: %-11s len (rec/tot): %6u/%6u, tx: %10u, lsn: %X/%08X, prev %X/%08X, bkp: %u%u%u%u, desc: %s ", + printf("rmgr: %-11s len (rec/tot): %6u/%6u, tx: %10u, lsn: %X/%08X, prev %X/%08X, ", desc->rm_name, - record->xl_len, record->xl_tot_len, - record->xl_xid, - (uint32) (ReadRecPtr >> 32), (uint32) ReadRecPtr, - (uint32) (record->xl_prev >> 32), (uint32) record->xl_prev, - !!(XLR_BKP_BLOCK(0) & record->xl_info), - !!(XLR_BKP_BLOCK(1) & record->xl_info), - !!(XLR_BKP_BLOCK(2) & record->xl_info), - !!(XLR_BKP_BLOCK(3) & record->xl_info), - id); + XLogRecGetDataLen(record), XLogRecGetTotalLen(record), + XLogRecGetXid(record), + (uint32) (record->ReadRecPtr >> 32), (uint32) record->ReadRecPtr, + (uint32) (xl_prev >> 32), (uint32) xl_prev); + printf("desc: %s ", id); /* the desc routine will printf the description directly to stdout */ desc->rm_desc(NULL, record); - putchar('\n'); - - if (config->bkp_details) + if (!config->bkp_details) { - int bkpnum; - char *blk = (char *) XLogRecGetData(record) + record->xl_len; - - for (bkpnum = 0; bkpnum < XLR_MAX_BKP_BLOCKS; bkpnum++) + /* print block references (short format) */ + for (block_id = 0; block_id <= record->max_block_id; block_id++) { - BkpBlock bkpb; - - if (!(XLR_BKP_BLOCK(bkpnum) & record->xl_info)) + if (!XLogRecHasBlockRef(record, block_id)) continue; - memcpy(&bkpb, blk, sizeof(BkpBlock)); - blk += sizeof(BkpBlock); - blk += BLCKSZ - bkpb.hole_length; + XLogRecGetBlockTag(record, block_id, &rnode, &forknum, &blk); + if (forknum != MAIN_FORKNUM) + printf(", blkref #%u: rel %u/%u/%u fork %s blk %u", + block_id, + rnode.spcNode, rnode.dbNode, rnode.relNode, + forkNames[forknum], + blk); + else + printf(", blkref #%u: rel %u/%u/%u blk %u", + block_id, + rnode.spcNode, rnode.dbNode, rnode.relNode, + blk); + if (XLogRecHasBlockImage(record, block_id)) + printf(" FPW"); + } + putchar('\n'); + } + else + { + /* print block references (detailed format) */ + putchar('\n'); + for (block_id = 0; block_id <= record->max_block_id; block_id++) + { + if (!XLogRecHasBlockRef(record, block_id)) + continue; - printf("\tbackup bkp #%u; rel %u/%u/%u; fork: %s; block: %u; hole: offset: %u, length: %u\n", - bkpnum, - bkpb.node.spcNode, bkpb.node.dbNode, bkpb.node.relNode, - forkNames[bkpb.fork], - bkpb.block, bkpb.hole_offset, bkpb.hole_length); + XLogRecGetBlockTag(record, block_id, &rnode, &forknum, &blk); + printf("\tblkref #%u: rel %u/%u/%u fork %s blk %u", + block_id, + rnode.spcNode, rnode.dbNode, rnode.relNode, + forkNames[forknum], + blk); + if (XLogRecHasBlockImage(record, block_id)) + { + printf(" (FPW); hole: offset: %u, length: %u\n", + record->blocks[block_id].hole_offset, + record->blocks[block_id].hole_length); + } + putchar('\n'); } } } @@ -924,9 +952,9 @@ main(int argc, char **argv) /* process the record */ if (config.stats == true) - XLogDumpCountRecord(&config, &stats, xlogreader_state->ReadRecPtr, record); + XLogDumpCountRecord(&config, &stats, xlogreader_state); else - XLogDumpDisplayRecord(&config, xlogreader_state->ReadRecPtr, record); + XLogDumpDisplayRecord(&config, xlogreader_state); /* check whether we printed enough */ config.already_displayed_records++; |