Commit c2a67248 authored by Heikki Linnakangas's avatar Heikki Linnakangas

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.
parent b69c4e65
...@@ -1262,8 +1262,23 @@ begin:; ...@@ -1262,8 +1262,23 @@ begin:;
xlog_outrec(&buf, rechdr); xlog_outrec(&buf, rechdr);
if (rdata->data != NULL) 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, " - "); 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); elog(LOG, "%s", buf.data);
pfree(buf.data); pfree(buf.data);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment