Thanks Alvaro for review.

On Wed, Aug 19, 2020 at 3:21 AM Alvaro Herrera <alvhe...@2ndquadrant.com> wrote:
>
> I didn't like that you're documenting the message format in the new
> function:
>
> >               xl_logical_message *xlrec = (xl_logical_message *) rec;
> > +             /*
> > +              * Per LogLogicalMessage() actual logical message follows a 
> > null-terminated prefix of length
> > +              * prefix_size.
>
> I would prefer to remove this comment, and instead add a comment atop
> xl_logical_message's struct definition in message.h to say that the
> message has a valid C-string as prefix, whose length is prefix_size, and
> please see logicalmesg_desc() if you change this.

It's documented in the struct definition. Added a note about logicalmesg_desc().

> This way, you don't need to blame LogLogicalMessage for this
> restriction, but it's actually part of the definition of the WAL
> message.
>
> > +             /*
> > +              * Per LogLogicalMessage() actual logical message follows a 
> > null-terminated prefix of length
> > +              * prefix_size.
> > +              */
> > +             char   *prefix = xlrec->message;
> > +             char   *message = xlrec->message + xlrec->prefix_size;
> > +             int             cnt;
> > +             char   *sep = "";
>
> This would cause a crash if the message actually fails to follow the
> rule.  Let's test that prefix[xlrec->prefix_size] is a trailing zero,
> and if not, avoid printing it.  Although, just Assert()'ing that it's a
> trailing zero would seem to suffice.

Added an Assert.

>
> > +             appendStringInfo(buf, "%s message size %zu bytes, prefix %s; 
> > mesage: ",
> >                                                xlrec->transactional ? 
> > "transactional" : "nontransactional",
> > -                                              xlrec->message_size);
> > +                                              xlrec->message_size, prefix);
>
> Misspelled "message", but also the line looks a bit repetitive -- the
> word "message" would appear three times:
>
> > lsn: 0/01570608, prev 0/015705D0, desc: MESSAGE nontransactional message 
> > size 12 bytes, prefix some_prefix; mesage: 73 6F 6D 65 20 6D 65 73 73 61 67 
> > 65
>
> I would reduce it to
>
> > lsn: 0/01570608, prev 0/015705D0, desc: MESSAGE nontransactional, prefix 
> > "some_prefix"; payload (12 bytes): 73 6F 6D 65 20 6D 65 73 73 61 67 65

I like this format as well. Done.

PFA the patch attached with your comments addressed.

Thanks for your review.

-- 
Best Wishes,
Ashutosh Bapat
From d32859c8368ac25366b156c3247a5b77d9b72ce8 Mon Sep 17 00:00:00 2001
From: Ashutosh Bapat <ashutosh.ba...@2ndquadrant.com>
Date: Tue, 18 Aug 2020 11:05:29 +0530
Subject: [PATCH] Print prefix and logical WAL message content in pg_waldump

Print logical WAL message prefix which is a null terminated ASCII
string. Print the actual message as a space separated hex byte string
since it may contain binary data. This is useful for debugging purposes.

Ashutosh Bapat, reviewed by Alvaro Herrera
---
 src/backend/access/rmgrdesc/logicalmsgdesc.c | 16 ++++++++++++++--
 src/include/replication/message.h            |  4 +++-
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/backend/access/rmgrdesc/logicalmsgdesc.c b/src/backend/access/rmgrdesc/logicalmsgdesc.c
index bff298c928..5da2625a0b 100644
--- a/src/backend/access/rmgrdesc/logicalmsgdesc.c
+++ b/src/backend/access/rmgrdesc/logicalmsgdesc.c
@@ -24,10 +24,22 @@ logicalmsg_desc(StringInfo buf, XLogReaderState *record)
 	if (info == XLOG_LOGICAL_MESSAGE)
 	{
 		xl_logical_message *xlrec = (xl_logical_message *) rec;
+		char   *prefix = xlrec->message;
+		char   *message = xlrec->message + xlrec->prefix_size;
+		int		cnt;
+		char   *sep = "";
 
-		appendStringInfo(buf, "%s message size %zu bytes",
+		Assert(prefix[xlrec->prefix_size] != '\0');
+
+		appendStringInfo(buf, "%s, prefix \"%s\"; payload (%zu bytes): ",
 						 xlrec->transactional ? "transactional" : "nontransactional",
-						 xlrec->message_size);
+						 prefix, xlrec->message_size);
+		/* Write actual message as a series of hex bytes. */
+		for (cnt = 0; cnt < xlrec->message_size; cnt++)
+		{
+			appendStringInfo(buf, "%s%02X", sep, (unsigned char)message[cnt]);
+			sep = " ";
+		}
 	}
 }
 
diff --git a/src/include/replication/message.h b/src/include/replication/message.h
index 937addde48..7b882296ec 100644
--- a/src/include/replication/message.h
+++ b/src/include/replication/message.h
@@ -25,7 +25,9 @@ typedef struct xl_logical_message
 	Size		message_size;	/* size of the message */
 	char		message[FLEXIBLE_ARRAY_MEMBER]; /* message including the null
 												 * terminated prefix of length
-												 * prefix_size */
+												 * prefix_size. Please see
+												 * logicalmsg_desc(), if you
+												 * change this. */
 } xl_logical_message;
 
 #define SizeOfLogicalMessage	(offsetof(xl_logical_message, message))
-- 
2.17.1

Reply via email to