43#ifdef USE_ASSERT_CHECKING
44#include "catalog/pg_tablespace_d.h"
72#define BufHdrGetBlock(bufHdr) ((Block) (BufferBlocks + ((Size) (bufHdr)->buf_id) * BLCKSZ))
73#define BufferGetLSN(bufHdr) (PageGetLSN(BufHdrGetBlock(bufHdr)))
76#define LocalBufHdrGetBlock(bufHdr) \
77 LocalBufferBlockPointers[-((bufHdr)->buf_id + 2)]
80#define BUF_WRITTEN 0x01
81#define BUF_REUSABLE 0x02
83#define RELS_BSEARCH_THRESHOLD 20
91#define BUF_DROP_FULL_SCAN_THRESHOLD (uint64) (NBuffers / 32)
100#define REFCOUNT_ARRAY_ENTRIES 8
246 .
name =
"buffer pin",
483#define BufferIsPinned(bufnum) \
485 !BufferIsValid(bufnum) ? \
488 BufferIsLocal(bufnum) ? \
489 (LocalRefCount[-(bufnum) - 1] > 0) \
491 (GetPrivateRefCount(bufnum) > 0) \
547#ifdef USE_ASSERT_CHECKING
549 void *unused_context);
661 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
662 errmsg(
"cannot access temporary tables of other sessions")));
688 bool have_private_ref;
698 int b = -recent_buffer - 1;
723 if (have_private_ref)
735 if (have_private_ref)
746 if (!have_private_ref)
817 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
818 errmsg(
"cannot access temporary tables of other sessions")));
825 forkNum, blockNum,
mode, strategy);
849 permanent ? RELPERSISTENCE_PERMANENT : RELPERSISTENCE_UNLOGGED,
902 if (bmr.
smgr == NULL)
910 buffers, extended_by);
938 if (bmr.
smgr == NULL)
994 num_pages, extend_to,
995 buffers, &extended_by);
1000 for (
uint32 i = 0;
i < extended_by;
i++)
1002 if (first_block +
i != extend_to - 1)
1017 Assert(extended_by == 0);
1019 fork, extend_to - 1,
mode, strategy);
1045 need_to_zero =
false;
1047 else if (isLocalBuf)
1091 else if (!isLocalBuf)
1125 Assert((persistence == RELPERSISTENCE_TEMP ||
1126 persistence == RELPERSISTENCE_PERMANENT ||
1127 persistence == RELPERSISTENCE_UNLOGGED));
1129 if (persistence == RELPERSISTENCE_TEMP)
1140 TRACE_POSTGRESQL_BUFFER_READ_START(forkNum, blockNum,
1146 if (persistence == RELPERSISTENCE_TEMP)
1154 bufHdr =
BufferAlloc(smgr, persistence, forkNum, blockNum,
1155 strategy, foundPtr, io_context);
1176 TRACE_POSTGRESQL_BUFFER_READ_DONE(forkNum, blockNum,
1224 persistence = rel->
rd_rel->relpersistence;
1226 persistence = smgr_persistence;
1234 forkNum, blockNum, strategy, &found);
1247 operation.
smgr = smgr;
1248 operation.
rel = rel;
1267 bool allow_forwarding)
1269 int actual_nblocks = *nblocks;
1273 Assert(*nblocks == 1 || allow_forwarding);
1277 for (
int i = 0;
i < actual_nblocks; ++
i)
1340#ifdef USE_ASSERT_CHECKING
1374 if (
i == 0 && actual_nblocks > 1)
1379 if (
unlikely(maxcombine < actual_nblocks))
1381 elog(
DEBUG2,
"limiting nblocks at %u from %u to %u",
1382 blockNum, actual_nblocks, maxcombine);
1383 actual_nblocks = maxcombine;
1388 *nblocks = actual_nblocks;
1393 operation->
flags = flags;
1394 operation->
nblocks = actual_nblocks;
1430 operation->
nblocks = *nblocks;
1457 did_start_io =
true;
1462 return did_start_io;
1529#ifdef USE_ASSERT_CHECKING
1543 if (i < operation->nblocks_done)
1597 int newly_read_blocks = 0;
1623 Assert(newly_read_blocks > 0);
1638 if (operation->
persistence == RELPERSISTENCE_TEMP)
1661 elog(
ERROR,
"waiting for read operation that didn't read");
1672 int ignored_nblocks_progress;
1767 int flags = operation->
flags;
1773 int io_buffers_len = 0;
1789 if (persistence == RELPERSISTENCE_TEMP)
1872 *nblocks_progress = 1;
1876 did_start_io =
false;
1883 TRACE_POSTGRESQL_BUFFER_READ_DONE(forknum, blocknum + operation->
nblocks_done,
1890 if (persistence == RELPERSISTENCE_TEMP)
1908 Assert(io_buffers[0] == buffers[nblocks_done]);
1918 for (
int i = nblocks_done + 1;
i < operation->
nblocks;
i++)
1925 Assert(io_buffers[io_buffers_len] == buffers[
i]);
1937 persistence == RELPERSISTENCE_TEMP ?
1955 blocknum + nblocks_done,
1956 io_pages, io_buffers_len);
1958 io_start, 1, io_buffers_len * BLCKSZ);
1960 if (persistence == RELPERSISTENCE_TEMP)
1973 *nblocks_progress = io_buffers_len;
1974 did_start_io =
true;
1977 return did_start_io;
2007 LWLock *newPartitionLock;
2008 int existing_buf_id;
2027 if (existing_buf_id >= 0)
2080 if (existing_buf_id >= 0)
2101 valid =
PinBuffer(existing_buf_hdr, strategy);
2118 return existing_buf_hdr;
2124 victim_buf_state =
LockBufHdr(victim_buf_hdr);
2130 victim_buf_hdr->
tag = newTag;
2139 if (relpersistence == RELPERSISTENCE_PERMANENT || forkNum ==
INIT_FORKNUM)
2151 return victim_buf_hdr;
2175 LWLock *oldPartitionLock;
2229 elog(
ERROR,
"buffer is pinned in InvalidateBuffer");
2413 if (strategy != NULL)
2474#ifdef USE_ASSERT_CHECKING
2507 uint32 estimated_pins_held;
2535 if (*additional_pins <= 1)
2539 limit =
Max(limit, 1);
2540 if (limit < *additional_pins)
2541 *additional_pins = limit;
2560 TRACE_POSTGRESQL_BUFFER_EXTEND_START(fork,
2569 extend_by, extend_upto,
2570 buffers, &extend_by);
2573 extend_by, extend_upto,
2574 buffers, &extend_by);
2575 *extended_by = extend_by;
2577 TRACE_POSTGRESQL_BUFFER_EXTEND_DONE(fork,
2626 MemSet(buf_block, 0, BLCKSZ);
2659 uint32 orig_extend_by = extend_by;
2661 if (first_block > extend_upto)
2663 else if ((
uint64) first_block + extend_by > extend_upto)
2664 extend_by = extend_upto - first_block;
2666 for (
uint32 i = extend_by;
i < orig_extend_by;
i++)
2677 *extended_by = extend_by;
2685 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
2686 errmsg(
"cannot extend relation %s beyond %u blocks",
2698 Buffer victim_buf = buffers[
i];
2729 if (existing_id >= 0)
2739 valid =
PinBuffer(existing_hdr, strategy);
2749 (
errmsg(
"unexpected data beyond EOF in block %u of relation \"%s\"",
2767 buf_state &= ~BM_VALID;
2781 victim_buf_hdr->
tag = tag;
2821 io_start, 1, extend_by * BLCKSZ);
2835 if (first_block +
i + 1 == extend_upto)
2847 *extended_by = extend_by;
2948 buf_state = old_buf_state;
3065 buf_state = old_buf_state;
3070 if (strategy == NULL)
3089 result = (buf_state &
BM_VALID) != 0;
3216 int wait_backend_pgprocno =
buf->wait_backend_pgprocno;
3218 buf_state &= ~BM_PIN_COUNT_WAITER;
3283 buf_state = old_buf_state;
3300#define ST_SORT sort_checkpoint_bufferids
3301#define ST_ELEMENT_TYPE CkptSortItem
3302#define ST_COMPARE(a, b) ckpt_buforder_comparator(a, b)
3303#define ST_SCOPE static
3359 for (buf_id = 0; buf_id <
NBuffers; buf_id++)
3369 if ((buf_state & mask) == mask)
3390 if (num_to_scan == 0)
3395 TRACE_POSTGRESQL_BUFFER_SYNC_START(
NBuffers, num_to_scan);
3413 for (
i = 0;
i < num_to_scan;
i++)
3424 if (last_tsid ==
InvalidOid || last_tsid != cur_tsid)
3436 if (per_ts_stat == NULL)
3441 s = &per_ts_stat[num_spaces - 1];
3442 memset(s, 0,
sizeof(*s));
3457 last_tsid = cur_tsid;
3461 s = &per_ts_stat[num_spaces - 1];
3482 for (
i = 0;
i < num_spaces;
i++)
3530 TRACE_POSTGRESQL_BUFFER_SYNC_WRITTEN(buf_id);
3579 TRACE_POSTGRESQL_BUFFER_SYNC_DONE(
NBuffers, num_written, num_to_scan);
3597 int strategy_buf_id;
3605 static bool saved_info_valid =
false;
3606 static int prev_strategy_buf_id;
3607 static uint32 prev_strategy_passes;
3608 static int next_to_clean;
3609 static uint32 next_passes;
3612 static float smoothed_alloc = 0;
3613 static float smoothed_density = 10.0;
3616 float smoothing_samples = 16;
3617 float scan_whole_pool_milliseconds = 120000.0;
3620 long strategy_delta;
3623 float scans_per_alloc;
3624 int reusable_buffers_est;
3625 int upcoming_alloc_est;
3626 int min_scan_buffers;
3631 int reusable_buffers;
3634 long new_strategy_delta;
3653 saved_info_valid =
false;
3665 if (saved_info_valid)
3667 int32 passes_delta = strategy_passes - prev_strategy_passes;
3669 strategy_delta = strategy_buf_id - prev_strategy_buf_id;
3670 strategy_delta += (long) passes_delta *
NBuffers;
3672 Assert(strategy_delta >= 0);
3674 if ((
int32) (next_passes - strategy_passes) > 0)
3677 bufs_to_lap = strategy_buf_id - next_to_clean;
3679 elog(
DEBUG2,
"bgwriter ahead: bgw %u-%u strategy %u-%u delta=%ld lap=%d",
3680 next_passes, next_to_clean,
3681 strategy_passes, strategy_buf_id,
3682 strategy_delta, bufs_to_lap);
3685 else if (next_passes == strategy_passes &&
3686 next_to_clean >= strategy_buf_id)
3689 bufs_to_lap =
NBuffers - (next_to_clean - strategy_buf_id);
3691 elog(
DEBUG2,
"bgwriter ahead: bgw %u-%u strategy %u-%u delta=%ld lap=%d",
3692 next_passes, next_to_clean,
3693 strategy_passes, strategy_buf_id,
3694 strategy_delta, bufs_to_lap);
3704 elog(
DEBUG2,
"bgwriter behind: bgw %u-%u strategy %u-%u delta=%ld",
3705 next_passes, next_to_clean,
3706 strategy_passes, strategy_buf_id,
3709 next_to_clean = strategy_buf_id;
3710 next_passes = strategy_passes;
3721 elog(
DEBUG2,
"bgwriter initializing: strategy %u-%u",
3722 strategy_passes, strategy_buf_id);
3725 next_to_clean = strategy_buf_id;
3726 next_passes = strategy_passes;
3731 prev_strategy_buf_id = strategy_buf_id;
3732 prev_strategy_passes = strategy_passes;
3733 saved_info_valid =
true;
3741 if (strategy_delta > 0 && recent_alloc > 0)
3743 scans_per_alloc = (float) strategy_delta / (
float) recent_alloc;
3744 smoothed_density += (scans_per_alloc - smoothed_density) /
3753 bufs_ahead =
NBuffers - bufs_to_lap;
3754 reusable_buffers_est = (float) bufs_ahead / smoothed_density;
3761 if (smoothed_alloc <= (
float) recent_alloc)
3762 smoothed_alloc = recent_alloc;
3764 smoothed_alloc += ((float) recent_alloc - smoothed_alloc) /
3778 if (upcoming_alloc_est == 0)
3793 if (upcoming_alloc_est < (min_scan_buffers + reusable_buffers_est))
3796 elog(
DEBUG2,
"bgwriter: alloc_est=%d too small, using min=%d + reusable_est=%d",
3797 upcoming_alloc_est, min_scan_buffers, reusable_buffers_est);
3799 upcoming_alloc_est = min_scan_buffers + reusable_buffers_est;
3809 num_to_scan = bufs_to_lap;
3811 reusable_buffers = reusable_buffers_est;
3814 while (num_to_scan > 0 && reusable_buffers < upcoming_alloc_est)
3842 elog(
DEBUG1,
"bgwriter: recent_alloc=%u smoothed=%.2f delta=%ld ahead=%d density=%.2f reusable_est=%d upcoming_est=%d scanned=%d wrote=%d reusable=%d",
3843 recent_alloc, smoothed_alloc, strategy_delta, bufs_ahead,
3844 smoothed_density, reusable_buffers_est, upcoming_alloc_est,
3845 bufs_to_lap - num_to_scan,
3847 reusable_buffers - reusable_buffers_est);
3858 new_strategy_delta = bufs_to_lap - num_to_scan;
3859 new_recent_alloc = reusable_buffers - reusable_buffers_est;
3860 if (new_strategy_delta > 0 && new_recent_alloc > 0)
3862 scans_per_alloc = (float) new_strategy_delta / (
float) new_recent_alloc;
3863 smoothed_density += (scans_per_alloc - smoothed_density) /
3867 elog(
DEBUG2,
"bgwriter: cleaner density alloc=%u scan=%ld density=%.2f new smoothed=%.2f",
3868 new_recent_alloc, new_strategy_delta,
3869 scans_per_alloc, smoothed_density);
3874 return (bufs_to_lap == 0 && recent_alloc == 0);
3919 else if (skip_recently_used)
4036#ifdef USE_ASSERT_CHECKING
4037 int RefCountErrors = 0;
4072 Assert(RefCountErrors == 0);
4076#ifdef USE_ASSERT_CHECKING
4095AssertBufferLocksPermitCatalogRead(
void)
4102 void *unused_context)
4116 ((
char *) lock - offsetof(
BufferDesc, content_lock));
4166 result =
psprintf(
"[%03d] (rel=%s, blockNum=%u, flags=0x%x, refcount=%u %d)",
4301 buf_state &= ~BM_JUST_DIRTIED;
4400 if (RELKIND_HAS_TABLE_AM(relation->
rd_rel->relkind))
4412 return (szbytes + (BLCKSZ - 1)) / BLCKSZ;
4414 else if (RELKIND_HAS_STORAGE(relation->
rd_rel->relkind))
4514 uint64 nBlocksToInvalidate = 0;
4550 for (
i = 0;
i < nforks;
i++)
4562 nBlocksToInvalidate += (nForkBlock[
i] - firstDelBlock[
i]);
4572 for (
j = 0;
j < nforks;
j++)
4574 nForkBlock[
j], firstDelBlock[
j]);
4604 for (
j = 0;
j < nforks;
j++)
4634 uint64 nBlocksToInvalidate = 0;
4645 for (
i = 0;
i < nlocators;
i++)
4653 rels[n++] = smgr_reln[
i];
4677 for (
i = 0;
i < n && cached;
i++)
4694 nBlocksToInvalidate += block[
i][
j];
4704 for (
i = 0;
i < n;
i++)
4725 for (
i = 0;
i < n;
i++)
4726 locators[
i] = rels[
i]->smgr_rlocator.locator;
4755 for (
j = 0;
j < n;
j++)
4759 rlocator = &locators[
j];
4769 rlocator = bsearch(&locator,
4775 if (rlocator == NULL)
4805 for (curBlock = firstDelBlock; curBlock < nForkBlock; curBlock++)
4809 LWLock *bufPartitionLock;
4929 errcallback.
arg = bufHdr;
5010 for (
i = 0;
i < nrels;
i++)
5015 srels[
i].
srel = smgrs[
i];
5043 for (
j = 0;
j < nrels;
j++)
5047 srelent = &srels[
j];
5057 srelent = bsearch(&rlocator,
5063 if (srelent == NULL)
5135 memset(
buf.data, 0, BLCKSZ);
5156 permanent ? RELPERSISTENCE_PERMANENT : RELPERSISTENCE_UNLOGGED,
5163 for (blkno = 0; blkno < nblocks; blkno++)
5181 memcpy(dstPage, srcPage, BLCKSZ);
5215 char relpersistence;
5220 relpersistence = permanent ?
5221 RELPERSISTENCE_PERMANENT : RELPERSISTENCE_UNLOGGED;
5437 bool dirtied =
false;
5438 bool delayChkptFlags =
false;
5490 delayChkptFlags =
true;
5522 if (delayChkptFlags)
5560 buf_state &= ~BM_PIN_COUNT_WAITER;
5624 elog(
ERROR,
"incorrect local pin count: %d",
5630 elog(
ERROR,
"incorrect local pin count: %d",
5657 bool logged_recovery_conflict =
false;
5696 if (logged_recovery_conflict)
5714 elog(
ERROR,
"multiple backends attempting to wait for pincount 1");
5740 if (waitStart != 0 && !logged_recovery_conflict)
5748 waitStart,
now, NULL,
true);
5749 logged_recovery_conflict =
true;
5781 buf_state &= ~BM_PIN_COUNT_WAITER;
6068 bool forget_owner,
bool release_aio)
6075 buf_state &= ~BM_IO_IN_PROGRESS;
6078 buf_state &= ~BM_IO_ERROR;
6091 buf_state |= set_flag_bits;
6150 errmsg(
"could not write block %u of %s",
6154 errdetail(
"Multiple failures --- write error might be permanent.")));
6171 errcontext(
"writing block %u of relation \"%s\"",
6186 errcontext(
"writing block %u of relation \"%s\"",
6315 if (
a->tsId <
b->tsId)
6317 else if (
a->tsId >
b->tsId)
6320 if (
a->relNumber <
b->relNumber)
6322 else if (
a->relNumber >
b->relNumber)
6325 else if (
a->forkNum <
b->forkNum)
6327 else if (
a->forkNum >
b->forkNum)
6330 else if (
a->blockNum <
b->blockNum)
6332 else if (
a->blockNum >
b->blockNum)
6401 pending->
tag = *tag;
6413#define ST_SORT sort_pending_writebacks
6414#define ST_ELEMENT_TYPE PendingWriteback
6415#define ST_COMPARE(a, b) buffertag_comparator(&a->tag, &b->tag)
6416#define ST_SCOPE static
6468 for (ahead = 0;
i + ahead + 1 < wb_context->
nr_pending; ahead++)
6480 if (
cur->tag.blockNum ==
next->tag.blockNum)
6484 if (
cur->tag.blockNum + 1 !=
next->tag.blockNum)
6557 *buffer_flushed =
false;
6582 *buffer_flushed =
true;
6646 int32 *buffers_skipped)
6648 *buffers_evicted = 0;
6649 *buffers_skipped = 0;
6650 *buffers_flushed = 0;
6656 bool buffer_flushed;
6668 (*buffers_evicted)++;
6670 (*buffers_skipped)++;
6673 (*buffers_flushed)++;
6694 int32 *buffers_flushed,
int32 *buffers_skipped)
6698 *buffers_skipped = 0;
6699 *buffers_evicted = 0;
6700 *buffers_flushed = 0;
6706 bool buffer_flushed;
6728 (*buffers_evicted)++;
6730 (*buffers_skipped)++;
6733 (*buffers_flushed)++;
6755 uint8 handle_data_len;
6764 for (
int i = 0;
i < handle_data_len;
i++)
6780 first = buf_hdr->
tag;
6834 if (is_write && !is_temp)
6864 uint8 *zeroed_or_error_count,
6865 uint8 *checkfail_count,
6871#define READV_COUNT_BITS 7
6872#define READV_COUNT_MASK ((1 << READV_COUNT_BITS) - 1)
6874 *zeroed_any = rem_error & 1;
6877 *ignored_any = rem_error & 1;
6909 uint8 checkfail_count,
6910 uint8 first_error_off,
6911 uint8 first_zeroed_off,
6912 uint8 first_ignored_off)
6916 uint8 zeroed_or_error_count =
6917 error_count > 0 ? error_count : zeroed_count;
6921 "PG_IOV_MAX is bigger than reserved space for error data");
6923 "PGAIO_RESULT_ERROR_BITS is insufficient for buffer_readv");
6930 if (error_count > 0)
6931 first_off = first_error_off;
6932 else if (zeroed_count > 0)
6933 first_off = first_zeroed_off;
6935 first_off = first_ignored_off;
6937 Assert(!zeroed_any || error_count == 0);
6959 if (error_count > 0)
6968#ifdef USE_ASSERT_CHECKING
6972 uint8 zeroed_or_error_count_2,
6977 &zeroed_any_2, &ignored_any_2,
6978 &zeroed_or_error_count_2,
6981 Assert(zeroed_any == zeroed_any_2);
6982 Assert(ignored_any == ignored_any_2);
6983 Assert(zeroed_or_error_count == zeroed_or_error_count_2);
6984 Assert(checkfail_count == checkfail_count_2);
6985 Assert(first_off == first_off_2);
6989#undef READV_COUNT_BITS
6990#undef READV_COUNT_MASK
6999 uint8 flags,
bool failed,
bool is_temp,
7000 bool *buffer_invalid,
7001 bool *failed_checksum,
7002 bool *ignored_checksum,
7003 bool *zeroed_buffer)
7014#ifdef USE_ASSERT_CHECKING
7027 *buffer_invalid =
false;
7028 *failed_checksum =
false;
7029 *ignored_checksum =
false;
7030 *zeroed_buffer =
false;
7064 memset(bufdata, 0, BLCKSZ);
7065 *zeroed_buffer =
true;
7069 *buffer_invalid =
true;
7074 else if (*failed_checksum)
7075 *ignored_checksum =
true;
7097 if (*buffer_invalid || *failed_checksum || *zeroed_buffer)
7105 *zeroed_buffer ? 1 : 0,
7106 *failed_checksum ? 1 : 0,
7107 buf_off, buf_off, buf_off);
7126 TRACE_POSTGRESQL_BUFFER_READ_DONE(tag.
forkNum,
7143 uint8 cb_data,
bool is_temp)
7147 uint8 first_error_off = 0;
7148 uint8 first_zeroed_off = 0;
7149 uint8 first_ignored_off = 0;
7150 uint8 error_count = 0;
7151 uint8 zeroed_count = 0;
7152 uint8 ignored_count = 0;
7153 uint8 checkfail_count = 0;
7155 uint8 handle_data_len;
7170 for (
uint8 buf_off = 0; buf_off < handle_data_len; buf_off++)
7174 bool failed_verification =
false;
7175 bool failed_checksum =
false;
7176 bool zeroed_buffer =
false;
7177 bool ignored_checksum =
false;
7188 || prior_result.
result <= buf_off;
7191 &failed_verification,
7201 if (failed_verification && !zeroed_buffer && error_count++ == 0)
7202 first_error_off = buf_off;
7203 if (zeroed_buffer && zeroed_count++ == 0)
7204 first_zeroed_off = buf_off;
7205 if (ignored_checksum && ignored_count++ == 0)
7206 first_ignored_off = buf_off;
7207 if (failed_checksum)
7216 (error_count > 0 || ignored_count > 0 || zeroed_count > 0))
7219 zeroed_count > 0, ignored_count > 0,
7220 error_count, zeroed_count, checkfail_count,
7221 first_error_off, first_zeroed_off,
7230 if (is_temp && checkfail_count > 0)
7257 uint8 zeroed_or_error_count,
7260 uint8 affected_count;
7261 const char *msg_one,
7267 &zeroed_or_error_count,
7276 if (zeroed_any && ignored_any)
7278 Assert(zeroed_any && ignored_any);
7281 affected_count = zeroed_or_error_count;
7285 errmsg(
"zeroing %u page(s) and ignoring %u checksum failure(s) among blocks %u..%u of relation \"%s\"",
7286 affected_count, checkfail_count, first, last, rpath.
str),
7287 affected_count > 1 ?
7288 errdetail(
"Block %u held the first zeroed page.",
7289 first + first_off) : 0,
7290 errhint_plural(
"See server log for details about the other %d invalid block.",
7291 "See server log for details about the other %d invalid blocks.",
7292 affected_count + checkfail_count - 1,
7293 affected_count + checkfail_count - 1));
7305 affected_count = zeroed_or_error_count;
7306 msg_one =
_(
"invalid page in block %u of relation \"%s\"");
7307 msg_mult =
_(
"%u invalid pages among blocks %u..%u of relation \"%s\"");
7308 det_mult =
_(
"Block %u held the first invalid page.");
7309 hint_mult =
_(
"See server log for the other %u invalid block(s).");
7311 else if (zeroed_any && !ignored_any)
7313 affected_count = zeroed_or_error_count;
7314 msg_one =
_(
"invalid page in block %u of relation \"%s\"; zeroing out page");
7315 msg_mult =
_(
"zeroing out %u invalid pages among blocks %u..%u of relation \"%s\"");
7316 det_mult =
_(
"Block %u held the first zeroed page.");
7317 hint_mult =
_(
"See server log for the other %u zeroed block(s).");
7319 else if (!zeroed_any && ignored_any)
7321 affected_count = checkfail_count;
7322 msg_one =
_(
"ignoring checksum failure in block %u of relation \"%s\"");
7323 msg_mult =
_(
"ignoring %u checksum failures among blocks %u..%u of relation \"%s\"");
7324 det_mult =
_(
"Block %u held the first ignored page.");
7325 hint_mult =
_(
"See server log for the other %u ignored block(s).");
7332 affected_count == 1 ?
7365 uint8 zeroed_or_error_count,
7370 return prior_result;
7375 &zeroed_or_error_count,
7379 if (checkfail_count)
7387 return prior_result;
bool pgaio_wref_valid(PgAioWaitRef *iow)
PgAioHandle * pgaio_io_acquire(struct ResourceOwnerData *resowner, PgAioReturn *ret)
void pgaio_wref_clear(PgAioWaitRef *iow)
void pgaio_io_get_wref(PgAioHandle *ioh, PgAioWaitRef *iow)
void pgaio_io_set_flag(PgAioHandle *ioh, PgAioHandleFlags flag)
bool pgaio_have_staged(void)
bool pgaio_wref_check_done(PgAioWaitRef *iow)
ProcNumber pgaio_io_get_owner(PgAioHandle *ioh)
void pgaio_submit_staged(void)
void pgaio_wref_wait(PgAioWaitRef *iow)
void pgaio_io_release(PgAioHandle *ioh)
PgAioHandle * pgaio_io_acquire_nb(struct ResourceOwnerData *resowner, PgAioReturn *ret)
@ PGAIO_HCB_LOCAL_BUFFER_READV
@ PGAIO_HCB_SHARED_BUFFER_READV
@ PGAIO_HF_REFERENCES_LOCAL
void pgaio_io_set_handle_data_32(PgAioHandle *ioh, uint32 *data, uint8 len)
void pgaio_io_register_callbacks(PgAioHandle *ioh, PgAioHandleCallbackID cb_id, uint8 cb_data)
uint64 * pgaio_io_get_handle_data(PgAioHandle *ioh, uint8 *len)
void pgaio_result_report(PgAioResult result, const PgAioTargetData *target_data, int elevel)
PgAioTargetData * pgaio_io_get_target_data(PgAioHandle *ioh)
#define PGAIO_RESULT_ERROR_BITS
static bool pg_atomic_compare_exchange_u32(volatile pg_atomic_uint32 *ptr, uint32 *expected, uint32 newval)
static uint32 pg_atomic_fetch_or_u32(volatile pg_atomic_uint32 *ptr, uint32 or_)
static void pg_atomic_unlocked_write_u32(volatile pg_atomic_uint32 *ptr, uint32 val)
static uint32 pg_atomic_read_u32(volatile pg_atomic_uint32 *ptr)
bool TimestampDifferenceExceeds(TimestampTz start_time, TimestampTz stop_time, int msec)
TimestampTz GetCurrentTimestamp(void)
Datum now(PG_FUNCTION_ARGS)
void binaryheap_build(binaryheap *heap)
void binaryheap_replace_first(binaryheap *heap, bh_node_type d)
bh_node_type binaryheap_first(binaryheap *heap)
bh_node_type binaryheap_remove_first(binaryheap *heap)
void binaryheap_free(binaryheap *heap)
void binaryheap_add_unordered(binaryheap *heap, bh_node_type d)
binaryheap * binaryheap_allocate(int capacity, binaryheap_comparator compare, void *arg)
#define binaryheap_empty(h)
#define InvalidBlockNumber
static bool BlockNumberIsValid(BlockNumber blockNumber)
#define BufferIsLocal(buffer)
CkptSortItem * CkptBufferIds
WritebackContext BackendWritebackContext
BufferDescPadded * BufferDescriptors
#define BM_MAX_USAGE_COUNT
static void InitBufferTag(BufferTag *tag, const RelFileLocator *rlocator, ForkNumber forkNum, BlockNumber blockNum)
#define BUF_USAGECOUNT_MASK
static ForkNumber BufTagGetForkNum(const BufferTag *tag)
static ConditionVariable * BufferDescriptorGetIOCV(const BufferDesc *bdesc)
static void UnlockBufHdr(BufferDesc *desc, uint32 buf_state)
static bool BufferTagsEqual(const BufferTag *tag1, const BufferTag *tag2)
static RelFileNumber BufTagGetRelNumber(const BufferTag *tag)
static LWLock * BufferDescriptorGetContentLock(const BufferDesc *bdesc)
static bool BufTagMatchesRelFileLocator(const BufferTag *tag, const RelFileLocator *rlocator)
#define BM_PIN_COUNT_WAITER
static void ResourceOwnerRememberBufferIO(ResourceOwner owner, Buffer buffer)
#define BUF_STATE_GET_USAGECOUNT(state)
static void ResourceOwnerForgetBufferIO(ResourceOwner owner, Buffer buffer)
#define BM_IO_IN_PROGRESS
static void ClearBufferTag(BufferTag *tag)
static void ResourceOwnerRememberBuffer(ResourceOwner owner, Buffer buffer)
static void ResourceOwnerForgetBuffer(ResourceOwner owner, Buffer buffer)
#define BUF_USAGECOUNT_ONE
#define BUF_STATE_GET_REFCOUNT(state)
static LWLock * BufMappingPartitionLock(uint32 hashcode)
static RelFileLocator BufTagGetRelFileLocator(const BufferTag *tag)
static BufferDesc * GetLocalBufferDescriptor(uint32 id)
static BufferDesc * GetBufferDescriptor(uint32 id)
static Buffer BufferDescriptorGetBuffer(const BufferDesc *bdesc)
#define BM_CHECKPOINT_NEEDED
void BufTableDelete(BufferTag *tagPtr, uint32 hashcode)
int BufTableLookup(BufferTag *tagPtr, uint32 hashcode)
uint32 BufTableHashCode(BufferTag *tagPtr)
int BufTableInsert(BufferTag *tagPtr, uint32 hashcode, int buf_id)
void CheckBufferIsPinnedOnce(Buffer buffer)
void FlushRelationsAllBuffers(SMgrRelation *smgrs, int nrels)
void IncrBufferRefCount(Buffer buffer)
void DropDatabaseBuffers(Oid dbid)
static int ckpt_buforder_comparator(const CkptSortItem *a, const CkptSortItem *b)
static pg_attribute_always_inline PgAioResult buffer_readv_complete(PgAioHandle *ioh, PgAioResult prior_result, uint8 cb_data, bool is_temp)
bool BufferIsExclusiveLocked(Buffer buffer)
const ResourceOwnerDesc buffer_pin_resowner_desc
BlockNumber BufferGetBlockNumber(Buffer buffer)
static PrivateRefCountEntry * NewPrivateRefCountEntry(Buffer buffer)
static bool ReadBuffersCanStartIO(Buffer buffer, bool nowait)
void DropRelationBuffers(SMgrRelation smgr_reln, ForkNumber *forkNum, int nforks, BlockNumber *firstDelBlock)
Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation, BlockNumber blockNum)
static PgAioResult shared_buffer_readv_complete_local(PgAioHandle *ioh, PgAioResult prior_result, uint8 cb_data)
static pg_attribute_always_inline bool StartReadBuffersImpl(ReadBuffersOperation *operation, Buffer *buffers, BlockNumber blockNum, int *nblocks, int flags, bool allow_forwarding)
static void CheckReadBuffersOperation(ReadBuffersOperation *operation, bool is_complete)
PrefetchBufferResult PrefetchBuffer(Relation reln, ForkNumber forkNum, BlockNumber blockNum)
static uint32 PrivateRefCountClock
static void FlushBuffer(BufferDesc *buf, SMgrRelation reln, IOObject io_object, IOContext io_context)
static void ResOwnerReleaseBufferIO(Datum res)
static PgAioResult local_buffer_readv_complete(PgAioHandle *ioh, PgAioResult prior_result, uint8 cb_data)
bool StartReadBuffers(ReadBuffersOperation *operation, Buffer *buffers, BlockNumber blockNum, int *nblocks, int flags)
void EvictAllUnpinnedBuffers(int32 *buffers_evicted, int32 *buffers_flushed, int32 *buffers_skipped)
static bool PinBuffer(BufferDesc *buf, BufferAccessStrategy strategy)
const ResourceOwnerDesc buffer_io_resowner_desc
#define BUF_DROP_FULL_SCAN_THRESHOLD
static void PinBuffer_Locked(BufferDesc *buf)
void EvictRelUnpinnedBuffers(Relation rel, int32 *buffers_evicted, int32 *buffers_flushed, int32 *buffers_skipped)
static pg_attribute_always_inline void buffer_readv_complete_one(PgAioTargetData *td, uint8 buf_off, Buffer buffer, uint8 flags, bool failed, bool is_temp, bool *buffer_invalid, bool *failed_checksum, bool *ignored_checksum, bool *zeroed_buffer)
static uint32 WaitBufHdrUnlocked(BufferDesc *buf)
static int buffertag_comparator(const BufferTag *ba, const BufferTag *bb)
bool IsBufferCleanupOK(Buffer buffer)
#define BufferGetLSN(bufHdr)
static char * ResOwnerPrintBufferIO(Datum res)
Buffer ExtendBufferedRel(BufferManagerRelation bmr, ForkNumber forkNum, BufferAccessStrategy strategy, uint32 flags)
void AtEOXact_Buffers(bool isCommit)
static void AbortBufferIO(Buffer buffer)
const PgAioHandleCallbacks aio_shared_buffer_readv_cb
BlockNumber ExtendBufferedRelBy(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, uint32 extend_by, Buffer *buffers, uint32 *extended_by)
static Buffer ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
static void ProcessReadBuffersResult(ReadBuffersOperation *operation)
static void ZeroAndLockBuffer(Buffer buffer, ReadBufferMode mode, bool already_valid)
static BufferDesc * BufferAlloc(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, BlockNumber blockNum, BufferAccessStrategy strategy, bool *foundPtr, IOContext io_context)
static void CheckForBufferLeaks(void)
static bool ReadBuffersCanStartIOOnce(Buffer buffer, bool nowait)
void CreateAndCopyRelationData(RelFileLocator src_rlocator, RelFileLocator dst_rlocator, bool permanent)
void DropRelationsAllBuffers(SMgrRelation *smgr_reln, int nlocators)
static int rlocator_comparator(const void *p1, const void *p2)
Buffer ExtendBufferedRelTo(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, BlockNumber extend_to, ReadBufferMode mode)
struct SMgrSortArray SMgrSortArray
const PgAioHandleCallbacks aio_local_buffer_readv_cb
static bool InvalidateVictimBuffer(BufferDesc *buf_hdr)
static void AtProcExit_Buffers(int code, Datum arg)
static int ts_ckpt_progress_comparator(Datum a, Datum b, void *arg)
void BufferGetTag(Buffer buffer, RelFileLocator *rlocator, ForkNumber *forknum, BlockNumber *blknum)
#define BufHdrGetBlock(bufHdr)
static pg_attribute_always_inline void buffer_stage_common(PgAioHandle *ioh, bool is_write, bool is_temp)
static void local_buffer_write_error_callback(void *arg)
static void BufferSync(int flags)
static bool AsyncReadBuffers(ReadBuffersOperation *operation, int *nblocks_progress)
static void local_buffer_readv_stage(PgAioHandle *ioh, uint8 cb_data)
char * DebugPrintBufferRefcount(Buffer buffer)
static char * ResOwnerPrintBufferPin(Datum res)
void CheckPointBuffers(int flags)
bool BufferIsDirty(Buffer buffer)
static uint32 MaxProportionalPins
static BlockNumber ExtendBufferedRelShared(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, uint32 extend_by, BlockNumber extend_upto, Buffer *buffers, uint32 *extended_by)
bool BgBufferSync(WritebackContext *wb_context)
static void WakePinCountWaiter(BufferDesc *buf)
bool BufferIsPermanent(Buffer buffer)
#define REFCOUNT_ARRAY_ENTRIES
static void shared_buffer_readv_stage(PgAioHandle *ioh, uint8 cb_data)
PrefetchBufferResult PrefetchSharedBuffer(SMgrRelation smgr_reln, ForkNumber forkNum, BlockNumber blockNum)
static PgAioResult shared_buffer_readv_complete(PgAioHandle *ioh, PgAioResult prior_result, uint8 cb_data)
static Buffer GetVictimBuffer(BufferAccessStrategy strategy, IOContext io_context)
bool ConditionalLockBuffer(Buffer buffer)
BlockNumber RelationGetNumberOfBlocksInFork(Relation relation, ForkNumber forkNum)
void ReleaseBuffer(Buffer buffer)
static void FindAndDropRelationBuffers(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber nForkBlock, BlockNumber firstDelBlock)
XLogRecPtr BufferGetLSNAtomic(Buffer buffer)
bool HoldingBufferPinThatDelaysRecovery(void)
int checkpoint_flush_after
void UnlockReleaseBuffer(Buffer buffer)
static pg_attribute_always_inline Buffer PinBufferForBlock(Relation rel, SMgrRelation smgr, char persistence, ForkNumber forkNum, BlockNumber blockNum, BufferAccessStrategy strategy, bool *foundPtr)
void TerminateBufferIO(BufferDesc *buf, bool clear_dirty, uint32 set_flag_bits, bool forget_owner, bool release_aio)
static void UnpinBufferNoOwner(BufferDesc *buf)
static void shared_buffer_write_error_callback(void *arg)
void ScheduleBufferTagForWriteback(WritebackContext *wb_context, IOContext io_context, BufferTag *tag)
void WaitReadBuffers(ReadBuffersOperation *operation)
void WritebackContextInit(WritebackContext *context, int *max_pending)
void MarkBufferDirty(Buffer buffer)
#define BufferIsPinned(bufnum)
double bgwriter_lru_multiplier
static bool EvictUnpinnedBufferInternal(BufferDesc *desc, bool *buffer_flushed)
void LimitAdditionalPins(uint32 *additional_pins)
static void buffer_readv_report(PgAioResult result, const PgAioTargetData *td, int elevel)
static void ReservePrivateRefCountEntry(void)
static BufferDesc * PinCountWaitBuf
static int32 GetPrivateRefCount(Buffer buffer)
static BlockNumber ExtendBufferedRelCommon(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, uint32 extend_by, BlockNumber extend_upto, Buffer *buffers, uint32 *extended_by)
void LockBufferForCleanup(Buffer buffer)
void LockBuffer(Buffer buffer, int mode)
static PrivateRefCountEntry * ReservedRefCountEntry
void MarkBufferDirtyHint(Buffer buffer, bool buffer_std)
void FlushRelationBuffers(Relation rel)
void IssuePendingWritebacks(WritebackContext *wb_context, IOContext io_context)
static void ForgetPrivateRefCountEntry(PrivateRefCountEntry *ref)
bool EvictUnpinnedBuffer(Buffer buf, bool *buffer_flushed)
Buffer ReadBufferWithoutRelcache(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy, bool permanent)
bool ReadRecentBuffer(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber blockNum, Buffer recent_buffer)
#define RELS_BSEARCH_THRESHOLD
int maintenance_io_concurrency
static void UnpinBuffer(BufferDesc *buf)
void FlushDatabaseBuffers(Oid dbid)
static void InvalidateBuffer(BufferDesc *buf)
static void RelationCopyStorageUsingBuffer(RelFileLocator srclocator, RelFileLocator dstlocator, ForkNumber forkNum, bool permanent)
int effective_io_concurrency
static PrivateRefCountEntry * GetPrivateRefCountEntry(Buffer buffer, bool do_move)
bool StartBufferIO(BufferDesc *buf, bool forInput, bool nowait)
struct PrivateRefCountEntry PrivateRefCountEntry
struct CkptTsStatus CkptTsStatus
bool StartReadBuffer(ReadBuffersOperation *operation, Buffer *buffer, BlockNumber blocknum, int flags)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
uint32 LockBufHdr(BufferDesc *desc)
static void ResOwnerReleaseBufferPin(Datum res)
static struct PrivateRefCountEntry PrivateRefCountArray[REFCOUNT_ARRAY_ENTRIES]
static void buffer_readv_decode_error(PgAioResult result, bool *zeroed_any, bool *ignored_any, uint8 *zeroed_or_error_count, uint8 *checkfail_count, uint8 *first_off)
void InitBufferManagerAccess(void)
static void buffer_readv_encode_error(PgAioResult *result, bool is_temp, bool zeroed_any, bool ignored_any, uint8 error_count, uint8 zeroed_count, uint8 checkfail_count, uint8 first_error_off, uint8 first_zeroed_off, uint8 first_ignored_off)
static int SyncOneBuffer(int buf_id, bool skip_recently_used, WritebackContext *wb_context)
uint32 GetAdditionalPinLimit(void)
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
static HTAB * PrivateRefCountHash
static int32 PrivateRefCountOverflowed
bool ConditionalLockBufferForCleanup(Buffer buffer)
int bgwriter_lru_maxpages
static void WaitIO(BufferDesc *buf)
void FlushOneBuffer(Buffer buffer)
#define BUFFER_LOCK_UNLOCK
#define BUFFER_LOCK_SHARE
#define READ_BUFFERS_ZERO_ON_ERROR
static Page BufferGetPage(Buffer buffer)
#define DEFAULT_IO_COMBINE_LIMIT
static Block BufferGetBlock(Buffer buffer)
#define READ_BUFFERS_ISSUE_ADVICE
#define MAX_IO_COMBINE_LIMIT
#define DEFAULT_EFFECTIVE_IO_CONCURRENCY
#define READ_BUFFERS_IGNORE_CHECKSUM_FAILURES
#define DEFAULT_MAINTENANCE_IO_CONCURRENCY
@ EB_CREATE_FORK_IF_NEEDED
#define READ_BUFFERS_SYNCHRONOUSLY
#define BUFFER_LOCK_EXCLUSIVE
@ RBM_ZERO_AND_CLEANUP_LOCK
static bool BufferIsValid(Buffer bufnum)
bool ignore_checksum_failure
char * PageSetChecksumCopy(Page page, BlockNumber blkno)
bool PageIsVerified(PageData *page, BlockNumber blkno, int flags, bool *checksum_failure_p)
static bool PageIsNew(const PageData *page)
static void PageSetLSN(Page page, XLogRecPtr lsn)
static XLogRecPtr PageGetLSN(const PageData *page)
#define PIV_IGNORE_CHECKSUM_FAILURE
#define PG_USED_FOR_ASSERTS_ONLY
#define pg_attribute_always_inline
#define MemSet(start, val, len)
#define StaticAssertStmt(condition, errmessage)
bool IsCatalogRelationOid(Oid relid)
bool IsCatalogTextUniqueIndexOid(Oid relid)
void CheckpointWriteDelay(int flags, double progress)
bool ConditionVariableCancelSleep(void)
void ConditionVariableBroadcast(ConditionVariable *cv)
void ConditionVariablePrepareToSleep(ConditionVariable *cv)
void ConditionVariableSleep(ConditionVariable *cv, uint32 wait_event_info)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
HTAB * hash_create(const char *tabname, int64 nelem, const HASHCTL *info, int flags)
void * hash_seq_search(HASH_SEQ_STATUS *status)
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
int errmsg_internal(const char *fmt,...)
int errdetail_internal(const char *fmt,...)
int errdetail(const char *fmt,...)
ErrorContextCallback * error_context_stack
int errhint_internal(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
int errhint_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
#define ereport(elevel,...)
int StrategySyncStart(uint32 *complete_passes, uint32 *num_buf_alloc)
BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype)
void FreeAccessStrategy(BufferAccessStrategy strategy)
IOContext IOContextForStrategy(BufferAccessStrategy strategy)
BufferDesc * StrategyGetBuffer(BufferAccessStrategy strategy, uint32 *buf_state, bool *from_ring)
bool StrategyRejectBuffer(BufferAccessStrategy strategy, BufferDesc *buf, bool from_ring)
volatile sig_atomic_t ProcSignalBarrierPending
Assert(PointerIsAligned(start, uint64))
BufferUsage pgBufferUsage
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
if(TABLE==NULL||TABLE_index==NULL)
void LockRelationForExtension(Relation relation, LOCKMODE lockmode)
void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode)
void FlushLocalBuffer(BufferDesc *bufHdr, SMgrRelation reln)
void UnpinLocalBuffer(Buffer buffer)
bool StartLocalBufferIO(BufferDesc *bufHdr, bool forInput, bool nowait)
void AtEOXact_LocalBuffers(bool isCommit)
void AtProcExit_LocalBuffers(void)
bool PinLocalBuffer(BufferDesc *buf_hdr, bool adjust_usagecount)
void MarkLocalBufferDirty(Buffer buffer)
void DropRelationAllLocalBuffers(RelFileLocator rlocator)
void TerminateLocalBufferIO(BufferDesc *bufHdr, bool clear_dirty, uint32 set_flag_bits, bool release_aio)
PrefetchBufferResult PrefetchLocalBuffer(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum)
BlockNumber ExtendBufferedRelLocal(BufferManagerRelation bmr, ForkNumber fork, uint32 flags, uint32 extend_by, BlockNumber extend_upto, Buffer *buffers, uint32 *extended_by)
void UnpinLocalBufferNoOwner(Buffer buffer)
void DropRelationLocalBuffers(RelFileLocator rlocator, ForkNumber *forkNum, int nforks, BlockNumber *firstDelBlock)
BufferDesc * LocalBufferAlloc(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum, bool *foundPtr)
bool LWLockHeldByMe(LWLock *lock)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
void LWLockDisown(LWLock *lock)
bool LWLockHeldByMeInMode(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
bool LWLockConditionalAcquire(LWLock *lock, LWLockMode mode)
void ForEachLWLockHeldByMe(void(*callback)(LWLock *, LWLockMode, void *), void *context)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)
#define VALGRIND_MAKE_MEM_DEFINED(addr, size)
#define VALGRIND_MAKE_MEM_NOACCESS(addr, size)
#define START_CRIT_SECTION()
#define CHECK_FOR_INTERRUPTS()
#define END_CRIT_SECTION()
#define ERRCODE_DATA_CORRUPTED
static PgChecksumMode mode
static int64 current_size
#define WRITEBACK_MAX_PENDING_FLUSHES
#define DEFAULT_BACKEND_FLUSH_AFTER
#define DEFAULT_CHECKPOINT_FLUSH_AFTER
#define DEFAULT_BGWRITER_FLUSH_AFTER
#define pgstat_count_buffer_read(rel)
#define pgstat_count_buffer_hit(rel)
PgStat_BgWriterStats PendingBgWriterStats
PgStat_CheckpointerStats PendingCheckpointerStats
void pgstat_prepare_report_checksum_failure(Oid dboid)
void pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount)
instr_time pgstat_prepare_io_time(bool track_io_guc)
void pgstat_count_io_op(IOObject io_object, IOContext io_context, IOOp io_op, uint32 cnt, uint64 bytes)
void pgstat_count_io_op_time(IOObject io_object, IOContext io_context, IOOp io_op, instr_time start_time, uint32 cnt, uint64 bytes)
#define qsort(a, b, c, d)
static Datum PointerGetDatum(const void *X)
static Pointer DatumGetPointer(Datum X)
static int32 DatumGetInt32(Datum X)
#define NUM_AUXILIARY_PROCS
#define DELAY_CHKPT_START
#define INVALID_PROC_NUMBER
void ProcessProcSignalBarrier(void)
@ PROCSIG_RECOVERY_CONFLICT_BUFFERPIN
void set_ps_display_remove_suffix(void)
void set_ps_display_suffix(const char *suffix)
char * psprintf(const char *fmt,...)
ReadStream * read_stream_begin_smgr_relation(int flags, BufferAccessStrategy strategy, SMgrRelation smgr, char smgr_persistence, ForkNumber forknum, ReadStreamBlockNumberCB callback, void *callback_private_data, size_t per_buffer_data_size)
Buffer read_stream_next_buffer(ReadStream *stream, void **per_buffer_data)
void read_stream_end(ReadStream *stream)
BlockNumber block_range_read_stream_cb(ReadStream *stream, void *callback_private_data, void *per_buffer_data)
#define READ_STREAM_USE_BATCHING
static unsigned hash(unsigned *uv, int n)
static SMgrRelation RelationGetSmgr(Relation rel)
#define RelationUsesLocalBuffers(relation)
#define RELATION_IS_OTHER_TEMP(relation)
#define RelationIsValid(relation)
#define RelFileLocatorBackendIsTemp(rlocator)
#define RelFileLocatorEquals(locator1, locator2)
#define relpath(rlocator, forknum)
#define relpathbackend(rlocator, backend, forknum)
#define relpathperm(rlocator, forknum)
ResourceOwner CurrentResourceOwner
void ResourceOwnerEnlarge(ResourceOwner owner)
#define RELEASE_PRIO_BUFFER_IOS
@ RESOURCE_RELEASE_BEFORE_LOCKS
#define RELEASE_PRIO_BUFFER_PINS
void perform_spin_delay(SpinDelayStatus *status)
void finish_spin_delay(SpinDelayStatus *status)
#define init_local_spin_delay(status)
BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum)
void smgrstartreadv(PgAioHandle *ioh, SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, void **buffers, BlockNumber nblocks)
void smgrwriteback(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, BlockNumber nblocks)
SMgrRelation smgropen(RelFileLocator rlocator, ProcNumber backend)
void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)
BlockNumber smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum)
uint32 smgrmaxcombine(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum)
void smgrzeroextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, int nblocks, bool skipFsync)
void smgrextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, const void *buffer, bool skipFsync)
bool smgrexists(SMgrRelation reln, ForkNumber forknum)
bool smgrprefetch(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, int nblocks)
static void smgrwrite(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, const void *buffer, bool skipFsync)
void ProcSendSignal(ProcNumber procNumber)
int GetStartupBufferPinWaitBufId(void)
void SetStartupBufferPinWaitBufId(int bufid)
void ProcWaitForSignal(uint32 wait_event_info)
void ResolveRecoveryConflictWithBufferPin(void)
bool log_recovery_conflict_waits
void LogRecoveryConflict(ProcSignalReason reason, TimestampTz wait_start, TimestampTz now, VirtualTransactionId *wait_list, bool still_waiting)
bool RelFileLocatorSkippingWAL(RelFileLocator rlocator)
SMgrRelation RelationCreateStorage(RelFileLocator rlocator, char relpersistence, bool register_delete)
void log_smgrcreate(const RelFileLocator *rlocator, ForkNumber forkNum)
BlockNumber last_exclusive
BlockNumber current_blocknum
int wait_backend_pgprocno
int64 shared_blks_dirtied
int64 shared_blks_written
struct ErrorContextCallback * previous
void(* callback)(void *arg)
PgAioHandleCallbackStage stage
PgAioTargetData target_data
PgStat_Counter buf_written_clean
PgStat_Counter maxwritten_clean
PgStat_Counter buffers_written
BufferAccessStrategy strategy
char str[REL_PATH_STR_MAXLEN+1]
RelFileLocator rd_locator
BlockNumber smgr_cached_nblocks[MAX_FORKNUM+1]
RelFileLocatorBackend smgr_rlocator
PendingWriteback pending_writebacks[WRITEBACK_MAX_PENDING_FLUSHES]
static uint64 table_relation_size(Relation rel, ForkNumber forkNumber)
struct PgAioTargetData::@123 smgr
static volatile sig_atomic_t waiting
bool RecoveryInProgress(void)
bool XLogNeedsFlush(XLogRecPtr record)
CheckpointStatsData CheckpointStats
void XLogFlush(XLogRecPtr record)
#define CHECKPOINT_FLUSH_UNLOGGED
#define CHECKPOINT_END_OF_RECOVERY
#define CHECKPOINT_IS_SHUTDOWN
#define XLogHintBitIsNeeded()
#define XLogRecPtrIsInvalid(r)
#define InvalidXLogRecPtr
XLogRecPtr XLogSaveBufferForHint(Buffer buffer, bool buffer_std)
XLogRecPtr log_newpage_buffer(Buffer buffer, bool page_std)