diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c index bf2174c37c7e7db296e33347348e3c384fb1ce7d..79fbb496b54461cebb62dc693d2289ef3f5bc914 100644 --- a/src/backend/access/gin/ginxlog.c +++ b/src/backend/access/gin/ginxlog.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/ginxlog.c,v 1.9 2007/09/20 17:56:30 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/ginxlog.c,v 1.10 2007/10/29 19:26:57 teodor Exp $ *------------------------------------------------------------------------- */ #include "postgres.h" @@ -53,7 +53,6 @@ static void forgetIncompleteSplit(RelFileNode node, BlockNumber leftBlkno, BlockNumber updateBlkno) { ListCell *l; - bool found = false; foreach(l, incomplete_splits) { @@ -62,16 +61,9 @@ forgetIncompleteSplit(RelFileNode node, BlockNumber leftBlkno, BlockNumber updat if (RelFileNodeEquals(node, split->node) && leftBlkno == split->leftBlkno && updateBlkno == split->rightBlkno) { incomplete_splits = list_delete_ptr(incomplete_splits, split); - found = true; break; } } - - if (!found) - { - elog(ERROR, "failed to identify corresponding split record for %u/%u/%u", - node.relNode, leftBlkno, updateBlkno); - } } static void @@ -129,7 +121,7 @@ ginRedoInsert(XLogRecPtr lsn, XLogRecord *record) Buffer buffer; Page page; - /* nothing else to do if page was backed up (and no info to do it with) */ + /* nothing else to do if page was backed up */ if (record->xl_info & XLR_BKP_BLOCK_1) return; @@ -143,37 +135,44 @@ ginRedoInsert(XLogRecPtr lsn, XLogRecord *record) Assert(data->isDelete == FALSE); Assert(GinPageIsData(page)); - if (data->isLeaf) + if ( ! XLByteLE(lsn, PageGetLSN(page)) ) { - OffsetNumber i; - ItemPointerData *items = (ItemPointerData *) (XLogRecGetData(record) + sizeof(ginxlogInsert)); + if (data->isLeaf) + { + OffsetNumber i; + ItemPointerData *items = (ItemPointerData *) (XLogRecGetData(record) + sizeof(ginxlogInsert)); - Assert(GinPageIsLeaf(page)); - Assert(data->updateBlkno == InvalidBlockNumber); + Assert(GinPageIsLeaf(page)); + Assert(data->updateBlkno == InvalidBlockNumber); - for (i = 0; i < data->nitem; i++) - GinDataPageAddItem(page, items + i, data->offset + i); - } - else - { - PostingItem *pitem; + for (i = 0; i < data->nitem; i++) + GinDataPageAddItem(page, items + i, data->offset + i); + } + else + { + PostingItem *pitem; - Assert(!GinPageIsLeaf(page)); + Assert(!GinPageIsLeaf(page)); - if (data->updateBlkno != InvalidBlockNumber) - { - /* update link to right page after split */ - pitem = (PostingItem *) GinDataPageGetItem(page, data->offset); - PostingItemSetBlockNumber(pitem, data->updateBlkno); - } + if (data->updateBlkno != InvalidBlockNumber) + { + /* update link to right page after split */ + pitem = (PostingItem *) GinDataPageGetItem(page, data->offset); + PostingItemSetBlockNumber(pitem, data->updateBlkno); + } - pitem = (PostingItem *) (XLogRecGetData(record) + sizeof(ginxlogInsert)); + pitem = (PostingItem *) (XLogRecGetData(record) + sizeof(ginxlogInsert)); - GinDataPageAddItem(page, pitem, data->offset); + GinDataPageAddItem(page, pitem, data->offset); + } + } - if (data->updateBlkno != InvalidBlockNumber) - forgetIncompleteSplit(data->node, PostingItemGetBlockNumber(pitem), data->updateBlkno); + if (!data->isLeaf && data->updateBlkno != InvalidBlockNumber) + { + PostingItem *pitem = (PostingItem *) (XLogRecGetData(record) + sizeof(ginxlogInsert)); + forgetIncompleteSplit(data->node, PostingItemGetBlockNumber(pitem), data->updateBlkno); } + } else { @@ -181,36 +180,45 @@ ginRedoInsert(XLogRecPtr lsn, XLogRecord *record) Assert(!GinPageIsData(page)); - if (data->updateBlkno != InvalidBlockNumber) + if ( ! XLByteLE(lsn, PageGetLSN(page)) ) { - /* update link to right page after split */ - Assert(!GinPageIsLeaf(page)); - Assert(data->offset >= FirstOffsetNumber && data->offset <= PageGetMaxOffsetNumber(page)); - itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, data->offset)); - ItemPointerSet(&itup->t_tid, data->updateBlkno, InvalidOffsetNumber); - } + if (data->updateBlkno != InvalidBlockNumber) + { + /* update link to right page after split */ + Assert(!GinPageIsLeaf(page)); + Assert(data->offset >= FirstOffsetNumber && data->offset <= PageGetMaxOffsetNumber(page)); + itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, data->offset)); + ItemPointerSet(&itup->t_tid, data->updateBlkno, InvalidOffsetNumber); + } - if (data->isDelete) - { - Assert(GinPageIsLeaf(page)); - Assert(data->offset >= FirstOffsetNumber && data->offset <= PageGetMaxOffsetNumber(page)); - PageIndexTupleDelete(page, data->offset); - } + if (data->isDelete) + { + Assert(GinPageIsLeaf(page)); + Assert(data->offset >= FirstOffsetNumber && data->offset <= PageGetMaxOffsetNumber(page)); + PageIndexTupleDelete(page, data->offset); + } - itup = (IndexTuple) (XLogRecGetData(record) + sizeof(ginxlogInsert)); + itup = (IndexTuple) (XLogRecGetData(record) + sizeof(ginxlogInsert)); - if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), data->offset, false, false) == InvalidOffsetNumber) - elog(ERROR, "failed to add item to index page in %u/%u/%u", - data->node.spcNode, data->node.dbNode, data->node.relNode); + if (PageAddItem(page, (Item) itup, IndexTupleSize(itup), data->offset, false, false) == InvalidOffsetNumber) + elog(ERROR, "failed to add item to index page in %u/%u/%u", + data->node.spcNode, data->node.dbNode, data->node.relNode); + } if (!data->isLeaf && data->updateBlkno != InvalidBlockNumber) + { + itup = (IndexTuple) (XLogRecGetData(record) + sizeof(ginxlogInsert)); forgetIncompleteSplit(data->node, GinItemPointerGetBlockNumber(&itup->t_tid), data->updateBlkno); + } } - PageSetLSN(page, lsn); - PageSetTLI(page, ThisTimeLineID); + if ( ! XLByteLE(lsn, PageGetLSN(page)) ) + { + PageSetLSN(page, lsn); + PageSetTLI(page, ThisTimeLineID); - MarkBufferDirty(buffer); + MarkBufferDirty(buffer); + } UnlockReleaseBuffer(buffer); }