]> granicus.if.org Git - postgresql/commitdiff
Fix pg_xlogdump's calculation of full-page image data.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 5 Dec 2014 09:39:40 +0000 (11:39 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 5 Dec 2014 09:40:27 +0000 (11:40 +0200)
The old formula was completely bogus with the new WAL record format.

contrib/pg_xlogdump/pg_xlogdump.c

index 26556dc82deaa66f3ca323973b867b6c52593009..9f05e254a867eaa9d76901cc04c8d0f189b133a7 100644 (file)
@@ -351,14 +351,29 @@ XLogDumpCountRecord(XLogDumpConfig *config, XLogDumpStats *stats,
        uint8           recid;
        uint32          rec_len;
        uint32          fpi_len;
+       int                     block_id;
 
        stats->count++;
 
-       /* Update per-rmgr statistics */
-
        rmid = XLogRecGetRmid(record);
        rec_len = XLogRecGetDataLen(record) + SizeOfXLogRecord;
-       fpi_len = record->decoded_record->xl_tot_len - rec_len;
+
+       /*
+        * Calculate the amount of FPI data in the record. Each backup block
+        * takes up BLCKSZ bytes, minus the "hole" length.
+        *
+        * XXX: We peek into xlogreader's private decoded backup blocks for the
+        * hole_length. It doesn't seem worth it to add an accessor macro for
+        * this.
+        */
+       fpi_len = 0;
+       for (block_id = 0; block_id <= record->max_block_id; block_id++)
+       {
+               if (XLogRecHasBlockImage(record, block_id))
+                       fpi_len += BLCKSZ - record->blocks[block_id].hole_length;
+       }
+
+       /* Update per-rmgr statistics */
 
        stats->rmgr_stats[rmid].count++;
        stats->rmgr_stats[rmid].rec_len += rec_len;