diff options
author | Andres Freund <andres@anarazel.de> | 2014-09-22 16:48:14 +0200 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2014-09-22 17:49:34 +0200 |
commit | 604f7956b9460192222dd37bd3baea24cb669a47 (patch) | |
tree | b5724bd4bcb4a36e51c1fdd90edeb162edb30d24 /contrib/pg_xlogdump/pg_xlogdump.c | |
parent | 898f8a96ef9dfa79eac9ec1621a89e71fe16601c (diff) | |
download | postgresql-604f7956b9460192222dd37bd3baea24cb669a47.tar.gz postgresql-604f7956b9460192222dd37bd3baea24cb669a47.zip |
Improve code around the recently added rm_identify rmgr callback.
There are four weaknesses in728f152e07f998d2cb4fe5f24ec8da2c3bda98f2:
* append_init() in heapdesc.c was ugly and required that rm_identify
return values are only valid till the next call. Instead just add a
couple more switch() cases for the INIT_PAGE cases. Now the returned
value will always be valid.
* a couple rm_identify() callbacks missed masking xl_info with
~XLR_INFO_MASK.
* pg_xlogdump didn't map a NULL rm_identify to UNKNOWN or a similar
string.
* append_init() was called when id=NULL - which should never actually
happen. But it's better to be careful.
Diffstat (limited to 'contrib/pg_xlogdump/pg_xlogdump.c')
-rw-r--r-- | contrib/pg_xlogdump/pg_xlogdump.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/contrib/pg_xlogdump/pg_xlogdump.c b/contrib/pg_xlogdump/pg_xlogdump.c index 1cd554ac4f7..adc9087a1de 100644 --- a/contrib/pg_xlogdump/pg_xlogdump.c +++ b/contrib/pg_xlogdump/pg_xlogdump.c @@ -382,8 +382,13 @@ XLogDumpCountRecord(XLogDumpConfig *config, XLogDumpStats *stats, XLogRecPtr Rea static void XLogDumpDisplayRecord(XLogDumpConfig *config, XLogRecPtr ReadRecPtr, XLogRecord *record) { + const char *id; const RmgrDescData *desc = &RmgrDescTable[record->xl_rmid]; + id = desc->rm_identify(record->xl_info); + if (id == NULL) + id = psprintf("UNKNOWN (%x)", record->xl_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 ", desc->rm_name, record->xl_len, record->xl_tot_len, @@ -394,7 +399,7 @@ XLogDumpDisplayRecord(XLogDumpConfig *config, XLogRecPtr ReadRecPtr, XLogRecord !!(XLR_BKP_BLOCK(1) & record->xl_info), !!(XLR_BKP_BLOCK(2) & record->xl_info), !!(XLR_BKP_BLOCK(3) & record->xl_info), - desc->rm_identify(record->xl_info)); + id); /* the desc routine will printf the description directly to stdout */ desc->rm_desc(NULL, record); |