aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFujii Masao <fujii@postgresql.org>2016-12-05 20:29:41 +0900
committerFujii Masao <fujii@postgresql.org>2016-12-05 20:32:00 +0900
commit8606271640401b5a4efd20c54e2850fa88118eb8 (patch)
treeb3c905d9c81b30aa3ec10defc4ffafd8f401d096
parent25c06a1ed647dca4f308026e00fd3e830b4ba383 (diff)
downloadpostgresql-8606271640401b5a4efd20c54e2850fa88118eb8.tar.gz
postgresql-8606271640401b5a4efd20c54e2850fa88118eb8.zip
Fix incorrect output from gin_desc().
Previously gin_desc() displayed incorrect output "unknown action 0" for XLOG_GIN_INSERT and XLOG_GIN_VACUUM_DATA_LEAF_PAGE records with valid actions. The cause of this problem was that gin_desc() wrongly used XLogRecGetData() to extract data from those records. Since they were registered by XLogRegisterBufData(), gin_desc() should have used XLogRecGetBlockData(), instead, like gin_redo(). Also there were other differences about how to treat XLOG_GIN_INSERT record between gin_desc() and gin_redo(). This commit fixes gin_desc() routine so that it treats those records in the same way as gin_redo(). Batch-patch to 9.5 where WAL record format was revamped and XLogRegisterBufData() was added. Reported-By: Andres Freund Reviewed-By: Tom Lane Discussion: <20160509194645.7lewnpw647zegx2m@alap3.anarazel.de>
-rw-r--r--src/backend/access/rmgrdesc/gindesc.c45
1 files changed, 24 insertions, 21 deletions
diff --git a/src/backend/access/rmgrdesc/gindesc.c b/src/backend/access/rmgrdesc/gindesc.c
index 09e928fb7c6..bb1b5981aaa 100644
--- a/src/backend/access/rmgrdesc/gindesc.c
+++ b/src/backend/access/rmgrdesc/gindesc.c
@@ -87,13 +87,13 @@ gin_desc(StringInfo buf, XLogReaderState *record)
case XLOG_GIN_INSERT:
{
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;
@@ -104,27 +104,27 @@ gin_desc(StringInfo buf, XLogReaderState *record)
appendStringInfo(buf, " children: %u/%u",
leftChildBlkno, rightChildBlkno);
}
- if (!(xlrec->flags & GIN_INSERT_ISDATA))
- appendStringInfo(buf, " isdelete: %c",
- (((ginxlogInsertEntry *) payload)->isDelete) ? 'T' : 'F');
- else if (xlrec->flags & GIN_INSERT_ISLEAF)
- {
- ginxlogRecompressDataLeaf *insertData =
- (ginxlogRecompressDataLeaf *) payload;
-
- if (XLogRecHasBlockImage(record, 0))
- appendStringInfoString(buf, " (full page image)");
- else
- desc_recompress_leaf(buf, insertData);
- }
+ if (XLogRecHasBlockImage(record, 0))
+ appendStringInfoString(buf, " (full page image)");
else
{
- ginxlogInsertDataInternal *insertData = (ginxlogInsertDataInternal *) payload;
+ char *payload = XLogRecGetBlockData(record, 0, NULL);
- appendStringInfo(buf, " pitem: %u-%u/%u",
- PostingItemGetBlockNumber(&insertData->newitem),
- ItemPointerGetBlockNumber(&insertData->newitem.key),
- ItemPointerGetOffsetNumber(&insertData->newitem.key));
+ if (!(xlrec->flags & GIN_INSERT_ISDATA))
+ appendStringInfo(buf, " isdelete: %c",
+ (((ginxlogInsertEntry *) payload)->isDelete) ? 'T' : 'F');
+ else if (xlrec->flags & GIN_INSERT_ISLEAF)
+ desc_recompress_leaf(buf, (ginxlogRecompressDataLeaf *) payload);
+ else
+ {
+ ginxlogInsertDataInternal *insertData =
+ (ginxlogInsertDataInternal *) payload;
+
+ appendStringInfo(buf, " pitem: %u-%u/%u",
+ PostingItemGetBlockNumber(&insertData->newitem),
+ ItemPointerGetBlockNumber(&insertData->newitem.key),
+ ItemPointerGetOffsetNumber(&insertData->newitem.key));
+ }
}
}
break;
@@ -144,12 +144,15 @@ gin_desc(StringInfo buf, XLogReaderState *record)
break;
case XLOG_GIN_VACUUM_DATA_LEAF_PAGE:
{
- ginxlogVacuumDataLeafPage *xlrec = (ginxlogVacuumDataLeafPage *) rec;
-
if (XLogRecHasBlockImage(record, 0))
appendStringInfoString(buf, " (full page image)");
else
+ {
+ ginxlogVacuumDataLeafPage *xlrec =
+ (ginxlogVacuumDataLeafPage *) XLogRecGetBlockData(record, 0, NULL);
+
desc_recompress_leaf(buf, &xlrec->data);
+ }
}
break;
case XLOG_GIN_DELETE_PAGE: