]> granicus.if.org Git - postgresql/commitdiff
Pass more than the first XLogRecData entry to rm_desc, with WAL_DEBUG.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 26 Mar 2014 16:04:57 +0000 (18:04 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 26 Mar 2014 16:17:53 +0000 (18:17 +0200)
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

index b573185122fda459b4c4a0ebe045a7176f24c462..f9d6609d44ffd41725509cace945ad21733dd8b3 100644 (file)
@@ -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);