On 11/25/2014 05:36 AM, Andres Freund wrote:
Hi,

The new WAL format calculates FPI vs plain record data like:
        rec_len = XLogRecGetDataLen(record) + SizeOfXLogRecord;
        fpi_len = record->decoded_record->xl_tot_len - rec_len;

Due to the amount of data now handled outside the main data portion ,
that doesn't seem correct to me. As an example, a couple thousand
inserts with full_page_writes=off now yields:

Type                                           N      (%)          Record size  
    (%)             FPI size      (%)        Combined size      (%)
----                                           -      ---          -----------  
    ---             --------      ---        -------------      ---
Heap/INSERT                                30167 ( 99.53)               814509 
( 99.50)               965856 ( 99.54)              1780365 ( 99.52)

I think fpi_len now needs to only count the sum of the of the actual
length of block images, and all the rest needs to be rec_len.

Yeah, that's broken.

I propose the attached. Or does anyone want to argue for adding an
XLogRecGetFPILen() accessor macro for the hole_length in xlogreader.h. It's not something a redo routine would need, nor most XLOG-reading applications, so I thought it's better to just have pg_xlogdump peek into the DecodedBkpBlock struct directly.

- Heikki

diff --git a/contrib/pg_xlogdump/pg_xlogdump.c b/contrib/pg_xlogdump/pg_xlogdump.c
index 26556dc..9f05e25 100644
--- a/contrib/pg_xlogdump/pg_xlogdump.c
+++ b/contrib/pg_xlogdump/pg_xlogdump.c
@@ -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;
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to