rip out cbidx_pages_initialized and a bunch of related complexity
authorRobert Haas <rhaas@postgresql.org>
Fri, 1 Oct 2021 17:35:22 +0000 (13:35 -0400)
committerRobert Haas <rhaas@postgresql.org>
Fri, 1 Oct 2021 17:35:22 +0000 (13:35 -0400)
src/backend/access/conveyor/cbindexpage.c
src/backend/access/conveyor/cbmodify.c
src/backend/access/conveyor/cbxlog.c
src/include/access/cbindexpage.h
src/include/access/cbindexpage_format.h
src/include/access/cbmodify.h
src/include/access/cbxlog.h

index 81b6050fecfe7b783c2e6a122a70ea7f85b39f7a..92a8d52774bc9325bbdd6e7c9dc4c91f1d16c130 100644 (file)
@@ -30,7 +30,7 @@ static CBIndexPageData *cb_indexpage_get_special(Page page);
  * for a page that is not the first one in the segment.
  */
 void
-cb_indexpage_initialize(Page page, CBPageNo pageno, bool first_in_segment)
+cb_indexpage_initialize(Page page, CBPageNo pageno)
 {
        CBIndexPageData *ipd;
        int             i;
@@ -38,7 +38,6 @@ cb_indexpage_initialize(Page page, CBPageNo pageno, bool first_in_segment)
        PageInit(page, BLCKSZ, sizeof(CBIndexPageData));
        ipd = (CBIndexPageData *) PageGetSpecialPointer(page);
        ipd->cbidx_magic = CB_INDEXPAGE_MAGIC;
-       ipd->cbidx_pages_initialized = first_in_segment ? 1 : 0;
        ipd->cbidx_next_segment = CB_INVALID_SEGMENT;
        ipd->cbidx_first_page = pageno;
 
@@ -82,26 +81,20 @@ cb_indexpage_find_logical_page(Page page, CBPageNo pageno,
  */
 void
 cb_indexpage_add_index_entries(Page page,
-                                                          CBPageNo pageno,
+                                                          unsigned pageoffset,
                                                           unsigned num_index_entries,
-                                                          CBSegNo *index_entries,
-                                                          uint16 pages_per_segment)
+                                                          CBSegNo *index_entries)
 {
        CBIndexPageData *ipd = cb_indexpage_get_special(page);
-       unsigned        offset;
 
        if (num_index_entries < 1 || num_index_entries > CB_INDEXPAGE_INDEX_ENTRIES)
                elog(ERROR, "can't add %u index entries to an index page",
                         num_index_entries);
-       if (pageno < ipd->cbidx_first_page)
-               elog(ERROR, "can't add index entries starting with page " UINT64_FORMAT " to an index page that starts at page " UINT64_FORMAT,
-                        pageno, ipd->cbidx_first_page);
-       offset = (pageno - ipd->cbidx_first_page) / pages_per_segment;
-       if (offset + num_index_entries >= CB_INDEXPAGE_INDEX_ENTRIES)
-               elog(ERROR, "can't place %u index entries starting with page " UINT64_FORMAT " on an index page that starts at page " UINT64_FORMAT,
-                        num_index_entries, pageno, ipd->cbidx_first_page);
+       if (pageoffset + num_index_entries >= CB_INDEXPAGE_INDEX_ENTRIES)
+               elog(ERROR, "can't place %u index entries starting at offset %u",
+                        num_index_entries, pageoffset);
 
-       memcpy(&ipd->cbidx_entry[offset], index_entries,
+       memcpy(&ipd->cbidx_entry[pageoffset], index_entries,
                   num_index_entries * sizeof(CBSegNo));
 }
 
@@ -116,9 +109,6 @@ cb_indexpage_set_next_segment(Page page, CBSegNo segno)
 {
        CBIndexPageData *ipd = cb_indexpage_get_special(page);
 
-       if (ipd->cbidx_pages_initialized == 0)
-               elog(ERROR, "only the first page of a segment can have a next segment");
-
        ipd->cbidx_next_segment = segno;
 }
 
@@ -133,50 +123,9 @@ cb_indexpage_get_next_segment(Page page)
 {
        CBIndexPageData *ipd = cb_indexpage_get_special(page);
 
-       if (ipd->cbidx_pages_initialized == 0)
-               elog(ERROR, "only the first page of a segment can have a next segment");
-
        return ipd->cbidx_next_segment;
 }
 
-/*
- * Increment our count of the number of pages of an index segment that have
- * been initialized.
- *
- * This should only be used on the first page of an index segment, since
- * that's where the count is stored.
- */
-void
-cb_indexpage_increment_pages_initialized(Page page)
-{
-       CBIndexPageData *ipd = cb_indexpage_get_special(page);
-
-       if (ipd->cbidx_pages_initialized == 0)
-               elog(ERROR, "only the first page of a segment can have a next segment");
-
-       ipd->cbidx_pages_initialized++;
-}
-
-/*
- * Decrement our count of the number of pages of an index segment that have
- * been initialized.
- *
- * This should only be used on the first page of an index segment, since
- * that's where the count is stored.
- */
-void
-cb_indexpage_decrement_pages_initialized(Page page)
-{
-       CBIndexPageData *ipd = cb_indexpage_get_special(page);
-
-       if (ipd->cbidx_pages_initialized == 0)
-               elog(ERROR, "only the first page of a segment can have a next segment");
-       if (ipd->cbidx_pages_initialized == 1)
-               elog(ERROR, "number of initialized pages is already down to one");
-
-       ipd->cbidx_pages_initialized--;
-}
-
 /*
  * Given a page that is known to be a conveyor belt free space map page,
  * return a pointer to the CBFSMPageData, after checking the magic number.
index 9ba50c395ae985409f781094adeadd2f9bc9f842..c5e5b7e070987cb631126efae332d8976d4b8204 100644 (file)
@@ -266,7 +266,7 @@ cb_allocate_index_segment(RelFileNode *rnode,
        if (is_extend)
                cb_metapage_increment_next_segment(meta, segno);
 
-       cb_indexpage_initialize(indexpage, pageno, true);
+       cb_indexpage_initialize(indexpage, pageno);
        MarkBufferDirty(indexbuffer);
 
        if (prevblock != InvalidBlockNumber)
@@ -336,21 +336,17 @@ cb_allocate_index_page(RelFileNode *rnode,
                                           ForkNumber fork,
                                           BlockNumber indexblock,
                                           Buffer indexbuffer,
-                                          BlockNumber firstindexblock,
-                                          Buffer firstindexbuffer,
                                           CBPageNo pageno,
                                           bool needs_xlog)
 {
        Page            indexpage;
-       Page            firstindexpage;
 
        indexpage = BufferGetPage(indexbuffer);
-       firstindexpage = BufferGetPage(firstindexbuffer);
 
        START_CRIT_SECTION();
 
-       cb_indexpage_initialize(indexpage, pageno, false);
-       cb_indexpage_increment_pages_initialized(firstindexpage);
+       cb_indexpage_initialize(indexpage, pageno);
+       MarkBufferDirty(indexbuffer);
 
        if (needs_xlog)
        {
@@ -362,14 +358,11 @@ cb_allocate_index_page(RelFileNode *rnode,
                XLogBeginInsert();
                XLogRegisterBlock(0, rnode, fork, indexblock, indexpage,
                                                  REGBUF_STANDARD | REGBUF_WILL_INIT);
-               XLogRegisterBlock(1, rnode, fork, firstindexblock,
-                                                 firstindexpage, REGBUF_STANDARD);
                XLogRegisterData((char *) &xlrec, SizeOfCBAllocateIndexPage);
                lsn = XLogInsert(RM_CONVEYOR_ID,
                                                 XLOG_CONVEYOR_ALLOCATE_INDEX_PAGE);
 
                PageSetLSN(indexpage, lsn);
-               PageSetLSN(firstindexpage, lsn);
        }
 
        END_CRIT_SECTION();
@@ -391,10 +384,9 @@ cb_relocate_index_entries(RelFileNode *rnode,
                                                  Buffer metabuffer,
                                                  BlockNumber indexblock,
                                                  Buffer indexbuffer,
-                                                 CBPageNo pageno,
+                                                 unsigned pageoffset,
                                                  unsigned num_index_entries,
                                                  CBSegNo *index_entries,
-                                                 uint16 pages_per_segment,
                                                  bool needs_xlog)
 {
        Page            metapage;
@@ -408,8 +400,8 @@ cb_relocate_index_entries(RelFileNode *rnode,
 
        START_CRIT_SECTION();
 
-       cb_indexpage_add_index_entries(indexpage, pageno, num_index_entries,
-                                                                  index_entries, pages_per_segment);
+       cb_indexpage_add_index_entries(indexpage, pageoffset, num_index_entries,
+                                                                  index_entries);
        cb_metapage_remove_index_entries(meta, num_index_entries, true);
 
        if (needs_xlog)
@@ -417,9 +409,8 @@ cb_relocate_index_entries(RelFileNode *rnode,
                xl_cb_relocate_index_entries xlrec;
                XLogRecPtr      lsn;
 
-               xlrec.pageno = pageno;
+               xlrec.pageoffset = pageoffset;
                xlrec.num_index_entries = num_index_entries;
-               xlrec.pages_per_segment = pages_per_segment;
 
                XLogBeginInsert();
                XLogRegisterBlock(0, rnode, fork, CONVEYOR_METAPAGE, metapage,
index cc32e40225a7e1003ffe43fc0941450b0af1e177..e9d32ee870db529e486508976b8890478246cec4 100644 (file)
@@ -128,7 +128,7 @@ cb_xlog_allocate_index_segment(XLogReaderState *record)
        {
                Page    indexpage = BufferGetPage(indexbuffer);
 
-               cb_indexpage_initialize(indexpage, xlrec->pageno, true);
+               cb_indexpage_initialize(indexpage, xlrec->pageno);
                PageSetLSN(indexpage, lsn);
                MarkBufferDirty(indexbuffer);
        }
@@ -188,7 +188,6 @@ cb_xlog_allocate_index_page(XLogReaderState *record)
        XLogRecPtr      lsn = record->EndRecPtr;
        xl_cb_allocate_index_page *xlrec;
        Buffer          indexbuffer;
-       Buffer          firstindexbuffer;
 
        xlrec = (xl_cb_allocate_index_page *) XLogRecGetData(record);
 
@@ -197,24 +196,13 @@ cb_xlog_allocate_index_page(XLogReaderState *record)
        {
                Page    indexpage = BufferGetPage(indexbuffer);
 
-               cb_indexpage_initialize(indexpage, xlrec->pageno, false);
+               cb_indexpage_initialize(indexpage, xlrec->pageno);
                PageSetLSN(indexpage, lsn);
                MarkBufferDirty(indexbuffer);
        }
 
-       if (XLogReadBufferForRedo(record, 1, &firstindexbuffer) == BLK_NEEDS_REDO)
-       {
-               Page    firstindexpage = BufferGetPage(firstindexbuffer);
-
-               cb_indexpage_increment_pages_initialized(firstindexpage);
-               PageSetLSN(firstindexpage, lsn);
-               MarkBufferDirty(firstindexbuffer);
-       }
-
        if (BufferIsValid(indexbuffer))
                UnlockReleaseBuffer(indexbuffer);
-       if (BufferIsValid(firstindexbuffer))
-               UnlockReleaseBuffer(firstindexbuffer);
 }
 
 /*
@@ -235,11 +223,9 @@ cb_xlog_relocate_index_entries(XLogReaderState *record)
        {
                Page    indexpage = BufferGetPage(indexbuffer);
 
-               cb_indexpage_add_index_entries(indexpage, xlrec->pageno,
+               cb_indexpage_add_index_entries(indexpage, xlrec->pageoffset,
                                                                           xlrec->num_index_entries,
-                                                                          xlrec->index_entries,
-                                                                          xlrec->pages_per_segment);
-               cb_indexpage_initialize(indexpage, xlrec->pageno, false);
+                                                                          xlrec->index_entries);
                PageSetLSN(indexpage, lsn);
                MarkBufferDirty(indexbuffer);
        }
index 430d258018bcbaf577aed582edc87d57a8fd3710..ef4973255d7b6c1e2db46db51e8af881c1026dd0 100644 (file)
 /*
  * Function prototypes.
  */
-extern void cb_indexpage_initialize(Page page, CBPageNo pageno,
-                                                                       bool first_in_segment);
+extern void cb_indexpage_initialize(Page page, CBPageNo pageno);
 extern BlockNumber cb_indexpage_find_logical_page(Page page,
                                                                                                  CBPageNo pageno,
                                                                                                  uint16 pages_per_segment);
 extern void cb_indexpage_add_index_entries(Page page,
-                                                                                  CBPageNo pageno,
+                                                                                  unsigned pageoffset,
                                                                                   unsigned num_index_entries,
-                                                                                  CBSegNo *index_entries,
-                                                                                  uint16 pages_per_segment);
+                                                                                  CBSegNo *index_entries);
 extern void cb_indexpage_set_next_segment(Page page, CBSegNo segno);
 extern CBSegNo cb_indexpage_get_next_segment(Page page);
-extern void cb_indexpage_increment_pages_initialized(Page page);
-extern void cb_indexpage_decrement_pages_initialized(Page page);
 
 /*
  * How many index entries will fit into an index segment?
index 1b025f30be7f798f5af3ef9252f91e34d7880fe4..904ad9771425807916a3794a32994db58d65ad31 100644 (file)
@@ -33,14 +33,6 @@ typedef struct CBIndexPageData
        /* Always CB_INDEXPAGE_MAGIC. */
        uint32          cbidx_magic;
 
-       /*
-        * If this is the first page of an index segment, then this is the number
-        * of pages in this segment that are initialized, at least 1 and up to
-        * the number of pages per segment for this conveyor belt. If this is
-        * not the first page of the index segment, then 0.
-        */
-       uint16          cbidx_pages_initialized;
-
        /*
         * If this is the first page of an index segment and there is at least one
         * index segment after this one, then this is the segment number of the
index 5141062cdeeb6259842012f31f59255e7d33c700..60f015f37e38f0798b8258da8490893f611c6fb3 100644 (file)
@@ -74,8 +74,6 @@ extern void cb_allocate_index_page(RelFileNode *rnode,
                                                                   ForkNumber fork,
                                                                   BlockNumber indexblock,
                                                                   Buffer indexbuffer,
-                                                                  BlockNumber firstindexblock,
-                                                                  Buffer firstindexbuffer,
                                                                   CBPageNo pageno,
                                                                   bool needs_xlog);
 
@@ -84,10 +82,9 @@ extern void cb_relocate_index_entries(RelFileNode *rnode,
                                                                          Buffer metabuffer,
                                                                          BlockNumber indexblock,
                                                                          Buffer indexbuffer,
-                                                                         CBPageNo pageno,
+                                                                         unsigned pageoffset,
                                                                          unsigned num_index_entries,
                                                                          CBSegNo *index_entries,
-                                                                         uint16 pages_per_segment,
                                                                          bool needs_xlog);
 
 #endif                                                 /* CBMODIFY_H */
index 98c25da0c5c8918eddcb7958243eb7b4c00d72d2..c55e75a1562612f7d7a2fb934a9bafd927df10ef 100644 (file)
@@ -54,9 +54,8 @@ typedef struct xl_cb_allocate_index_page
 
 typedef struct xl_cb_relocate_index_entries
 {
-       CBPageNo        pageno;
+       unsigned        pageoffset;
        unsigned        num_index_entries;
-       uint16          pages_per_segment;
        CBSegNo         index_entries[FLEXIBLE_ARRAY_MEMBER];
 } xl_cb_relocate_index_entries;