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;
1534#ifdef USE_ASSERT_CHECKING
1548 if (i < operation->nblocks_done)
1602 int newly_read_blocks = 0;
1628 Assert(newly_read_blocks > 0);
1643 if (operation->
persistence == RELPERSISTENCE_TEMP)
1666 elog(
ERROR,
"waiting for read operation that didn't read");
1677 int ignored_nblocks_progress;
1772 int flags = operation->
flags;
1778 int io_buffers_len = 0;
1794 if (persistence == RELPERSISTENCE_TEMP)
1877 *nblocks_progress = 1;
1881 did_start_io =
false;
1888 TRACE_POSTGRESQL_BUFFER_READ_DONE(forknum, blocknum + operation->
nblocks_done,
1895 if (persistence == RELPERSISTENCE_TEMP)
1913 Assert(io_buffers[0] == buffers[nblocks_done]);
1923 for (
int i = nblocks_done + 1;
i < operation->
nblocks;
i++)
1930 Assert(io_buffers[io_buffers_len] == buffers[
i]);
1942 persistence == RELPERSISTENCE_TEMP ?
1960 blocknum + nblocks_done,
1961 io_pages, io_buffers_len);
1963 io_start, 1, io_buffers_len * BLCKSZ);
1965 if (persistence == RELPERSISTENCE_TEMP)
1978 *nblocks_progress = io_buffers_len;
1979 did_start_io =
true;
1982 return did_start_io;
2012 LWLock *newPartitionLock;
2013 int existing_buf_id;
2032 if (existing_buf_id >= 0)
2085 if (existing_buf_id >= 0)
2112 valid =
PinBuffer(existing_buf_hdr, strategy);
2129 return existing_buf_hdr;
2135 victim_buf_state =
LockBufHdr(victim_buf_hdr);
2141 victim_buf_hdr->
tag = newTag;
2150 if (relpersistence == RELPERSISTENCE_PERMANENT || forkNum ==
INIT_FORKNUM)
2162 return victim_buf_hdr;
2187 LWLock *oldPartitionLock;
2241 elog(
ERROR,
"buffer is pinned in InvalidateBuffer");
2430 if (strategy != NULL)
2491#ifdef USE_ASSERT_CHECKING
2524 uint32 estimated_pins_held;
2552 if (*additional_pins <= 1)
2556 limit =
Max(limit, 1);
2557 if (limit < *additional_pins)
2558 *additional_pins = limit;
2577 TRACE_POSTGRESQL_BUFFER_EXTEND_START(fork,
2586 extend_by, extend_upto,
2587 buffers, &extend_by);
2590 extend_by, extend_upto,
2591 buffers, &extend_by);
2592 *extended_by = extend_by;
2594 TRACE_POSTGRESQL_BUFFER_EXTEND_DONE(fork,
2643 MemSet(buf_block, 0, BLCKSZ);
2676 uint32 orig_extend_by = extend_by;
2678 if (first_block > extend_upto)
2680 else if ((
uint64) first_block + extend_by > extend_upto)
2681 extend_by = extend_upto - first_block;
2683 for (
uint32 i = extend_by;
i < orig_extend_by;
i++)
2699 *extended_by = extend_by;
2707 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
2708 errmsg(
"cannot extend relation %s beyond %u blocks",
2720 Buffer victim_buf = buffers[
i];
2753 if (existing_id >= 0)
2763 valid =
PinBuffer(existing_hdr, strategy);
2779 (
errmsg(
"unexpected data beyond EOF in block %u of relation %s",
2782 errhint(
"This has been seen to occur with buggy kernels; consider updating your system.")));
2798 buf_state &= ~BM_VALID;
2812 victim_buf_hdr->
tag = tag;
2852 io_start, 1, extend_by * BLCKSZ);
2866 if (first_block +
i + 1 == extend_upto)
2878 *extended_by = extend_by;
2979 buf_state = old_buf_state;
3096 buf_state = old_buf_state;
3101 if (strategy == NULL)
3120 result = (buf_state &
BM_VALID) != 0;
3247 int wait_backend_pgprocno =
buf->wait_backend_pgprocno;
3249 buf_state &= ~BM_PIN_COUNT_WAITER;
3314 buf_state = old_buf_state;
3331#define ST_SORT sort_checkpoint_bufferids
3332#define ST_ELEMENT_TYPE CkptSortItem
3333#define ST_COMPARE(a, b) ckpt_buforder_comparator(a, b)
3334#define ST_SCOPE static
3390 for (buf_id = 0; buf_id <
NBuffers; buf_id++)
3400 if ((buf_state & mask) == mask)
3421 if (num_to_scan == 0)
3426 TRACE_POSTGRESQL_BUFFER_SYNC_START(
NBuffers, num_to_scan);
3444 for (
i = 0;
i < num_to_scan;
i++)
3455 if (last_tsid ==
InvalidOid || last_tsid != cur_tsid)
3467 if (per_ts_stat == NULL)
3472 s = &per_ts_stat[num_spaces - 1];
3473 memset(s, 0,
sizeof(*s));
3488 last_tsid = cur_tsid;
3492 s = &per_ts_stat[num_spaces - 1];
3513 for (
i = 0;
i < num_spaces;
i++)
3561 TRACE_POSTGRESQL_BUFFER_SYNC_WRITTEN(buf_id);
3610 TRACE_POSTGRESQL_BUFFER_SYNC_DONE(
NBuffers, num_written, num_to_scan);
3628 int strategy_buf_id;
3636 static bool saved_info_valid =
false;
3637 static int prev_strategy_buf_id;
3638 static uint32 prev_strategy_passes;
3639 static int next_to_clean;
3640 static uint32 next_passes;
3643 static float smoothed_alloc = 0;
3644 static float smoothed_density = 10.0;
3647 float smoothing_samples = 16;
3648 float scan_whole_pool_milliseconds = 120000.0;
3651 long strategy_delta;
3654 float scans_per_alloc;
3655 int reusable_buffers_est;
3656 int upcoming_alloc_est;
3657 int min_scan_buffers;
3662 int reusable_buffers;
3665 long new_strategy_delta;
3684 saved_info_valid =
false;
3696 if (saved_info_valid)
3698 int32 passes_delta = strategy_passes - prev_strategy_passes;
3700 strategy_delta = strategy_buf_id - prev_strategy_buf_id;
3701 strategy_delta += (long) passes_delta *
NBuffers;
3703 Assert(strategy_delta >= 0);
3705 if ((
int32) (next_passes - strategy_passes) > 0)
3708 bufs_to_lap = strategy_buf_id - next_to_clean;
3710 elog(
DEBUG2,
"bgwriter ahead: bgw %u-%u strategy %u-%u delta=%ld lap=%d",
3711 next_passes, next_to_clean,
3712 strategy_passes, strategy_buf_id,
3713 strategy_delta, bufs_to_lap);
3716 else if (next_passes == strategy_passes &&
3717 next_to_clean >= strategy_buf_id)
3720 bufs_to_lap =
NBuffers - (next_to_clean - strategy_buf_id);
3722 elog(
DEBUG2,
"bgwriter ahead: bgw %u-%u strategy %u-%u delta=%ld lap=%d",
3723 next_passes, next_to_clean,
3724 strategy_passes, strategy_buf_id,
3725 strategy_delta, bufs_to_lap);
3735 elog(
DEBUG2,
"bgwriter behind: bgw %u-%u strategy %u-%u delta=%ld",
3736 next_passes, next_to_clean,
3737 strategy_passes, strategy_buf_id,
3740 next_to_clean = strategy_buf_id;
3741 next_passes = strategy_passes;
3752 elog(
DEBUG2,
"bgwriter initializing: strategy %u-%u",
3753 strategy_passes, strategy_buf_id);
3756 next_to_clean = strategy_buf_id;
3757 next_passes = strategy_passes;
3762 prev_strategy_buf_id = strategy_buf_id;
3763 prev_strategy_passes = strategy_passes;
3764 saved_info_valid =
true;
3772 if (strategy_delta > 0 && recent_alloc > 0)
3774 scans_per_alloc = (float) strategy_delta / (
float) recent_alloc;
3775 smoothed_density += (scans_per_alloc - smoothed_density) /
3784 bufs_ahead =
NBuffers - bufs_to_lap;
3785 reusable_buffers_est = (float) bufs_ahead / smoothed_density;
3792 if (smoothed_alloc <= (
float) recent_alloc)
3793 smoothed_alloc = recent_alloc;
3795 smoothed_alloc += ((float) recent_alloc - smoothed_alloc) /
3809 if (upcoming_alloc_est == 0)
3824 if (upcoming_alloc_est < (min_scan_buffers + reusable_buffers_est))
3827 elog(
DEBUG2,
"bgwriter: alloc_est=%d too small, using min=%d + reusable_est=%d",
3828 upcoming_alloc_est, min_scan_buffers, reusable_buffers_est);
3830 upcoming_alloc_est = min_scan_buffers + reusable_buffers_est;
3840 num_to_scan = bufs_to_lap;
3842 reusable_buffers = reusable_buffers_est;
3845 while (num_to_scan > 0 && reusable_buffers < upcoming_alloc_est)
3873 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",
3874 recent_alloc, smoothed_alloc, strategy_delta, bufs_ahead,
3875 smoothed_density, reusable_buffers_est, upcoming_alloc_est,
3876 bufs_to_lap - num_to_scan,
3878 reusable_buffers - reusable_buffers_est);
3889 new_strategy_delta = bufs_to_lap - num_to_scan;
3890 new_recent_alloc = reusable_buffers - reusable_buffers_est;
3891 if (new_strategy_delta > 0 && new_recent_alloc > 0)
3893 scans_per_alloc = (float) new_strategy_delta / (
float) new_recent_alloc;
3894 smoothed_density += (scans_per_alloc - smoothed_density) /
3898 elog(
DEBUG2,
"bgwriter: cleaner density alloc=%u scan=%ld density=%.2f new smoothed=%.2f",
3899 new_recent_alloc, new_strategy_delta,
3900 scans_per_alloc, smoothed_density);
3905 return (bufs_to_lap == 0 && recent_alloc == 0);
3950 else if (skip_recently_used)
4067#ifdef USE_ASSERT_CHECKING
4068 int RefCountErrors = 0;
4103 Assert(RefCountErrors == 0);
4107#ifdef USE_ASSERT_CHECKING
4126AssertBufferLocksPermitCatalogRead(
void)
4133 void *unused_context)
4147 ((
char *) lock - offsetof(
BufferDesc, content_lock));
4199 result =
psprintf(
"[%03d] (rel=%s, blockNum=%u, flags=0x%x, refcount=%u %d)",
4334 buf_state &= ~BM_JUST_DIRTIED;
4433 if (RELKIND_HAS_TABLE_AM(relation->
rd_rel->relkind))
4445 return (szbytes + (BLCKSZ - 1)) / BLCKSZ;
4447 else if (RELKIND_HAS_STORAGE(relation->
rd_rel->relkind))
4547 uint64 nBlocksToInvalidate = 0;
4556 for (
j = 0;
j < nforks;
j++)
4585 for (
i = 0;
i < nforks;
i++)
4597 nBlocksToInvalidate += (nForkBlock[
i] - firstDelBlock[
i]);
4607 for (
j = 0;
j < nforks;
j++)
4609 nForkBlock[
j], firstDelBlock[
j]);
4639 for (
j = 0;
j < nforks;
j++)
4669 uint64 nBlocksToInvalidate = 0;
4680 for (
i = 0;
i < nlocators;
i++)
4688 rels[n++] = smgr_reln[
i];
4712 for (
i = 0;
i < n && cached;
i++)
4729 nBlocksToInvalidate += block[
i][
j];
4739 for (
i = 0;
i < n;
i++)
4760 for (
i = 0;
i < n;
i++)
4761 locators[
i] = rels[
i]->smgr_rlocator.locator;
4790 for (
j = 0;
j < n;
j++)
4794 rlocator = &locators[
j];
4804 rlocator = bsearch(&locator,
4810 if (rlocator == NULL)
4840 for (curBlock = firstDelBlock; curBlock < nForkBlock; curBlock++)
4844 LWLock *bufPartitionLock;
4964 errcallback.
arg = bufHdr;
5045 for (
i = 0;
i < nrels;
i++)
5050 srels[
i].
srel = smgrs[
i];
5078 for (
j = 0;
j < nrels;
j++)
5082 srelent = &srels[
j];
5092 srelent = bsearch(&rlocator,
5098 if (srelent == NULL)
5170 memset(
buf.data, 0, BLCKSZ);
5191 permanent ? RELPERSISTENCE_PERMANENT : RELPERSISTENCE_UNLOGGED,
5198 for (blkno = 0; blkno < nblocks; blkno++)
5216 memcpy(dstPage, srcPage, BLCKSZ);
5250 char relpersistence;
5255 relpersistence = permanent ?
5256 RELPERSISTENCE_PERMANENT : RELPERSISTENCE_UNLOGGED;
5472 bool dirtied =
false;
5473 bool delayChkptFlags =
false;
5525 delayChkptFlags =
true;
5557 if (delayChkptFlags)
5595 buf_state &= ~BM_PIN_COUNT_WAITER;
5659 elog(
ERROR,
"incorrect local pin count: %d",
5665 elog(
ERROR,
"incorrect local pin count: %d",
5692 bool logged_recovery_conflict =
false;
5731 if (logged_recovery_conflict)
5749 elog(
ERROR,
"multiple backends attempting to wait for pincount 1");
5775 if (waitStart != 0 && !logged_recovery_conflict)
5783 waitStart,
now, NULL,
true);
5784 logged_recovery_conflict =
true;
5816 buf_state &= ~BM_PIN_COUNT_WAITER;
6103 bool forget_owner,
bool release_aio)
6110 buf_state &= ~BM_IO_IN_PROGRESS;
6113 buf_state &= ~BM_IO_ERROR;
6126 buf_state |= set_flag_bits;
6185 errmsg(
"could not write block %u of %s",
6189 errdetail(
"Multiple failures --- write error might be permanent.")));
6206 errcontext(
"writing block %u of relation %s",
6221 errcontext(
"writing block %u of relation %s",
6350 if (
a->tsId <
b->tsId)
6352 else if (
a->tsId >
b->tsId)
6355 if (
a->relNumber <
b->relNumber)
6357 else if (
a->relNumber >
b->relNumber)
6360 else if (
a->forkNum <
b->forkNum)
6362 else if (
a->forkNum >
b->forkNum)
6365 else if (
a->blockNum <
b->blockNum)
6367 else if (
a->blockNum >
b->blockNum)
6436 pending->
tag = *tag;
6448#define ST_SORT sort_pending_writebacks
6449#define ST_ELEMENT_TYPE PendingWriteback
6450#define ST_COMPARE(a, b) buffertag_comparator(&a->tag, &b->tag)
6451#define ST_SCOPE static
6503 for (ahead = 0;
i + ahead + 1 < wb_context->
nr_pending; ahead++)
6515 if (
cur->tag.blockNum ==
next->tag.blockNum)
6519 if (
cur->tag.blockNum + 1 !=
next->tag.blockNum)
6592 *buffer_flushed =
false;
6617 *buffer_flushed =
true;
6681 int32 *buffers_skipped)
6683 *buffers_evicted = 0;
6684 *buffers_skipped = 0;
6685 *buffers_flushed = 0;
6691 bool buffer_flushed;
6703 (*buffers_evicted)++;
6705 (*buffers_skipped)++;
6708 (*buffers_flushed)++;
6729 int32 *buffers_flushed,
int32 *buffers_skipped)
6733 *buffers_skipped = 0;
6734 *buffers_evicted = 0;
6735 *buffers_flushed = 0;
6741 bool buffer_flushed;
6763 (*buffers_evicted)++;
6765 (*buffers_skipped)++;
6768 (*buffers_flushed)++;
6790 uint8 handle_data_len;
6799 for (
int i = 0;
i < handle_data_len;
i++)
6815 first = buf_hdr->
tag;
6869 if (is_write && !is_temp)
6899 uint8 *zeroed_or_error_count,
6900 uint8 *checkfail_count,
6906#define READV_COUNT_BITS 7
6907#define READV_COUNT_MASK ((1 << READV_COUNT_BITS) - 1)
6909 *zeroed_any = rem_error & 1;
6912 *ignored_any = rem_error & 1;
6944 uint8 checkfail_count,
6945 uint8 first_error_off,
6946 uint8 first_zeroed_off,
6947 uint8 first_ignored_off)
6951 uint8 zeroed_or_error_count =
6952 error_count > 0 ? error_count : zeroed_count;
6956 "PG_IOV_MAX is bigger than reserved space for error data");
6958 "PGAIO_RESULT_ERROR_BITS is insufficient for buffer_readv");
6965 if (error_count > 0)
6966 first_off = first_error_off;
6967 else if (zeroed_count > 0)
6968 first_off = first_zeroed_off;
6970 first_off = first_ignored_off;
6972 Assert(!zeroed_any || error_count == 0);
6994 if (error_count > 0)
7003#ifdef USE_ASSERT_CHECKING
7007 uint8 zeroed_or_error_count_2,
7012 &zeroed_any_2, &ignored_any_2,
7013 &zeroed_or_error_count_2,
7016 Assert(zeroed_any == zeroed_any_2);
7017 Assert(ignored_any == ignored_any_2);
7018 Assert(zeroed_or_error_count == zeroed_or_error_count_2);
7019 Assert(checkfail_count == checkfail_count_2);
7020 Assert(first_off == first_off_2);
7024#undef READV_COUNT_BITS
7025#undef READV_COUNT_MASK
7034 uint8 flags,
bool failed,
bool is_temp,
7035 bool *buffer_invalid,
7036 bool *failed_checksum,
7037 bool *ignored_checksum,
7038 bool *zeroed_buffer)
7049#ifdef USE_ASSERT_CHECKING
7062 *buffer_invalid =
false;
7063 *failed_checksum =
false;
7064 *ignored_checksum =
false;
7065 *zeroed_buffer =
false;
7099 memset(bufdata, 0, BLCKSZ);
7100 *zeroed_buffer =
true;
7104 *buffer_invalid =
true;
7109 else if (*failed_checksum)
7110 *ignored_checksum =
true;
7132 if (*buffer_invalid || *failed_checksum || *zeroed_buffer)
7140 *zeroed_buffer ? 1 : 0,
7141 *failed_checksum ? 1 : 0,
7142 buf_off, buf_off, buf_off);
7161 TRACE_POSTGRESQL_BUFFER_READ_DONE(tag.
forkNum,
7178 uint8 cb_data,
bool is_temp)
7182 uint8 first_error_off = 0;
7183 uint8 first_zeroed_off = 0;
7184 uint8 first_ignored_off = 0;
7185 uint8 error_count = 0;
7186 uint8 zeroed_count = 0;
7187 uint8 ignored_count = 0;
7188 uint8 checkfail_count = 0;
7190 uint8 handle_data_len;
7205 for (
uint8 buf_off = 0; buf_off < handle_data_len; buf_off++)
7209 bool failed_verification =
false;
7210 bool failed_checksum =
false;
7211 bool zeroed_buffer =
false;
7212 bool ignored_checksum =
false;
7223 || prior_result.
result <= buf_off;
7226 &failed_verification,
7236 if (failed_verification && !zeroed_buffer && error_count++ == 0)
7237 first_error_off = buf_off;
7238 if (zeroed_buffer && zeroed_count++ == 0)
7239 first_zeroed_off = buf_off;
7240 if (ignored_checksum && ignored_count++ == 0)
7241 first_ignored_off = buf_off;
7242 if (failed_checksum)
7251 (error_count > 0 || ignored_count > 0 || zeroed_count > 0))
7254 zeroed_count > 0, ignored_count > 0,
7255 error_count, zeroed_count, checkfail_count,
7256 first_error_off, first_zeroed_off,
7265 if (is_temp && checkfail_count > 0)
7292 uint8 zeroed_or_error_count,
7295 uint8 affected_count;
7296 const char *msg_one,
7302 &zeroed_or_error_count,
7311 if (zeroed_any && ignored_any)
7313 Assert(zeroed_any && ignored_any);
7316 affected_count = zeroed_or_error_count;
7320 errmsg(
"zeroing %u page(s) and ignoring %u checksum failure(s) among blocks %u..%u of relation %s",
7321 affected_count, checkfail_count, first, last, rpath.
str),
7322 affected_count > 1 ?
7323 errdetail(
"Block %u held first zeroed page.",
7324 first + first_off) : 0,
7325 errhint(
"See server log for details about the other %u invalid block(s).",
7326 affected_count + checkfail_count - 1));
7338 affected_count = zeroed_or_error_count;
7339 msg_one =
_(
"invalid page in block %u of relation %s");
7340 msg_mult =
_(
"%u invalid pages among blocks %u..%u of relation %s");
7341 det_mult =
_(
"Block %u held first invalid page.");
7342 hint_mult =
_(
"See server log for the other %u invalid block(s).");
7344 else if (zeroed_any && !ignored_any)
7346 affected_count = zeroed_or_error_count;
7347 msg_one =
_(
"invalid page in block %u of relation %s; zeroing out page");
7348 msg_mult =
_(
"zeroing out %u invalid pages among blocks %u..%u of relation %s");
7349 det_mult =
_(
"Block %u held first zeroed page.");
7350 hint_mult =
_(
"See server log for the other %u zeroed block(s).");
7352 else if (!zeroed_any && ignored_any)
7354 affected_count = checkfail_count;
7355 msg_one =
_(
"ignoring checksum failure in block %u of relation %s");
7356 msg_mult =
_(
"ignoring %u checksum failures among blocks %u..%u of relation %s");
7357 det_mult =
_(
"Block %u held first ignored page.");
7358 hint_mult =
_(
"See server log for the other %u ignored block(s).");
7365 affected_count == 1 ?
7398 uint8 zeroed_or_error_count,
7403 return prior_result;
7408 &zeroed_or_error_count,
7412 if (checkfail_count)
7420 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)
void * hash_seq_search(HASH_SEQ_STATUS *status)
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
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 errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#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)
void StrategyFreeBuffer(BufferDesc *buf)
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 DropRelationLocalBuffers(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber firstDelBlock)
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)
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
struct SMgrRelationData * smgr
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
struct SMgrRelationData * smgr
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::@124 smgr
static volatile sig_atomic_t waiting
bool RecoveryInProgress(void)
bool XLogNeedsFlush(XLogRecPtr record)
CheckpointStatsData CheckpointStats
void XLogFlush(XLogRecPtr record)
#define CHECKPOINT_END_OF_RECOVERY
#define CHECKPOINT_FLUSH_ALL
#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)