diff options
author | Tom Lane | 2008-11-03 20:47:49 +0000 |
---|---|---|
committer | Tom Lane | 2008-11-03 20:47:49 +0000 |
commit | 9c56ac0ccf745f0bb9cccb8e11b66a15a551e8a7 (patch) | |
tree | fa208ab8c7e1a92fda7bbd63e0a829223ae91f45 | |
parent | e87430350c616ddfd81f83767d88c26a94fa1ff6 (diff) |
Clean up the messy semantics (not to mention inefficiency) of PageGetTempPage
by splitting it into three functions with better-defined behaviors.
Zdenek Kotala
-rw-r--r-- | src/backend/access/gin/gindatapage.c | 2 | ||||
-rw-r--r-- | src/backend/access/gin/ginentrypage.c | 2 | ||||
-rw-r--r-- | src/backend/access/gin/ginutil.c | 15 | ||||
-rw-r--r-- | src/backend/access/gin/ginvacuum.c | 2 | ||||
-rw-r--r-- | src/backend/access/gist/gist.c | 2 | ||||
-rw-r--r-- | src/backend/access/gist/gistvacuum.c | 14 | ||||
-rw-r--r-- | src/backend/access/nbtree/nbtinsert.c | 2 | ||||
-rw-r--r-- | src/backend/storage/page/bufpage.c | 51 | ||||
-rw-r--r-- | src/include/access/gin.h | 1 | ||||
-rw-r--r-- | src/include/storage/bufpage.h | 4 |
10 files changed, 50 insertions, 45 deletions
diff --git a/src/backend/access/gin/gindatapage.c b/src/backend/access/gin/gindatapage.c index 7b63ecb434..bf0651d311 100644 --- a/src/backend/access/gin/gindatapage.c +++ b/src/backend/access/gin/gindatapage.c @@ -445,7 +445,7 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe char *ptr; OffsetNumber separator; ItemPointer bound; - Page lpage = GinPageGetCopyPage(BufferGetPage(lbuf)); + Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf)); ItemPointerData oldbound = *GinDataPageGetRightBound(lpage); int sizeofitem = GinSizeOfItem(lpage); OffsetNumber maxoff = GinPageGetOpaque(lpage)->maxoff; diff --git a/src/backend/access/gin/ginentrypage.c b/src/backend/access/gin/ginentrypage.c index 548f02e154..b293700f2e 100644 --- a/src/backend/access/gin/ginentrypage.c +++ b/src/backend/access/gin/ginentrypage.c @@ -458,7 +458,7 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR leftrightmost = NULL; static ginxlogSplit data; Page page; - Page lpage = GinPageGetCopyPage(BufferGetPage(lbuf)); + Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf)); Page rpage = BufferGetPage(rbuf); Size pageSize = PageGetPageSize(lpage); diff --git a/src/backend/access/gin/ginutil.c b/src/backend/access/gin/ginutil.c index d77382005d..5e71c8594d 100644 --- a/src/backend/access/gin/ginutil.c +++ b/src/backend/access/gin/ginutil.c @@ -310,21 +310,6 @@ extractEntriesSU(GinState *ginstate, OffsetNumber attnum, Datum value, int32 *ne return entries; } -/* - * It's analog of PageGetTempPage(), but copies whole page - */ -Page -GinPageGetCopyPage(Page page) -{ - Size pageSize = PageGetPageSize(page); - Page tmppage; - - tmppage = (Page) palloc(pageSize); - memcpy(tmppage, page, pageSize); - - return tmppage; -} - Datum ginoptions(PG_FUNCTION_ARGS) { diff --git a/src/backend/access/gin/ginvacuum.c b/src/backend/access/gin/ginvacuum.c index 4aecf9f756..7db7d7c2a8 100644 --- a/src/backend/access/gin/ginvacuum.c +++ b/src/backend/access/gin/ginvacuum.c @@ -546,7 +546,7 @@ ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint3 * On first difference we create temporary page in memory * and copies content in to it. */ - tmppage = GinPageGetCopyPage(origpage); + tmppage = PageGetTempPageCopy(origpage); if (newN > 0) { diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index f4f63b4cf4..9a53941715 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -343,7 +343,7 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate) * we must create temporary page to operate */ dist->buffer = state->stack->buffer; - dist->page = PageGetTempPage(BufferGetPage(dist->buffer), sizeof(GISTPageOpaqueData)); + dist->page = PageGetTempPageCopySpecial(BufferGetPage(dist->buffer)); /* clean all flags except F_LEAF */ GistPageGetOpaque(dist->page)->flags = (is_leaf) ? F_LEAF : 0; diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c index 4eb7663df0..82be008e6b 100644 --- a/src/backend/access/gist/gistvacuum.c +++ b/src/backend/access/gist/gistvacuum.c @@ -144,18 +144,6 @@ gistDeleteSubtree(GistVacuum *gv, BlockNumber blkno) UnlockReleaseBuffer(buffer); } -static Page -GistPageGetCopyPage(Page page) -{ - Size pageSize = PageGetPageSize(page); - Page tmppage; - - tmppage = (Page) palloc(pageSize); - memcpy(tmppage, page, pageSize); - - return tmppage; -} - static ArrayTuple vacuumSplitPage(GistVacuum *gv, Page tempPage, Buffer buffer, IndexTuple *addon, int curlenaddon) { @@ -325,7 +313,7 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion) addon = (IndexTuple *) palloc(sizeof(IndexTuple) * lenaddon); /* get copy of page to work */ - tempPage = GistPageGetCopyPage(page); + tempPage = PageGetTempPageCopy(page); for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i)) { diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c index 5293179ed4..b167f12054 100644 --- a/src/backend/access/nbtree/nbtinsert.c +++ b/src/backend/access/nbtree/nbtinsert.c @@ -793,7 +793,7 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright, rbuf = _bt_getbuf(rel, P_NEW, BT_WRITE); origpage = BufferGetPage(buf); - leftpage = PageGetTempPage(origpage, sizeof(BTPageOpaqueData)); + leftpage = PageGetTempPage(origpage); rightpage = BufferGetPage(rbuf); _bt_pageinit(leftpage, BufferGetPageSize(buf)); diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c index fb4e953dd1..377ecbac3f 100644 --- a/src/backend/storage/page/bufpage.c +++ b/src/backend/storage/page/bufpage.c @@ -254,28 +254,59 @@ PageAddItem(Page page, /* * PageGetTempPage - * Get a temporary page in local memory for special processing + * Get a temporary page in local memory for special processing. + * The returned page is not initialized at all; caller must do that. */ Page -PageGetTempPage(Page page, Size specialSize) +PageGetTempPage(Page page) +{ + Size pageSize; + Page temp; + + pageSize = PageGetPageSize(page); + temp = (Page) palloc(pageSize); + + return temp; +} + +/* + * PageGetTempPageCopy + * Get a temporary page in local memory for special processing. + * The page is initialized by copying the contents of the given page. + */ +Page +PageGetTempPageCopy(Page page) { Size pageSize; Page temp; - PageHeader thdr; pageSize = PageGetPageSize(page); temp = (Page) palloc(pageSize); - thdr = (PageHeader) temp; - /* copy old page in */ memcpy(temp, page, pageSize); - /* set high, low water marks */ - thdr->pd_lower = SizeOfPageHeaderData; - thdr->pd_upper = pageSize - MAXALIGN(specialSize); + return temp; +} + +/* + * PageGetTempPageCopySpecial + * Get a temporary page in local memory for special processing. + * The page is PageInit'd with the same special-space size as the + * given page, and the special space is copied from the given page. + */ +Page +PageGetTempPageCopySpecial(Page page) +{ + Size pageSize; + Page temp; + + pageSize = PageGetPageSize(page); + temp = (Page) palloc(pageSize); - /* clear out the middle */ - MemSet((char *) temp + thdr->pd_lower, 0, thdr->pd_upper - thdr->pd_lower); + PageInit(temp, pageSize, PageGetSpecialSize(page)); + memcpy(PageGetSpecialPointer(temp), + PageGetSpecialPointer(page), + PageGetSpecialSize(page)); return temp; } diff --git a/src/include/access/gin.h b/src/include/access/gin.h index b081d2e672..0fd2cbd1bf 100644 --- a/src/include/access/gin.h +++ b/src/include/access/gin.h @@ -246,7 +246,6 @@ extern int compareAttEntries(GinState *ginstate, OffsetNumber attnum_a, Datum a, extern Datum *extractEntriesS(GinState *ginstate, OffsetNumber attnum, Datum value, int32 *nentries, bool *needUnique); extern Datum *extractEntriesSU(GinState *ginstate, OffsetNumber attnum, Datum value, int32 *nentries); -extern Page GinPageGetCopyPage(Page page); extern Datum gin_index_getattr(GinState *ginstate, IndexTuple tuple); extern OffsetNumber gintuple_get_attrnum(GinState *ginstate, IndexTuple tuple); diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h index e60ffca76c..8ae51af34f 100644 --- a/src/include/storage/bufpage.h +++ b/src/include/storage/bufpage.h @@ -362,7 +362,9 @@ extern void PageInit(Page page, Size pageSize, Size specialSize); extern bool PageHeaderIsValid(PageHeader page); extern OffsetNumber PageAddItem(Page page, Item item, Size size, OffsetNumber offsetNumber, bool overwrite, bool is_heap); -extern Page PageGetTempPage(Page page, Size specialSize); +extern Page PageGetTempPage(Page page); +extern Page PageGetTempPageCopy(Page page); +extern Page PageGetTempPageCopySpecial(Page page); extern void PageRestoreTempPage(Page tempPage, Page oldPage); extern void PageRepairFragmentation(Page page); extern Size PageGetFreeSpace(Page page); |