Re: GIN logging GIN_SEGMENT_UNMODIFIED actions?

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: GIN logging GIN_SEGMENT_UNMODIFIED actions?
Дата
Msg-id 3424.1472569846@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: GIN logging GIN_SEGMENT_UNMODIFIED actions?  (Fujii Masao <masao.fujii@gmail.com>)
Ответы Re: GIN logging GIN_SEGMENT_UNMODIFIED actions?
Список 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 по дате отправления: