Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b4eae02

Browse files
committed
Clean up the messy semantics (not to mention inefficiency) of PageGetTempPage
by splitting it into three functions with better-defined behaviors. Zdenek Kotala
1 parent f0dae70 commit b4eae02

File tree

10 files changed

+60
-55
lines changed

10 files changed

+60
-55
lines changed

src/backend/access/gin/gindatapage.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gin/gindatapage.c,v 1.11 2008/06/19 00:46:03 alvherre Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gin/gindatapage.c,v 1.12 2008/11/03 20:47:48 tgl Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414

@@ -445,7 +445,7 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
445445
char *ptr;
446446
OffsetNumber separator;
447447
ItemPointer bound;
448-
Page lpage = GinPageGetCopyPage(BufferGetPage(lbuf));
448+
Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf));
449449
ItemPointerData oldbound = *GinDataPageGetRightBound(lpage);
450450
int sizeofitem = GinSizeOfItem(lpage);
451451
OffsetNumber maxoff = GinPageGetOpaque(lpage)->maxoff;

src/backend/access/gin/ginentrypage.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gin/ginentrypage.c,v 1.17 2008/07/11 21:06:29 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gin/ginentrypage.c,v 1.18 2008/11/03 20:47:48 tgl Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414

@@ -458,7 +458,7 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
458458
leftrightmost = NULL;
459459
static ginxlogSplit data;
460460
Page page;
461-
Page lpage = GinPageGetCopyPage(BufferGetPage(lbuf));
461+
Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf));
462462
Page rpage = BufferGetPage(rbuf);
463463
Size pageSize = PageGetPageSize(lpage);
464464

src/backend/access/gin/ginutil.c

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gin/ginutil.c,v 1.17 2008/09/30 10:52:10 heikki Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gin/ginutil.c,v 1.18 2008/11/03 20:47:48 tgl Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414

@@ -310,21 +310,6 @@ extractEntriesSU(GinState *ginstate, OffsetNumber attnum, Datum value, int32 *ne
310310
return entries;
311311
}
312312

313-
/*
314-
* It's analog of PageGetTempPage(), but copies whole page
315-
*/
316-
Page
317-
GinPageGetCopyPage(Page page)
318-
{
319-
Size pageSize = PageGetPageSize(page);
320-
Page tmppage;
321-
322-
tmppage = (Page) palloc(pageSize);
323-
memcpy(tmppage, page, pageSize);
324-
325-
return tmppage;
326-
}
327-
328313
Datum
329314
ginoptions(PG_FUNCTION_ARGS)
330315
{

src/backend/access/gin/ginvacuum.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.24 2008/10/31 15:04:59 heikki Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.25 2008/11/03 20:47:48 tgl Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414

@@ -546,7 +546,7 @@ ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint3
546546
* On first difference we create temporary page in memory
547547
* and copies content in to it.
548548
*/
549-
tmppage = GinPageGetCopyPage(origpage);
549+
tmppage = PageGetTempPageCopy(origpage);
550550

551551
if (newN > 0)
552552
{

src/backend/access/gist/gist.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.152 2008/09/30 10:52:10 heikki Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.153 2008/11/03 20:47:48 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -343,7 +343,7 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate)
343343
* we must create temporary page to operate
344344
*/
345345
dist->buffer = state->stack->buffer;
346-
dist->page = PageGetTempPage(BufferGetPage(dist->buffer), sizeof(GISTPageOpaqueData));
346+
dist->page = PageGetTempPageCopySpecial(BufferGetPage(dist->buffer));
347347

348348
/* clean all flags except F_LEAF */
349349
GistPageGetOpaque(dist->page)->flags = (is_leaf) ? F_LEAF : 0;

src/backend/access/gist/gistvacuum.c

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.39 2008/10/31 15:04:59 heikki Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.40 2008/11/03 20:47:48 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -144,18 +144,6 @@ gistDeleteSubtree(GistVacuum *gv, BlockNumber blkno)
144144
UnlockReleaseBuffer(buffer);
145145
}
146146

147-
static Page
148-
GistPageGetCopyPage(Page page)
149-
{
150-
Size pageSize = PageGetPageSize(page);
151-
Page tmppage;
152-
153-
tmppage = (Page) palloc(pageSize);
154-
memcpy(tmppage, page, pageSize);
155-
156-
return tmppage;
157-
}
158-
159147
static ArrayTuple
160148
vacuumSplitPage(GistVacuum *gv, Page tempPage, Buffer buffer, IndexTuple *addon, int curlenaddon)
161149
{
@@ -325,7 +313,7 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion)
325313
addon = (IndexTuple *) palloc(sizeof(IndexTuple) * lenaddon);
326314

327315
/* get copy of page to work */
328-
tempPage = GistPageGetCopyPage(page);
316+
tempPage = PageGetTempPageCopy(page);
329317

