From 4fb35e379c884b85614ba0b07a8f0f745b8a19fe Mon Sep 17 00:00:00 2001 From: x4m Date: Mon, 25 Jul 2016 13:52:55 +0500 Subject: [PATCH] brinpatch mend --- src/backend/access/brin/brin_pageops.c | 7 +++---- src/backend/access/brin/brin_xlog.c | 5 +---- src/backend/access/gist/gist.c | 2 +- src/backend/access/gist/gistxlog.c | 2 +- src/backend/storage/page/bufpage.c | 6 ++---- src/include/storage/bufpage.h | 2 +- 6 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/backend/access/brin/brin_pageops.c b/src/backend/access/brin/brin_pageops.c index d0ca485..63c252a 100644 --- a/src/backend/access/brin/brin_pageops.c +++ b/src/backend/access/brin/brin_pageops.c @@ -178,10 +178,9 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange, } START_CRIT_SECTION(); - PageIndexDeleteNoCompact(oldpage, &oldoff, 1); - if (PageAddItem(oldpage, (Item) newtup, newsz, oldoff, true, - false) == InvalidOffsetNumber) - elog(ERROR, "failed to add BRIN tuple"); + + PageIndexTupleOverwrite(oldpage,oldoff,(Item)newtup,newsz); + MarkBufferDirty(oldbuf); /* XLOG stuff */ diff --git a/src/backend/access/brin/brin_xlog.c b/src/backend/access/brin/brin_xlog.c index deb7af4..87c7894 100644 --- a/src/backend/access/brin/brin_xlog.c +++ b/src/backend/access/brin/brin_xlog.c @@ -192,10 +192,7 @@ brin_xlog_samepage_update(XLogReaderState *record) if (PageGetMaxOffsetNumber(page) + 1 < offnum) elog(PANIC, "brin_xlog_samepage_update: invalid max offset number"); - PageIndexDeleteNoCompact(page, &offnum, 1); - offnum = PageAddItem(page, (Item) brintuple, tuplen, offnum, true, false); - if (offnum == InvalidOffsetNumber) - elog(PANIC, "brin_xlog_samepage_update: failed to add tuple"); + PageIndexTupleOverwrite(page,offnum,(Item)brintuple, tuplen); PageSetLSN(page, lsn); MarkBufferDirty(buffer); diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index 5ac1211..6e2ac2a 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -508,7 +508,7 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate, /* if we have just one tuple to update we replace it in-place on page */ if(ntup == 1) { - PageIndexTupleOverwrite(page, oldoffnum, *itup); + PageIndexTupleOverwrite(page, oldoffnum, *itup,IndexTupleSize(*itup)); } else { diff --git a/src/backend/access/gist/gistxlog.c b/src/backend/access/gist/gistxlog.c index 934d50d..67461d9 100644 --- a/src/backend/access/gist/gistxlog.c +++ b/src/backend/access/gist/gistxlog.c @@ -90,7 +90,7 @@ gistRedoPageUpdateRecord(XLogReaderState *record) OffsetNumber offnum = *((OffsetNumber *) data); data += sizeof(OffsetNumber); itup = (IndexTuple) data; - PageIndexTupleOverwrite(page,offnum,itup); + PageIndexTupleOverwrite(page,offnum,itup,IndexTupleSize(itup)); /* set up data pointer to skip PageAddItem loop */ data +=IndexTupleSize(itup); Assert(data - begin == datalen); diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c index cfbd7f0..842f050 100644 --- a/src/backend/storage/page/bufpage.c +++ b/src/backend/storage/page/bufpage.c @@ -682,7 +682,7 @@ PageGetHeapFreeSpace(Page page) * Unlike heap pages, we keep compacted line pointers. */ void -PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup) +PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup, Size newsize) { PageHeader phdr = (PageHeader) page; char *addr; @@ -690,7 +690,6 @@ PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup) int size_diff; int oldsize; unsigned offset; - int newsize; unsigned alignednewsize; int itemcount; @@ -718,7 +717,6 @@ PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup) Assert(ItemIdHasStorage(tupid)); - newsize = IndexTupleSize(newtup); alignednewsize = MAXALIGN(newsize); oldsize = ItemIdGetLength(tupid); /* may have negative size here if new tuple is larger */ @@ -765,7 +763,7 @@ PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup) { ItemId ii = PageGetItemId(phdr, i); - Assert(ItemIdHasStorage(ii)); + //Assert(ItemIdHasStorage(ii)); if (ItemIdGetOffset(ii) <= offset) ii->lp_off += size_diff; } diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h index eee708b..ef08e7f 100644 --- a/src/include/storage/bufpage.h +++ b/src/include/storage/bufpage.h @@ -404,7 +404,7 @@ extern Size PageGetFreeSpace(Page page); extern Size PageGetExactFreeSpace(Page page); extern Size PageGetHeapFreeSpace(Page page); extern void PageIndexTupleDelete(Page page, OffsetNumber offset); -extern void PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup); +extern void PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup, Size newsize); extern void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems); extern void PageIndexDeleteNoCompact(Page page, OffsetNumber *itemnos, int nitems);