[PATCH] PageGetTempPage cleanup - Mailing list pgsql-hackers

From Zdenek Kotala
Subject [PATCH] PageGetTempPage cleanup
Date
Msg-id 48E22CF5.4050503@sun.com
Whole thread Raw
Responses Re: [PATCH] PageGetTempPage cleanup  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
I attach patch which cleans up code around PageGetTempPage. These changes were
discussed here:

http://archives.postgresql.org/pgsql-hackers/2008-08/msg00102.php

        Zdenek


--
Zdenek Kotala              Sun Microsystems
Prague, Czech Republic     http://sun.com/postgresql

diff -cr pgsql_temppage.7d94b24b3ce6/src/backend/access/gin/gindatapage.c
pgsql_temppage/src/backend/access/gin/gindatapage.c
*** pgsql_temppage.7d94b24b3ce6/src/backend/access/gin/gindatapage.c    út zář 30 15:37:52 2008
--- pgsql_temppage/src/backend/access/gin/gindatapage.c    út zář 30 15:37:52 2008
***************
*** 445,451 ****
      char       *ptr;
      OffsetNumber separator;
      ItemPointer bound;
!     Page        lpage = GinPageGetCopyPage(BufferGetPage(lbuf));
      ItemPointerData oldbound = *GinDataPageGetRightBound(lpage);
      int            sizeofitem = GinSizeOfItem(lpage);
      OffsetNumber maxoff = GinPageGetOpaque(lpage)->maxoff;
--- 445,451 ----
      char       *ptr;
      OffsetNumber separator;
      ItemPointer bound;
!     Page        lpage = PageGetTempPage(BufferGetPage(lbuf), true);
      ItemPointerData oldbound = *GinDataPageGetRightBound(lpage);
      int            sizeofitem = GinSizeOfItem(lpage);
      OffsetNumber maxoff = GinPageGetOpaque(lpage)->maxoff;
diff -cr pgsql_temppage.7d94b24b3ce6/src/backend/access/gin/ginentrypage.c
pgsql_temppage/src/backend/access/gin/ginentrypage.c
*** pgsql_temppage.7d94b24b3ce6/src/backend/access/gin/ginentrypage.c    út zář 30 15:37:52 2008
--- pgsql_temppage/src/backend/access/gin/ginentrypage.c    út zář 30 15:37:52 2008
***************
*** 458,464 ****
                  leftrightmost = NULL;
      static ginxlogSplit data;
      Page        page;
!     Page        lpage = GinPageGetCopyPage(BufferGetPage(lbuf));
      Page        rpage = BufferGetPage(rbuf);
      Size        pageSize = PageGetPageSize(lpage);

--- 458,464 ----
                  leftrightmost = NULL;
      static ginxlogSplit data;
      Page        page;
!     Page        lpage = PageGetTempPage(BufferGetPage(lbuf), true);
      Page        rpage = BufferGetPage(rbuf);
      Size        pageSize = PageGetPageSize(lpage);

