* 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;
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;
*/
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));
}
{
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;
}
{
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.
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)
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)
{
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();
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;
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)
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,
{
Page indexpage = BufferGetPage(indexbuffer);
- cb_indexpage_initialize(indexpage, xlrec->pageno, true);
+ cb_indexpage_initialize(indexpage, xlrec->pageno);
PageSetLSN(indexpage, lsn);
MarkBufferDirty(indexbuffer);
}
XLogRecPtr lsn = record->EndRecPtr;
xl_cb_allocate_index_page *xlrec;
Buffer indexbuffer;
- Buffer firstindexbuffer;
xlrec = (xl_cb_allocate_index_page *) XLogRecGetData(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);
}
/*
{
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);
}
/*
* 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?
/* 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
ForkNumber fork,
BlockNumber indexblock,
Buffer indexbuffer,
- BlockNumber firstindexblock,
- Buffer firstindexbuffer,
CBPageNo pageno,
bool needs_xlog);
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 */
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;