330318
for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
331319
{

src/backend/access/nbtree/nbtinsert.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.167 2008/06/11 08:38:56 heikki Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.168 2008/11/03 20:47:48 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -793,7 +793,7 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
793793

794794
rbuf = _bt_getbuf(rel, P_NEW, BT_WRITE);
795795
origpage = BufferGetPage(buf);
796-
leftpage = PageGetTempPage(origpage, sizeof(BTPageOpaqueData));
796+
leftpage = PageGetTempPage(origpage);
797797
rightpage = BufferGetPage(rbuf);
798798

799799
_bt_pageinit(leftpage, BufferGetPageSize(buf));

src/backend/storage/page/bufpage.c

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/storage/page/bufpage.c,v 1.80 2008/07/13 21:50:04 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/storage/page/bufpage.c,v 1.81 2008/11/03 20:47:48 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -254,28 +254,59 @@ PageAddItem(Page page,
254254

255255
/*
256256
* PageGetTempPage
257-
* Get a temporary page in local memory for special processing
257+
* Get a temporary page in local memory for special processing.
258+
* The returned page is not initialized at all; caller must do that.
258259
*/
259260
Page
260-
PageGetTempPage(Page page, Size specialSize)
261+
PageGetTempPage(Page page)
262+
{
263+
Size pageSize;
264+
Page temp;
265+
266+
pageSize = PageGetPageSize(page);
267+
temp = (Page) palloc(pageSize);
268+
269+
return temp;
270+
}
271+
272+
/*
273+
* PageGetTempPageCopy
274+
* Get a temporary page in local memory for special processing.
275+
* The page is initialized by copying the contents of the given page.
276+
*/
277+
Page
278+
PageGetTempPageCopy(Page page)
261279
{
262280
Size pageSize;
263281
Page temp;
264-
PageHeader thdr;
265282

266283
pageSize = PageGetPageSize(page);
267284
temp = (Page) palloc(pageSize);
268-
thdr = (PageHeader) temp;
269285

270-
/* copy old page in */
271286
memcpy(temp, page, pageSize);
272287

273-
/* set high, low water marks */
274-
thdr->pd_lower = SizeOfPageHeaderData;
275-
thdr->pd_upper = pageSize - MAXALIGN(specialSize);
288+
return temp;
289+
}
290+
291+
/*
292+
* PageGetTempPageCopySpecial
293+
* Get a temporary page in local memory for special processing.
294+
* The page is PageInit'd with the same special-space size as the
295+
* given page, and the special space is copied from the given page.
296+
*/
297+
Page
298+
PageGetTempPageCopySpecial(Page page)
299+
{
300+
Size pageSize;
301+
Page temp;
302+
303+
pageSize = PageGetPageSize(page);
304+
temp = (Page) palloc(pageSize);
276305

277-
/* clear out the middle */
278-
MemSet((char *) temp + thdr->pd_lower, 0, thdr->pd_upper - thdr->pd_lower);
306+
PageInit(temp, pageSize, PageGetSpecialSize(page));
307+
memcpy(PageGetSpecialPointer(temp),
308+
PageGetSpecialPointer(page),
309+
PageGetSpecialSize(page));
279310

280311
return temp;
281312
}

src/include/access/gin.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*
55
* Copyright (c) 2006-2008, PostgreSQL Global Development Group
66
*
7-
* $PostgreSQL: pgsql/src/include/access/gin.h,v 1.25 2008/10/20 13:39:44 teodor Exp $
7+
* $PostgreSQL: pgsql/src/include/access/gin.h,v 1.26 2008/11/03 20:47:49 tgl Exp $
88
*--------------------------------------------------------------------------
99
*/
1010

@@ -246,7 +246,6 @@ extern int compareAttEntries(GinState *ginstate, OffsetNumber attnum_a, Datum a,
246246
extern Datum *extractEntriesS(GinState *ginstate, OffsetNumber attnum, Datum value,
247247
int32 *nentries, bool *needUnique);
248248
extern Datum *extractEntriesSU(GinState *ginstate, OffsetNumber attnum, Datum value, int32 *nentries);
249-
extern Page GinPageGetCopyPage(Page page);
250249

251250
extern Datum gin_index_getattr(GinState *ginstate, IndexTuple tuple);
252251
extern OffsetNumber gintuple_get_attrnum(GinState *ginstate, IndexTuple tuple);

src/include/storage/bufpage.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/include/storage/bufpage.h,v 1.83 2008/07/14 03:22:32 tgl Exp $
10+
* $PostgreSQL: pgsql/src/include/storage/bufpage.h,v 1.84 2008/11/03 20:47:49 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -362,7 +362,9 @@ extern void PageInit(Page page, Size pageSize, Size specialSize);
362362
extern bool PageHeaderIsValid(PageHeader page);
363363
extern OffsetNumber PageAddItem(Page page, Item item, Size size,
364364
OffsetNumber offsetNumber, bool overwrite, bool is_heap);
365-
extern Page PageGetTempPage(Page page, Size specialSize);
365+
extern Page PageGetTempPage(Page page);
366+
extern Page PageGetTempPageCopy(Page page);
367+
extern Page PageGetTempPageCopySpecial(Page page);
366368
extern void PageRestoreTempPage(Page tempPage, Page oldPage);
367369
extern void PageRepairFragmentation(Page page);
368370
extern Size PageGetFreeSpace(Page page);

0 commit comments

Comments
 (0)