mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
Move BRIN page type to page's last two bytes
... which is the usual convention among AMs, so that pg_filedump and similar utilities can tell apart pages of different AMs. It was also the intent of the original code, but I failed to realize that alignment considerations would move the whole thing to the previous-to-last word in the page. The new definition of the associated macro makes surrounding code a bit leaner, too. Per note from Heikki at http://www.postgresql.org/message-id/546A16EF.9070005@vmware.com
This commit is contained in:
@ -53,7 +53,6 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
|
||||
BrinTuple *oldtup;
|
||||
Size oldsz;
|
||||
Buffer newbuf;
|
||||
BrinSpecialSpace *special;
|
||||
bool extended = false;
|
||||
|
||||
newsz = MAXALIGN(newsz);
|
||||
@ -113,8 +112,6 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
|
||||
return false;
|
||||
}
|
||||
|
||||
special = (BrinSpecialSpace *) PageGetSpecialPointer(oldpage);
|
||||
|
||||
/*
|
||||
* Great, the old tuple is intact. We can proceed with the update.
|
||||
*
|
||||
@ -124,7 +121,7 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
|
||||
* caller told us there isn't, if a concurrent update moved another tuple
|
||||
* elsewhere or replaced a tuple with a smaller one.
|
||||
*/
|
||||
if (((special->flags & BRIN_EVACUATE_PAGE) == 0) &&
|
||||
if (((BrinPageFlags(oldpage) & BRIN_EVACUATE_PAGE) == 0) &&
|
||||
brin_can_do_samepage_update(oldbuf, origsz, newsz))
|
||||
{
|
||||
if (BufferIsValid(newbuf))
|
||||
@ -374,12 +371,9 @@ brin_doinsert(Relation idxrel, BlockNumber pagesPerRange,
|
||||
void
|
||||
brin_page_init(Page page, uint16 type)
|
||||
{
|
||||
BrinSpecialSpace *special;
|
||||
|
||||
PageInit(page, BLCKSZ, sizeof(BrinSpecialSpace));
|
||||
|
||||
special = (BrinSpecialSpace *) PageGetSpecialPointer(page);
|
||||
special->type = type;
|
||||
BrinPageType(page) = type;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -420,7 +414,6 @@ brin_start_evacuating_page(Relation idxRel, Buffer buf)
|
||||
{
|
||||
OffsetNumber off;
|
||||
OffsetNumber maxoff;
|
||||
BrinSpecialSpace *special;
|
||||
Page page;
|
||||
|
||||
page = BufferGetPage(buf);
|
||||
@ -428,8 +421,6 @@ brin_start_evacuating_page(Relation idxRel, Buffer buf)
|
||||
if (PageIsNew(page))
|
||||
return false;
|
||||
|
||||
special = (BrinSpecialSpace *) PageGetSpecialPointer(page);
|
||||
|
||||
maxoff = PageGetMaxOffsetNumber(page);
|
||||
for (off = FirstOffsetNumber; off <= maxoff; off++)
|
||||
{
|
||||
@ -439,7 +430,7 @@ brin_start_evacuating_page(Relation idxRel, Buffer buf)
|
||||
if (ItemIdIsUsed(lp))
|
||||
{
|
||||
/* prevent other backends from adding more stuff to this page */
|
||||
special->flags |= BRIN_EVACUATE_PAGE;
|
||||
BrinPageFlags(page) |= BRIN_EVACUATE_PAGE;
|
||||
MarkBufferDirtyHint(buf, true);
|
||||
|
||||
return true;
|
||||
@ -463,8 +454,7 @@ brin_evacuate_page(Relation idxRel, BlockNumber pagesPerRange,
|
||||
|
||||
page = BufferGetPage(buf);
|
||||
|
||||
Assert(((BrinSpecialSpace *)
|
||||
PageGetSpecialPointer(page))->flags & BRIN_EVACUATE_PAGE);
|
||||
Assert(BrinPageFlags(page) & BRIN_EVACUATE_PAGE);
|
||||
|
||||
maxoff = PageGetMaxOffsetNumber(page);
|
||||
for (off = FirstOffsetNumber; off <= maxoff; off++)
|
||||
@ -677,11 +667,8 @@ brin_getinsertbuffer(Relation irel, Buffer oldbuf, Size itemsz,
|
||||
static Size
|
||||
br_page_get_freespace(Page page)
|
||||
{
|
||||
BrinSpecialSpace *special;
|
||||
|
||||
special = (BrinSpecialSpace *) PageGetSpecialPointer(page);
|
||||
if (!BRIN_IS_REGULAR_PAGE(page) ||
|
||||
(special->flags & BRIN_EVACUATE_PAGE) != 0)
|
||||
(BrinPageFlags(page) & BRIN_EVACUATE_PAGE) != 0)
|
||||
return 0;
|
||||
else
|
||||
return PageGetFreeSpace(page);
|
||||
|
@ -446,7 +446,7 @@ revmap_physical_extend(BrinRevmap *revmap)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INDEX_CORRUPTED),
|
||||
errmsg("unexpected page type 0x%04X in BRIN index \"%s\" block %u",
|
||||
BRIN_PAGE_TYPE(page),
|
||||
BrinPageType(page),
|
||||
RelationGetRelationName(irel),
|
||||
BufferGetBlockNumber(buf))));
|
||||
|
||||
|
Reference in New Issue
Block a user