PostgreSQL Source Code git master
Loading...
Searching...
No Matches
brin_pageops.h File Reference
Include dependency graph for brin_pageops.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

bool brin_doupdate (Relation idxrel, BlockNumber pagesPerRange, BrinRevmap *revmap, BlockNumber heapBlk, Buffer oldbuf, OffsetNumber oldoff, const BrinTuple *origtup, Size origsz, const BrinTuple *newtup, Size newsz, bool samepage)
 
bool brin_can_do_samepage_update (Buffer buffer, Size origsz, Size newsz)
 
OffsetNumber brin_doinsert (Relation idxrel, BlockNumber pagesPerRange, BrinRevmap *revmap, Buffer *buffer, BlockNumber heapBlk, const BrinTuple *tup, Size itemsz)
 
void brin_page_init (Page page, uint16 type)
 
void brin_metapage_init (Page page, BlockNumber pagesPerRange, uint16 version)
 
bool brin_start_evacuating_page (Relation idxRel, Buffer buf)
 
void brin_evacuate_page (Relation idxRel, BlockNumber pagesPerRange, BrinRevmap *revmap, Buffer buf)
 
void brin_page_cleanup (Relation idxrel, Buffer buf)
 

Function Documentation

◆ brin_can_do_samepage_update()

bool brin_can_do_samepage_update ( Buffer  buffer,
Size  origsz,
Size  newsz 
)
extern

Definition at line 322 of file brin_pageops.c.