diff -cr pgsql_temppage.7d94b24b3ce6/src/backend/access/gin/ginutil.c pgsql_temppage/src/backend/access/gin/ginutil.c
*** pgsql_temppage.7d94b24b3ce6/src/backend/access/gin/ginutil.c    út zář 30 15:37:52 2008
--- pgsql_temppage/src/backend/access/gin/ginutil.c    út zář 30 15:37:52 2008
***************
*** 309,329 ****
      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)
  {
--- 309,314 ----
diff -cr pgsql_temppage.7d94b24b3ce6/src/backend/access/gin/ginvacuum.c
pgsql_temppage/src/backend/access/gin/ginvacuum.c
*** pgsql_temppage.7d94b24b3ce6/src/backend/access/gin/ginvacuum.c    út zář 30 15:37:52 2008
--- pgsql_temppage/src/backend/access/gin/ginvacuum.c    út zář 30 15:37:52 2008
***************
*** 529,535 ****
                       * On first difference we create temporary page in memory
                       * and copies content in to it.
                       */
!                     tmppage = GinPageGetCopyPage(origpage);

                      if (newN > 0)
                      {
--- 529,535 ----
                       * On first difference we create temporary page in memory
                       * and copies content in to it.
                       */
!                     tmppage = PageGetTempPage(origpage, true);

                      if (newN > 0)
                      {
diff -cr pgsql_temppage.7d94b24b3ce6/src/backend/access/gist/gist.c pgsql_temppage/src/backend/access/gist/gist.c
*** pgsql_temppage.7d94b24b3ce6/src/backend/access/gist/gist.c    út zář 30 15:37:52 2008
--- pgsql_temppage/src/backend/access/gist/gist.c    út zář 30 15:37:52 2008
***************
*** 339,345 ****
               * we must create temporary page to operate
               */
              dist->buffer = state->stack->buffer;
!             dist->page = PageGetTempPage(BufferGetPage(dist->buffer), sizeof(GISTPageOpaqueData));

              /* clean all flags except F_LEAF */
              GistPageGetOpaque(dist->page)->flags = (is_leaf) ? F_LEAF : 0;
--- 339,345 ----
               * we must create temporary page to operate
               */
              dist->buffer = state->stack->buffer;
!             dist->page = PageGetTempPageCopySpecial(BufferGetPage(dist->buffer));

              /* clean all flags except F_LEAF */
              GistPageGetOpaque(dist->page)->flags = (is_leaf) ? F_LEAF : 0;
diff -cr pgsql_temppage.7d94b24b3ce6/src/backend/access/gist/gistvacuum.c
pgsql_temppage/src/backend/access/gist/gistvacuum.c
*** pgsql_temppage.7d94b24b3ce6/src/backend/access/gist/gistvacuum.c    út zář 30 15:37:52 2008
--- pgsql_temppage/src/backend/access/gist/gistvacuum.c    út zář 30 15:37:52 2008
***************
*** 142,159 ****
      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)
  {
--- 142,147 ----
***************
*** 322,328 ****
          addon = (IndexTuple *) palloc(sizeof(IndexTuple) * lenaddon);

          /* get copy of page to work */
!         tempPage = GistPageGetCopyPage(page);

          for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
          {
--- 310,316 ----
          addon = (IndexTuple *) palloc(sizeof(IndexTuple) * lenaddon);

          /* get copy of page to work */
!         tempPage = PageGetTempPage(page, true);

          for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
          {
diff -cr pgsql_temppage.7d94b24b3ce6/src/backend/access/nbtree/nbtinsert.c
pgsql_temppage/src/backend/access/nbtree/nbtinsert.c
*** pgsql_temppage.7d94b24b3ce6/src/backend/access/nbtree/nbtinsert.c    út zář 30 15:37:52 2008
--- pgsql_temppage/src/backend/access/nbtree/nbtinsert.c    út zář 30 15:37:52 2008
***************
*** 793,799 ****

      rbuf = _bt_getbuf(rel, P_NEW, BT_WRITE);
      origpage = BufferGetPage(buf);
!     leftpage = PageGetTempPage(origpage, sizeof(BTPageOpaqueData));
      rightpage = BufferGetPage(rbuf);

      _bt_pageinit(leftpage, BufferGetPageSize(buf));
--- 793,799 ----

      rbuf = _bt_getbuf(rel, P_NEW, BT_WRITE);
      origpage = BufferGetPage(buf);
!     leftpage = PageGetTempPage(origpage, false);
      rightpage = BufferGetPage(rbuf);

      _bt_pageinit(leftpage, BufferGetPageSize(buf));
diff -cr pgsql_temppage.7d94b24b3ce6/src/backend/storage/page/bufpage.c
pgsql_temppage/src/backend/storage/page/bufpage.c
*** pgsql_temppage.7d94b24b3ce6/src/backend/storage/page/bufpage.c    út zář 30 15:37:52 2008
--- pgsql_temppage/src/backend/storage/page/bufpage.c    út zář 30 15:37:52 2008
***************
*** 254,263 ****

  /*
   * PageGetTempPage
!  *        Get a temporary page in local memory for special processing
   */
  Page
! PageGetTempPage(Page page, Size specialSize)
  {
      Size        pageSize;
      Page        temp;
--- 254,264 ----

  /*
   * PageGetTempPage
!  *        Get a temporary page in local memory for special processing. Caller is
!  * responsible to init page.
   */
  Page
! PageGetTempPage(Page page, bool copy)
  {
      Size        pageSize;
      Page        temp;
***************
*** 265,282 ****

      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);

!     /* clear out the middle */
!     MemSet((char *) temp + thdr->pd_lower, 0, thdr->pd_upper - thdr->pd_lower);

      return temp;
  }

--- 266,297 ----

      pageSize = PageGetPageSize(page);
      temp = (Page) palloc(pageSize);

!     if( copy )
!     {
!         memcpy(temp, page, pageSize);
!     }

!     return temp;
! }

! /*
!  * PageGetTempPageCopySpecial
!  *        Get a temporary page in local memory for special processing
!  * XXX: only consumer now is gistplacetopage(), so maybe we don't even want it
!  */
! Page
! PageGetTempPageCopySpecial(Page page)
! {
!     Size        pageSize;
!     Page        temp;

+     pageSize = PageGetPageSize(page);
+     temp = (Page) palloc(pageSize);
+
+     PageInit(temp, pageSize, PageGetSpecialSize(page));
+     memcpy(PageGetSpecialPointer(temp), PageGetSpecialPointer(page), PageGetSpecialSize(page));
+
      return temp;
  }

diff -cr pgsql_temppage.7d94b24b3ce6/src/include/access/gin.h pgsql_temppage/src/include/access/gin.h
*** pgsql_temppage.7d94b24b3ce6/src/include/access/gin.h    út zář 30 15:37:52 2008
--- pgsql_temppage/src/include/access/gin.h    út zář 30 15:37:52 2008
***************
*** 246,252 ****
  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);
--- 246,251 ----
diff -cr pgsql_temppage.7d94b24b3ce6/src/include/storage/bufpage.h pgsql_temppage/src/include/storage/bufpage.h
*** pgsql_temppage.7d94b24b3ce6/src/include/storage/bufpage.h    út zář 30 15:37:52 2008
--- pgsql_temppage/src/include/storage/bufpage.h    út zář 30 15:37:52 2008
***************
*** 362,368 ****
  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 void PageRestoreTempPage(Page tempPage, Page oldPage);
  extern void PageRepairFragmentation(Page page);
  extern Size PageGetFreeSpace(Page page);
--- 362,369 ----
  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, bool copy);
! extern Page PageGetTempPageCopySpecial(Page page);
  extern void PageRestoreTempPage(Page tempPage, Page oldPage);
  extern void PageRepairFragmentation(Page page);
  extern Size PageGetFreeSpace(Page page);

pgsql-hackers by date:

Previous
From: Dimitri Fontaine
Date:
Subject: Re: FSM rewrite committed, loose ends
Next
From: Heikki Linnakangas
Date:
Subject: Re: FSM rewrite committed, loose ends