From c2a6724823c14fd442c5441eb169b2581781fef0 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas <heikki.linnakangas@iki.fi> Date: Wed, 26 Mar 2014 18:04:57 +0200 Subject: [PATCH] Pass more than the first XLogRecData entry to rm_desc, with WAL_DEBUG. If you compile with WAL_DEBUG and enable it with wal_debug=on, we used to only pass the first XLogRecData entry to the rm_desc routine. I think the original assumprion was that the first XLogRecData entry contains all the necessary information for the rm_desc routine, but that's a pretty shaky assumption. At least standby_redo didn't get the memo. To fix, piece together all the data in a temporary buffer, and pass that to the rm_desc routine. It's been like this forever, but the patch didn't apply cleanly to back-branches. Probably wouldn't be hard to fix the conflicts, but it's not worth the trouble. --- src/backend/access/transam/xlog.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index b573185122f..f9d6609d44f 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -1262,8 +1262,23 @@ begin:; xlog_outrec(&buf, rechdr); if (rdata->data != NULL) { + StringInfoData recordbuf; + + /* + * We have to piece together the WAL record data from the + * XLogRecData entries, so that we can pass it to the rm_desc + * function as one contiguous chunk. (but we can leave out any + * extra entries we created for backup blocks) + */ + rdt_lastnormal->next = NULL; + + initStringInfo(&recordbuf); + for (;rdata != NULL; rdata = rdata->next) + appendBinaryStringInfo(&recordbuf, rdata->data, rdata->len); + appendStringInfoString(&buf, " - "); - RmgrTable[rechdr->xl_rmid].rm_desc(&buf, rechdr->xl_info, rdata->data); + RmgrTable[rechdr->xl_rmid].rm_desc(&buf, rechdr->xl_info, recordbuf.data); + pfree(recordbuf.data); } elog(LOG, "%s", buf.data); pfree(buf.data); -- GitLab