RootBuffer = GinNewBuffer(index);
START_CRIT_SECTION();
- GinInitMetabuffer(MetaBuffer);
+ GinInitMetabuffer(index, MetaBuffer);
MarkBufferDirty(MetaBuffer);
GinInitBuffer(RootBuffer, GIN_LEAF);
MarkBufferDirty(RootBuffer);
if (RelationNeedsWAL(index))
{
- XLogRecPtr recptr;
- XLogRecData rdata;
- Page page;
-
- rdata.buffer = InvalidBuffer;
- rdata.data = (char *) &(index->rd_node);
- rdata.len = sizeof(RelFileNode);
- rdata.next = NULL;
-
- recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_CREATE_INDEX, &rdata);
-
- page = BufferGetPage(RootBuffer);
- PageSetLSN(page, recptr);
- PageSetTLI(page, ThisTimeLineID);
-
- page = BufferGetPage(MetaBuffer);
- PageSetLSN(page, recptr);
- PageSetTLI(page, ThisTimeLineID);
+ log_newpage_buffer(MetaBuffer);
+ log_newpage_buffer(RootBuffer);
}
UnlockReleaseBuffer(MetaBuffer);
/* Initialize and xlog metabuffer and root buffer. */
START_CRIT_SECTION();
- GinInitMetabuffer(MetaBuffer);
+ GinInitMetabuffer(index, MetaBuffer);
MarkBufferDirty(MetaBuffer);
log_newpage_buffer(MetaBuffer);
GinInitBuffer(RootBuffer, GIN_LEAF);
}
void
-GinInitMetabuffer(Buffer b)
+GinInitMetabuffer(Relation rel, Buffer b)
{
GinMetaPageData *metadata;
Page page = BufferGetPage(b);
GinInitPage(page, GIN_META, BufferGetPageSize(b));
+ MetapageInit(rel, page);
metadata = GinPageGetMeta(page);
}
}
-static void
-ginRedoCreateIndex(XLogRecPtr lsn, XLogRecord *record)
-{
- RelFileNode *node = (RelFileNode *) XLogRecGetData(record);
- Buffer RootBuffer,
- MetaBuffer;
- Page page;
-
- MetaBuffer = XLogReadBuffer(*node, GIN_METAPAGE_BLKNO, true);
- Assert(BufferIsValid(MetaBuffer));
- page = (Page) BufferGetPage(MetaBuffer);
-
- GinInitMetabuffer(MetaBuffer);
-
- PageSetLSN(page, lsn);
- PageSetTLI(page, ThisTimeLineID);
- MarkBufferDirty(MetaBuffer);
-
- RootBuffer = XLogReadBuffer(*node, GIN_ROOT_BLKNO, true);
- Assert(BufferIsValid(RootBuffer));
- page = (Page) BufferGetPage(RootBuffer);
-
- GinInitBuffer(RootBuffer, GIN_LEAF);
-
- PageSetLSN(page, lsn);
- PageSetTLI(page, ThisTimeLineID);
- MarkBufferDirty(RootBuffer);
-
- UnlockReleaseBuffer(RootBuffer);
- UnlockReleaseBuffer(MetaBuffer);
-}
-
static void
ginRedoCreatePTree(XLogRecPtr lsn, XLogRecord *record)
{
topCtx = MemoryContextSwitchTo(opCtx);
switch (info)
{
- case XLOG_GIN_CREATE_INDEX:
- ginRedoCreateIndex(lsn, record);
- break;
case XLOG_GIN_CREATE_PTREE:
ginRedoCreatePTree(lsn, record);
break;
switch (info)
{
- case XLOG_GIN_CREATE_INDEX:
- appendStringInfo(buf, "Create index, ");
- desc_node(buf, *(RelFileNode *) rec, GIN_ROOT_BLKNO);
- break;
case XLOG_GIN_CREATE_PTREE:
appendStringInfo(buf, "Create posting tree, ");
desc_node(buf, ((ginxlogCreatePostingTree *) rec)->node, ((ginxlogCreatePostingTree *) rec)->blkno);
/* XLog stuff */
-#define XLOG_GIN_CREATE_INDEX 0x00
+/* 0x00 is free, was XLOG_GIN_CREATE_INDEX */
#define XLOG_GIN_CREATE_PTREE 0x10
extern Buffer GinNewBuffer(Relation index);
extern void GinInitBuffer(Buffer b, uint32 f);
extern void GinInitPage(Page page, uint32 f, Size pageSize);
-extern void GinInitMetabuffer(Buffer b);
+extern void GinInitMetabuffer(Relation rel, Buffer b);
extern int ginCompareEntries(GinState *ginstate, OffsetNumber attnum,
Datum a, GinNullCategory categorya,
Datum b, GinNullCategory categoryb);