BlockNumber fixes - Mailing list pgsql-hackers

From Bruce Momjian
Subject BlockNumber fixes
Date
Msg-id 200207080351.g683pUI08688@candle.pha.pa.us
Whole thread Raw
Responses Re: BlockNumber fixes  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
We have the TODO item:

  * Make sure all block numbers are unsigned to increase maximum table size

I did some research on this and generated the following patch.  I didn't
find much in the way of problems except two vacuum.c fields that should
probably be BlockNumber.  freespace.c also has a numPages field in
FSMRelation that is int.  Should that be BlockNumber?

I am holding the patch until I get some feedback.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
Index: src/backend/commands/vacuum.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/vacuum.c,v
retrieving revision 1.230
diff -c -r1.230 vacuum.c
*** src/backend/commands/vacuum.c    20 Jun 2002 20:29:27 -0000    1.230
--- src/backend/commands/vacuum.c    8 Jul 2002 03:44:12 -0000
***************
*** 60,68 ****

  typedef struct VacPageListData
  {
!     BlockNumber empty_end_pages;    /* Number of "empty" end-pages */
!     int            num_pages;        /* Number of pages in pagedesc */
!     int            num_allocated_pages;    /* Number of allocated pages in
                                           * pagedesc */
      VacPage    *pagedesc;        /* Descriptions of pages */
  } VacPageListData;
--- 60,68 ----

  typedef struct VacPageListData
  {
!     BlockNumber empty_end_pages;        /* Number of "empty" end-pages */
!     BlockNumber    num_pages;                /* Number of pages in pagedesc */
!     BlockNumber    num_allocated_pages;    /* Number of allocated pages in
                                           * pagedesc */
      VacPage    *pagedesc;        /* Descriptions of pages */
  } VacPageListData;
***************
*** 988,994 ****
                  usable_free_size;
      Size        min_tlen = MaxTupleSize;
      Size        max_tlen = 0;
-     int            i;
      bool        do_shrinking = true;
      VTupleLink    vtlinks = (VTupleLink) palloc(100 * sizeof(VTupleLinkData));
      int            num_vtlinks = 0;
--- 988,993 ----
***************
*** 1285,1291 ****
       */
      if (do_shrinking)
      {
!         Assert((BlockNumber) fraged_pages->num_pages >= empty_end_pages);
          fraged_pages->num_pages -= empty_end_pages;
          usable_free_size = 0;
          for (i = 0; i < fraged_pages->num_pages; i++)
--- 1284,1292 ----
       */
      if (do_shrinking)
      {
!         BlockNumber    i;
!
!         Assert(fraged_pages->num_pages >= empty_end_pages);
          fraged_pages->num_pages -= empty_end_pages;
          usable_free_size = 0;
          for (i = 0; i < fraged_pages->num_pages; i++)
***************
*** 1412,1418 ****

      Nvacpagelist.num_pages = 0;
      num_fraged_pages = fraged_pages->num_pages;
!     Assert((BlockNumber) vacuum_pages->num_pages >= vacuum_pages->empty_end_pages);
      vacuumed_pages = vacuum_pages->num_pages - vacuum_pages->empty_end_pages;
      if (vacuumed_pages > 0)
      {
--- 1413,1419 ----

      Nvacpagelist.num_pages = 0;
      num_fraged_pages = fraged_pages->num_pages;
!     Assert(vacuum_pages->num_pages >= vacuum_pages->empty_end_pages);
      vacuumed_pages = vacuum_pages->num_pages - vacuum_pages->empty_end_pages;
      if (vacuumed_pages > 0)
      {
***************
*** 2332,2342 ****
              WriteBuffer(buf);
          }

!         /* now - free new list of reaped pages */
!         curpage = Nvacpagelist.pagedesc;
!         for (i = 0; i < Nvacpagelist.num_pages; i++, curpage++)
!             pfree(*curpage);
!         pfree(Nvacpagelist.pagedesc);
      }

      /*
--- 2333,2346 ----
              WriteBuffer(buf);
          }

!         {
!             BlockNumber i;
!             /* now - free new list of reaped pages */
!             curpage = Nvacpagelist.pagedesc;
!             for (i = 0; i < Nvacpagelist.num_pages; i++, curpage++)
!                 pfree(*curpage);
!             pfree(Nvacpagelist.pagedesc);
!         }
      }

      /*
***************
*** 2381,2393 ****
      Buffer        buf;
      VacPage    *vacpage;
      BlockNumber relblocks;
!     int            nblocks;
      int            i;

      nblocks = vacuum_pages->num_pages;
      nblocks -= vacuum_pages->empty_end_pages;    /* nothing to do with them */

