Re: GIN logging GIN_SEGMENT_UNMODIFIED actions? - Mailing list pgsql-hackers

From Tom Lane
Subject Re: GIN logging GIN_SEGMENT_UNMODIFIED actions?
Date
Msg-id 3424.1472569846@sss.pgh.pa.us
Whole thread Raw
In response to Re: GIN logging GIN_SEGMENT_UNMODIFIED actions?  (Fujii Masao <masao.fujii@gmail.com>)
Responses Re: GIN logging GIN_SEGMENT_UNMODIFIED actions?  (Fujii Masao <masao.fujii@gmail.com>)
List pgsql-hackers
Fujii Masao <masao.fujii@gmail.com> writes:
> I found that pg_xlogdump code for XLOG_GIN_INSERT record with
> GIN_INSERT_ISLEAF flag has the same issue, i.e.,
> "unknown action 0" error is thrown for that record.
> The latest patch fixes this.

Hmm, comparing gin_desc() to ginRedoInsert() makes me think there are more
problems there than that one.  Aren't the references to "payload" wrong
in all three branches of that "if" construct, not just the middle one?
I'm inclined to suspect we should restructure this more like
           {               ginxlogInsert *xlrec = (ginxlogInsert *) rec;
-               char       *payload = rec + sizeof(ginxlogInsert);
               appendStringInfo(buf, "isdata: %c isleaf: %c",                             (xlrec->flags &
GIN_INSERT_ISDATA)? 'T' : 'F',                            (xlrec->flags & GIN_INSERT_ISLEAF) ? 'T' : 'F');
if (!(xlrec->flags & GIN_INSERT_ISLEAF))               {
 
+                   char       *payload = rec + sizeof(ginxlogInsert);                   BlockNumber leftChildBlkno;
              BlockNumber rightChildBlkno;
 
                   leftChildBlkno = BlockIdGetBlockNumber((BlockId) payload);                   payload +=
sizeof(BlockIdData);                  rightChildBlkno = BlockIdGetBlockNumber((BlockId) payload);
payload+= sizeof(BlockNumber);                   appendStringInfo(buf, " children: %u/%u",
     leftChildBlkno, rightChildBlkno);               }
 
+               if (XLogRecHasBlockImage(record, 0))
+                   appendStringInfoString(buf, " (full page image)");
+               else
+               {
+                   char       *payload = XLogRecGetBlockData(record, 0, NULL);
+                   if (!(xlrec->flags & GIN_INSERT_ISDATA))                       appendStringInfo(buf, " isdelete:
%c",                      (((ginxlogInsertEntry *) payload)->isDelete) ? 'T' : 'F');                   ... etc etc ...
 


        regards, tom lane



pgsql-hackers by date:

Previous
From: Jesper Pedersen
Date:
Subject: pageinspect: Hash index support
Next
From: Bruce Momjian
Date:
Subject: Re: sequences and pg_upgrade