323{
324 return
325 ((newsz <= origsz) ||
327}
static Page BufferGetPage(Buffer buffer)
Definition bufmgr.h:466
Size PageGetExactFreeSpace(const PageData *page)
Definition bufpage.c:957
static int fb(int x)

References BufferGetPage(), fb(), and PageGetExactFreeSpace().

Referenced by brin_doupdate(), brininsert(), and summarize_range().

◆ brin_doinsert()

OffsetNumber brin_doinsert ( Relation  idxrel,
BlockNumber  pagesPerRange,
BrinRevmap revmap,
Buffer buffer,
BlockNumber  heapBlk,
const BrinTuple tup,
Size  itemsz 
)
extern

Definition at line 341 of file brin_pageops.c.

344{
345 Page page;
347 OffsetNumber off;
348 Size freespace = 0;
350 ItemPointerData tid;
351 bool extended;
352
353 Assert(itemsz == MAXALIGN(itemsz));
354
355 /* If the item is oversized, don't even bother. */
356 if (itemsz > BrinMaxItemSize)
357 {
360 errmsg("index row size %zu exceeds maximum %zu for index \"%s\"",
362 return InvalidOffsetNumber; /* keep compiler quiet */
363 }
364
365 /* Make sure the revmap is long enough to contain the entry we need */
366 brinRevmapExtend(revmap, heapBlk);
367
368 /*
369 * Acquire lock on buffer supplied by caller, if any. If it doesn't have
370 * enough space, unpin it to obtain a new one below.
371 */
372 if (BufferIsValid(*buffer))
373 {
374 /*
375 * It's possible that another backend (or ourselves!) extended the
376 * revmap over the page we held a pin on, so we cannot assume that
377 * it's still a regular page.
378 */
380 if (br_page_get_freespace(BufferGetPage(*buffer)) < itemsz)
381 {
382 UnlockReleaseBuffer(*buffer);
383 *buffer = InvalidBuffer;
384 }
385 }
386
387 /*
388 * If we still don't have a usable buffer, have brin_getinsertbuffer
389 * obtain one for us.
390 */
391 if (!BufferIsValid(*buffer))
392 {
393 do
394 *buffer = brin_getinsertbuffer(idxrel, InvalidBuffer, itemsz, &extended);
395 while (!BufferIsValid(*buffer));
396 }
397 else
398 extended = false;
399
400 /* Now obtain lock on revmap buffer */
402
403 page = BufferGetPage(*buffer);
404 blk = BufferGetBlockNumber(*buffer);
405
406 /* Execute the actual insertion */
408 if (extended)
410 off = PageAddItem(page, tup, itemsz, InvalidOffsetNumber, false, false);
411 if (off == InvalidOffsetNumber)
412 elog(ERROR, "failed to add BRIN tuple to new page");
413 MarkBufferDirty(*buffer);
414
415 /* needed to update FSM below */
416 if (extended)
417 freespace = br_page_get_freespace(page);
418
419 ItemPointerSet(&tid, blk, off);
420 brinSetHeapBlockItemptr(revmapbuf, pagesPerRange, heapBlk, tid);
422
423 /* XLOG stuff */
425 {
428 uint8 info;
429
430 info = XLOG_BRIN_INSERT | (extended ? XLOG_BRIN_INIT_PAGE : 0);
431 xlrec.heapBlk = heapBlk;
432 xlrec.pagesPerRange = pagesPerRange;
433 xlrec.offnum = off;
434
437
438 XLogRegisterBuffer(0, *buffer, REGBUF_STANDARD | (extended ? REGBUF_WILL_INIT : 0));
439 XLogRegisterBufData(0, tup, itemsz);
440
442
444
445 PageSetLSN(page, recptr);
447 }
448
450
451 /* Tuple is firmly on buffer; we can release our locks */
454
455 BRIN_elog((DEBUG2, "inserted tuple (%u,%u) for range starting at %u",
456 blk, off, heapBlk));
457
458 if (extended)
459 {
462 }
463
464 return off;
465}
uint32 BlockNumber
Definition block.h:31
#define BRIN_elog(args)
#define BRIN_PAGETYPE_REGULAR
Definition brin_page.h:53
#define BrinMaxItemSize
void brin_page_init(Page page, uint16 type)
static Size br_page_get_freespace(Page page)
static Buffer brin_getinsertbuffer(Relation irel, Buffer oldbuf, Size itemsz, bool *extended)
void brinRevmapExtend(BrinRevmap *revmap, BlockNumber heapBlk)
void brinSetHeapBlockItemptr(Buffer buf, BlockNumber pagesPerRange, BlockNumber heapBlk, ItemPointerData tid)
Buffer brinLockRevmapPageForUpdate(BrinRevmap *revmap, BlockNumber heapBlk)
#define SizeOfBrinInsert
Definition brin_xlog.h:74
#define XLOG_BRIN_INIT_PAGE
Definition brin_xlog.h:43
#define XLOG_BRIN_INSERT
Definition brin_xlog.h:32
int Buffer
Definition buf.h:23
#define InvalidBuffer
Definition buf.h:25
BlockNumber BufferGetBlockNumber(Buffer buffer)
Definition bufmgr.c:4356
void UnlockReleaseBuffer(Buffer buffer)
Definition bufmgr.c:5518
void MarkBufferDirty(Buffer buffer)
Definition bufmgr.c:3056
@ BUFFER_LOCK_EXCLUSIVE
Definition bufmgr.h:220
@ BUFFER_LOCK_UNLOCK
Definition bufmgr.h:205
static void LockBuffer(Buffer buffer, BufferLockMode mode)
Definition bufmgr.h:328
static bool BufferIsValid(Buffer bufnum)
Definition bufmgr.h:417
static void PageSetLSN(Page page, XLogRecPtr lsn)
Definition bufpage.h:390
PageData * Page
Definition bufpage.h:81
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
Definition bufpage.h:471
#define MAXALIGN(LEN)
Definition c.h:826
uint8_t uint8
Definition c.h:544
#define Assert(condition)
Definition c.h:873
size_t Size
Definition c.h:619
int errcode(int sqlerrcode)
Definition elog.c:863
int errmsg(const char *fmt,...)
Definition elog.c:1080
#define DEBUG2
Definition elog.h:29
#define ERROR
Definition elog.h:39
#define elog(elevel,...)
Definition elog.h:226
#define ereport(elevel,...)
Definition elog.h:150
void FreeSpaceMapVacuumRange(Relation rel, BlockNumber start, BlockNumber end)
Definition freespace.c:377
void RecordPageWithFreeSpace(Relation rel, BlockNumber heapBlk, Size spaceAvail)
Definition freespace.c:194
static void ItemPointerSet(ItemPointerData *pointer, BlockNumber blockNumber, OffsetNumber offNum)
Definition itemptr.h:135
#define START_CRIT_SECTION()
Definition miscadmin.h:150
#define END_CRIT_SECTION()
Definition miscadmin.h:152
#define InvalidOffsetNumber
Definition off.h:26
uint16 OffsetNumber
Definition off.h:24
#define RelationGetRelationName(relation)
Definition rel.h:548
#define RelationNeedsWAL(relation)
Definition rel.h:637
BlockNumber heapBlk
Definition brin_xlog.h:65
uint64 XLogRecPtr
Definition xlogdefs.h:21
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
Definition xloginsert.c:478
void XLogRegisterBufData(uint8 block_id, const void *data, uint32 len)
Definition xloginsert.c:409
void XLogRegisterData(const void *data, uint32 len)
Definition xloginsert.c:368
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
Definition xloginsert.c:245
void XLogBeginInsert(void)
Definition xloginsert.c:152
#define REGBUF_STANDARD
Definition xloginsert.h:35
#define REGBUF_WILL_INIT
Definition xloginsert.h:34

References Assert, br_page_get_freespace(), BRIN_elog, brin_getinsertbuffer(), brin_page_init(), BRIN_PAGETYPE_REGULAR, brinLockRevmapPageForUpdate(), BrinMaxItemSize, brinRevmapExtend(), brinSetHeapBlockItemptr(), BUFFER_LOCK_EXCLUSIVE, BUFFER_LOCK_UNLOCK, BufferGetBlockNumber(), BufferGetPage(), BufferIsValid(), DEBUG2, elog, END_CRIT_SECTION, ereport, errcode(), errmsg(), ERROR, fb(), FreeSpaceMapVacuumRange(), xl_brin_insert::heapBlk, InvalidBuffer, InvalidOffsetNumber, ItemPointerSet(), LockBuffer(), MarkBufferDirty(), MAXALIGN, PageAddItem, PageSetLSN(), RecordPageWithFreeSpace(), REGBUF_STANDARD, REGBUF_WILL_INIT, RelationGetRelationName, RelationNeedsWAL, SizeOfBrinInsert, START_CRIT_SECTION, UnlockReleaseBuffer(), XLOG_BRIN_INIT_PAGE, XLOG_BRIN_INSERT, XLogBeginInsert(), XLogInsert(), XLogRegisterBufData(), XLogRegisterBuffer(), and XLogRegisterData().

Referenced by _brin_parallel_merge(), brin_fill_empty_ranges(), form_and_insert_tuple(), and summarize_range().

◆ brin_doupdate()

bool brin_doupdate ( Relation  idxrel,
BlockNumber  pagesPerRange,
BrinRevmap revmap,
BlockNumber  heapBlk,
Buffer  oldbuf,
OffsetNumber  oldoff,
const BrinTuple origtup,
Size  origsz,
const BrinTuple newtup,
Size  newsz,
bool  samepage 
)
extern

Definition at line 53 of file brin_pageops.c.

59{
63 Size oldsz;
66 bool extended;
67
69
70 /* If the item is oversized, don't bother. */
72 {
75 errmsg("index row size %zu exceeds maximum %zu for index \"%s\"",
77 return false; /* keep compiler quiet */
78 }
79
80 /* make sure the revmap is long enough to contain the entry we need */
81 brinRevmapExtend(revmap, heapBlk);
82
83 if (!samepage)
84 {
85 /* need a page on which to put the item */
88 {
89 Assert(!extended);
90 return false;
91 }
92
93 /*
94 * Note: it's possible (though unlikely) that the returned newbuf is
95 * the same as oldbuf, if brin_getinsertbuffer determined that the old
96 * buffer does in fact have enough space.
97 */
98 if (newbuf == oldbuf)
99 {
100 Assert(!extended);
102 }
103 else
105 }
106 else
107 {
110 extended = false;
111 }
114
115 /*
116 * Check that the old tuple wasn't updated concurrently: it might have
117 * moved someplace else entirely, and for that matter the whole page
118 * might've become a revmap page. Note that in the first two cases
119 * checked here, the "oldlp" we just calculated is garbage; but
120 * PageGetItemId() is simple enough that it was safe to do that
121 * calculation anyway.
122 */
126 {
128
129 /*
130 * If this happens, and the new buffer was obtained by extending the
131 * relation, then we need to ensure we don't leave it uninitialized or
132 * forget about it.
133 */
135 {
136 if (extended)
139 if (extended)
141 }
142 return false;
143 }
144
147
148 /*
149 * ... or it might have been updated in place to different contents.
150 */
152 {
155 {
156 /* As above, initialize and record new page if we got one */
157 if (extended)
160 if (extended)
162 }
163 return false;
164 }
165
166 /*
167 * Great, the old tuple is intact. We can proceed with the update.
168 *
169 * If there's enough room in the old page for the new tuple, replace it.
170 *
171 * Note that there might now be enough space on the page even though the
172 * caller told us there isn't, if a concurrent update moved another tuple
173 * elsewhere or replaced a tuple with a smaller one.
174 */
175 if (((BrinPageFlags(oldpage) & BRIN_EVACUATE_PAGE) == 0) &&
177 {
180 elog(ERROR, "failed to replace BRIN tuple");
182
183 /* XLOG stuff */
185 {
189
191
194
197
199
201 }
202
204
206
208 {
209 /* As above, initialize and record new page if we got one */
210 if (extended)
213 if (extended)
215 }
216
217 return true;
218 }
219 else if (newbuf == InvalidBuffer)
220 {
221 /*
222 * Not enough space, but caller said that there was. Tell them to
223 * start over.
224 */
226 return false;
227 }
228 else
229 {
230 /*
231 * Not enough free space on the oldpage. Put the new tuple on the new
232 * page, and update the revmap.
233 */
238 Size freespace = 0;
239
241
243
244 /*
245 * We need to initialize the page if it's newly obtained. Note we
246 * will WAL-log the initialization as part of the update, so we don't
247 * need to do that here.
248 */
249 if (extended)
251
255 elog(ERROR, "failed to add BRIN tuple to new page");
258
259 /* needed to update FSM below */
260 if (extended)
261 freespace = br_page_get_freespace(newpage);
262
264 brinSetHeapBlockItemptr(revmapbuf, pagesPerRange, heapBlk, newtid);
266
267 /* XLOG stuff */
269 {
272 uint8 info;
273
274 info = XLOG_BRIN_UPDATE | (extended ? XLOG_BRIN_INIT_PAGE : 0);
275
277 xlrec.insert.heapBlk = heapBlk;
278 xlrec.insert.pagesPerRange = pagesPerRange;
279 xlrec.oldOffnum = oldoff;
280
282
283 /* new page */
285
288
289 /* revmap page */
291
292 /* old page */
294
296
300 }
301
303
307
308 if (extended)
309 {
312 }
313
314 return true;
315 }
316}
#define InvalidBlockNumber
Definition block.h:33
#define BrinPageFlags(page)
Definition brin_page.h:46
#define BRIN_EVACUATE_PAGE
Definition brin_page.h:60
#define BRIN_IS_REGULAR_PAGE(page)
Definition brin_page.h:57
static void brin_initialize_empty_new_buffer(Relation idxrel, Buffer buffer)
bool brin_can_do_samepage_update(Buffer buffer, Size origsz, Size newsz)
bool brin_tuples_equal(const BrinTuple *a, Size alen, const BrinTuple *b, Size blen)
Definition brin_tuple.c:464
#define SizeOfBrinUpdate
Definition brin_xlog.h:95
#define XLOG_BRIN_SAMEPAGE_UPDATE
Definition brin_xlog.h:34
#define SizeOfBrinSamepageUpdate
Definition brin_xlog.h:107
#define XLOG_BRIN_UPDATE
Definition brin_xlog.h:33
bool PageIndexTupleOverwrite(Page page, OffsetNumber offnum, const void *newtup, Size newsize)
Definition bufpage.c:1404
void PageIndexTupleDeleteNoCompact(Page page, OffsetNumber offnum)
Definition bufpage.c:1294
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
Definition bufpage.h:243
static void * PageGetItem(PageData *page, const ItemIdData *itemId)
Definition bufpage.h:353
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
Definition bufpage.h:371
#define ItemIdGetLength(itemId)
Definition itemid.h:59
#define ItemIdIsNormal(itemId)
Definition itemid.h:99
OffsetNumber offnum
Definition brin_xlog.h:71
xl_brin_insert insert
Definition brin_xlog.h:92

References Assert, br_page_get_freespace(), brin_can_do_samepage_update(), BRIN_EVACUATE_PAGE, brin_getinsertbuffer(), brin_initialize_empty_new_buffer(), BRIN_IS_REGULAR_PAGE, brin_page_init(), BRIN_PAGETYPE_REGULAR, brin_tuples_equal(), brinLockRevmapPageForUpdate(), BrinMaxItemSize, BrinPageFlags, brinRevmapExtend(), brinSetHeapBlockItemptr(), BUFFER_LOCK_EXCLUSIVE, BUFFER_LOCK_UNLOCK, BufferGetBlockNumber(), BufferGetPage(), BufferIsValid(), elog, END_CRIT_SECTION, ereport, errcode(), errmsg(), ERROR, fb(), FreeSpaceMapVacuumRange(), xl_brin_update::insert, InvalidBlockNumber, InvalidBuffer, InvalidOffsetNumber, ItemIdGetLength, ItemIdIsNormal, ItemPointerSet(), LockBuffer(), MarkBufferDirty(), MAXALIGN, xl_brin_insert::offnum, xl_brin_samepage_update::offnum, PageAddItem, PageGetItem(), PageGetItemId(), PageGetMaxOffsetNumber(), PageIndexTupleDeleteNoCompact(), PageIndexTupleOverwrite(), PageSetLSN(), RecordPageWithFreeSpace(), REGBUF_STANDARD, REGBUF_WILL_INIT, RelationGetRelationName, RelationNeedsWAL, SizeOfBrinSamepageUpdate, SizeOfBrinUpdate, START_CRIT_SECTION, UnlockReleaseBuffer(), XLOG_BRIN_INIT_PAGE, XLOG_BRIN_SAMEPAGE_UPDATE, XLOG_BRIN_UPDATE, XLogBeginInsert(), XLogInsert(), XLogRegisterBufData(), XLogRegisterBuffer(), and XLogRegisterData().

Referenced by brin_evacuate_page(), brininsert(), and summarize_range().

◆ brin_evacuate_page()

void brin_evacuate_page ( Relation  idxRel,
BlockNumber  pagesPerRange,
BrinRevmap revmap,
Buffer  buf 
)
extern

Definition at line 562 of file brin_pageops.c.

564{
565 OffsetNumber off;
566 OffsetNumber maxoff;
567 Page page;
569 Size btupsz = 0;
570
571 page = BufferGetPage(buf);
572
574
575 maxoff = PageGetMaxOffsetNumber(page);
576 for (off = FirstOffsetNumber; off <= maxoff; off++)
577 {
578 BrinTuple *tup;
579 Size sz;
580 ItemId lp;
581
583
584 lp = PageGetItemId(page, off);
585 if (ItemIdIsUsed(lp))
586 {
588 tup = (BrinTuple *) PageGetItem(page, lp);
590
592
593 if (!brin_doupdate(idxRel, pagesPerRange, revmap, tup->bt_blkno,
594 buf, off, tup, sz, tup, sz, false))
595 off--; /* retry */
596
598
599 /* It's possible that someone extended the revmap over this page */
600 if (!BRIN_IS_REGULAR_PAGE(page))
601 break;
602 }
603 }
604
606}
bool brin_doupdate(Relation idxrel, BlockNumber pagesPerRange, BrinRevmap *revmap, BlockNumber heapBlk, Buffer oldbuf, OffsetNumber oldoff, const BrinTuple *origtup, Size origsz, const BrinTuple *newtup, Size newsz, bool samepage)
BrinTuple * brin_copy_tuple(BrinTuple *tuple, Size len, BrinTuple *dest, Size *destsz)
Definition brin_tuple.c:445
@ BUFFER_LOCK_SHARE
Definition bufmgr.h:210
#define ItemIdIsUsed(itemId)
Definition itemid.h:92
#define CHECK_FOR_INTERRUPTS()
Definition miscadmin.h:123
#define FirstOffsetNumber
Definition off.h:27
static char buf[DEFAULT_XLOG_SEG_SIZE]

References Assert, brin_copy_tuple(), brin_doupdate(), BRIN_EVACUATE_PAGE, BRIN_IS_REGULAR_PAGE, BrinPageFlags, buf, BUFFER_LOCK_SHARE, BUFFER_LOCK_UNLOCK, BufferGetPage(), CHECK_FOR_INTERRUPTS, fb(), FirstOffsetNumber, ItemIdGetLength, ItemIdIsUsed, LockBuffer(), PageGetItem(), PageGetItemId(), PageGetMaxOffsetNumber(), and UnlockReleaseBuffer().

Referenced by revmap_physical_extend().

◆ brin_metapage_init()

void brin_metapage_init ( Page  page,
BlockNumber  pagesPerRange,
uint16  version 
)
extern

Definition at line 484 of file brin_pageops.c.

485{
486 BrinMetaPageData *metadata;
487
489
490 metadata = (BrinMetaPageData *) PageGetContents(page);
491
492 metadata->brinMagic = BRIN_META_MAGIC;
493 metadata->brinVersion = version;
494 metadata->pagesPerRange = pagesPerRange;
495
496 /*
497 * Note we cheat here a little. 0 is not a valid revmap block number
498 * (because it's the metapage buffer), but doing this enables the first
499 * revmap page to be created when the index is.
500 */
501 metadata->lastRevmapPage = 0;
502
503 /*
504 * Set pd_lower just past the end of the metadata. This is essential,
505 * because without doing so, metadata will be lost if xlog.c compresses
506 * the page.
507 */
508 ((PageHeader) page)->pd_lower =
509 ((char *) metadata + sizeof(BrinMetaPageData)) - (char *) page;
510}
#define BRIN_META_MAGIC
Definition brin_page.h:73
#define BRIN_PAGETYPE_META
Definition brin_page.h:51
PageHeaderData * PageHeader
Definition bufpage.h:173
static char * PageGetContents(Page page)
Definition bufpage.h:257
uint32 brinVersion
Definition brin_page.h:67
BlockNumber lastRevmapPage
Definition brin_page.h:69
BlockNumber pagesPerRange
Definition brin_page.h:68

References BRIN_META_MAGIC, brin_page_init(), BRIN_PAGETYPE_META, BrinMetaPageData::brinMagic, BrinMetaPageData::brinVersion, BrinMetaPageData::lastRevmapPage, PageGetContents(), and BrinMetaPageData::pagesPerRange.

Referenced by brin_xlog_createidx(), brinbuild(), and brinbuildempty().

◆ brin_page_cleanup()

void brin_page_cleanup ( Relation  idxrel,
Buffer  buf 
)
extern

Definition at line 622 of file brin_pageops.c.

623{
624 Page page = BufferGetPage(buf);
625
626 /*
627 * If a page was left uninitialized, initialize it now; also record it in
628 * FSM.
629 *
630 * Somebody else might be extending the relation concurrently. To avoid
631 * re-initializing the page before they can grab the buffer lock, we
632 * acquire the extension lock momentarily. Since they hold the extension
633 * lock from before getting the page and after its been initialized, we're
634 * sure to see their initialization.
635 */
636 if (PageIsNew(page))
637 {
640
642 if (PageIsNew(page))
643 {
646 return;
647 }
649 }
650
651 /* Nothing to be done for non-regular index pages */
654 return;
655
656 /* Measure free space and record it */
659}
#define BRIN_IS_META_PAGE(page)
Definition brin_page.h:55
#define BRIN_IS_REVMAP_PAGE(page)
Definition brin_page.h:56
static bool PageIsNew(const PageData *page)
Definition bufpage.h:233
void LockRelationForExtension(Relation relation, LOCKMODE lockmode)
Definition lmgr.c:424
void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode)
Definition lmgr.c:474
#define ShareLock
Definition lockdefs.h:40

References br_page_get_freespace(), brin_initialize_empty_new_buffer(), BRIN_IS_META_PAGE, BRIN_IS_REVMAP_PAGE, buf, BUFFER_LOCK_EXCLUSIVE, BUFFER_LOCK_UNLOCK, BufferGetBlockNumber(), BufferGetPage(), fb(), LockBuffer(), LockRelationForExtension(), PageIsNew(), RecordPageWithFreeSpace(), ShareLock, and UnlockRelationForExtension().

Referenced by brin_vacuum_scan().

◆ brin_page_init()

void brin_page_init ( Page  page,
uint16  type 
)
extern

Definition at line 473 of file brin_pageops.c.

474{
475 PageInit(page, BLCKSZ, sizeof(BrinSpecialSpace));
476
477 BrinPageType(page) = type;
478}
#define BrinPageType(page)
Definition brin_page.h:42
void PageInit(Page page, Size pageSize, Size specialSize)
Definition bufpage.c:42
const char * type

References BrinPageType, fb(), PageInit(), and type.

Referenced by brin_doinsert(), brin_doupdate(), brin_initialize_empty_new_buffer(), brin_metapage_init(), brin_xlog_insert_update(), brin_xlog_revmap_extend(), and revmap_physical_extend().

◆ brin_start_evacuating_page()

bool brin_start_evacuating_page ( Relation  idxRel,
Buffer  buf 
)
extern

Definition at line 522 of file brin_pageops.c.

523{
524 OffsetNumber off;
525 OffsetNumber maxoff;
526 Page page;
527
528 page = BufferGetPage(buf);
529
530 if (PageIsNew(page))
531 return false;
532
533 maxoff = PageGetMaxOffsetNumber(page);
534 for (off = FirstOffsetNumber; off <= maxoff; off++)
535 {
536 ItemId lp;
537
538 lp = PageGetItemId(page, off);
539 if (ItemIdIsUsed(lp))
540 {
541 /*
542 * Prevent other backends from adding more stuff to this page:
543 * BRIN_EVACUATE_PAGE informs br_page_get_freespace that this page
544 * can no longer be used to add new tuples. Note that this flag
545 * is not WAL-logged, except accidentally.
546 */
549
550 return true;
551 }
552 }
553 return false;
554}
void MarkBufferDirtyHint(Buffer buffer, bool buffer_std)
Definition bufmgr.c:5565

References BRIN_EVACUATE_PAGE, BrinPageFlags, buf, BufferGetPage(), fb(), FirstOffsetNumber, ItemIdIsUsed, MarkBufferDirtyHint(), PageGetItemId(), PageGetMaxOffsetNumber(), and PageIsNew().

Referenced by revmap_physical_extend().