!     for (i = 0, vacpage = vacuum_pages->pagedesc; i < nblocks; i++, vacpage++)
      {
          CHECK_FOR_INTERRUPTS();
          if ((*vacpage)->offsets_free > 0)
--- 2385,2398 ----
      Buffer        buf;
      VacPage    *vacpage;
      BlockNumber relblocks;
!     BlockNumber    nblocks;
!     BlockNumber    blks;
      int            i;

      nblocks = vacuum_pages->num_pages;
      nblocks -= vacuum_pages->empty_end_pages;    /* nothing to do with them */

!     for (blks = 0, vacpage = vacuum_pages->pagedesc; blks < nblocks; blks++, vacpage++)
      {
          CHECK_FOR_INTERRUPTS();
          if ((*vacpage)->offsets_free > 0)
***************
*** 2636,2643 ****
  vac_update_fsm(Relation onerel, VacPageList fraged_pages,
                 BlockNumber rel_pages)
  {
!     int            nPages = fraged_pages->num_pages;
!     int            i;
      BlockNumber *pages;
      Size       *spaceAvail;

--- 2641,2648 ----
  vac_update_fsm(Relation onerel, VacPageList fraged_pages,
                 BlockNumber rel_pages)
  {
!     BlockNumber    nPages = fraged_pages->num_pages;
!     BlockNumber    i;
      BlockNumber *pages;
      Size       *spaceAvail;

Index: src/backend/storage/freespace/freespace.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/storage/freespace/freespace.c,v
retrieving revision 1.12
diff -c -r1.12 freespace.c
*** src/backend/storage/freespace/freespace.c    20 Jun 2002 20:29:34 -0000    1.12
--- src/backend/storage/freespace/freespace.c    8 Jul 2002 03:44:13 -0000
***************
*** 371,382 ****
  MultiRecordFreeSpace(RelFileNode *rel,
                       BlockNumber minPage,
                       BlockNumber maxPage,
!                      int nPages,
                       BlockNumber *pages,
                       Size *spaceAvail)
  {
      FSMRelation *fsmrel;
!     int            i;

      LWLockAcquire(FreeSpaceLock, LW_EXCLUSIVE);
      fsmrel = lookup_fsm_rel(rel);
--- 371,382 ----
  MultiRecordFreeSpace(RelFileNode *rel,
                       BlockNumber minPage,
                       BlockNumber maxPage,
!                      BlockNumber nPages,
                       BlockNumber *pages,
                       Size *spaceAvail)
  {
      FSMRelation *fsmrel;
!     BlockNumber    i;

      LWLockAcquire(FreeSpaceLock, LW_EXCLUSIVE);
      fsmrel = lookup_fsm_rel(rel);
Index: src/backend/utils/adt/tid.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/tid.c,v
retrieving revision 1.31
diff -c -r1.31 tid.c
*** src/backend/utils/adt/tid.c    20 Jun 2002 20:29:38 -0000    1.31
--- src/backend/utils/adt/tid.c    8 Jul 2002 03:44:13 -0000
***************
*** 87,93 ****
      blockNumber = BlockIdGetBlockNumber(blockId);
      offsetNumber = itemPtr->ip_posid;

!     sprintf(buf, "(%d,%d)", (int) blockNumber, (int) offsetNumber);

      PG_RETURN_CSTRING(pstrdup(buf));
  }
--- 87,93 ----
      blockNumber = BlockIdGetBlockNumber(blockId);
      offsetNumber = itemPtr->ip_posid;

!     sprintf(buf, "(%u,%d)", blockNumber, (int) offsetNumber);

      PG_RETURN_CSTRING(pstrdup(buf));
  }
***************
*** 140,146 ****
   *        correspond to the CTID of a base relation.
   */
  static Datum
! currtid_for_view(Relation viewrel, ItemPointer tid)
  {
      TupleDesc    att = RelationGetDescr(viewrel);
      RuleLock    *rulelock;
--- 140,146 ----
   *        correspond to the CTID of a base relation.
   */
  static Datum
! currtid_for_view(Relation viewrel, ItemPointer tid)
  {
      TupleDesc    att = RelationGetDescr(viewrel);
      RuleLock    *rulelock;
Index: src/include/storage/freespace.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/storage/freespace.h,v
retrieving revision 1.7
diff -c -r1.7 freespace.h
*** src/include/storage/freespace.h    20 Jun 2002 20:29:52 -0000    1.7
--- src/include/storage/freespace.h    8 Jul 2002 03:44:14 -0000
***************
*** 38,44 ****
  extern void MultiRecordFreeSpace(RelFileNode *rel,
                       BlockNumber minPage,
                       BlockNumber maxPage,
!                      int nPages,
                       BlockNumber *pages,
                       Size *spaceAvail);
  extern void FreeSpaceMapForgetRel(RelFileNode *rel);
--- 38,44 ----
  extern void MultiRecordFreeSpace(RelFileNode *rel,
                       BlockNumber minPage,
                       BlockNumber maxPage,
!                      BlockNumber nPages,
                       BlockNumber *pages,
                       Size *spaceAvail);
  extern void FreeSpaceMapForgetRel(RelFileNode *rel);

pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Typo in htup.h comment
Next
From: "Christopher Kings-Lynne"
Date:
Subject: Re: DROP COLUMN Progress