69#define BufHdrGetBlock(bufHdr) ((Block) (BufferBlocks + ((Size) (bufHdr)->buf_id) * BLCKSZ))
70#define BufferGetLSN(bufHdr) (PageGetLSN(BufHdrGetBlock(bufHdr)))
73#define LocalBufHdrGetBlock(bufHdr) \
74 LocalBufferBlockPointers[-((bufHdr)->buf_id + 2)]
77#define BUF_WRITTEN 0x01
78#define BUF_REUSABLE 0x02
80#define RELS_BSEARCH_THRESHOLD 20
88#define BUF_DROP_FULL_SCAN_THRESHOLD (uint64) (NBuffers / 32)
97#define REFCOUNT_ARRAY_ENTRIES 8
243 .
name =
"buffer pin",
480#define BufferIsPinned(bufnum) \
482 !BufferIsValid(bufnum) ? \
485 BufferIsLocal(bufnum) ? \
486 (LocalRefCount[-(bufnum) - 1] > 0) \
488 (GetPrivateRefCount(bufnum) > 0) \
654 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
655 errmsg(
"cannot access temporary tables of other sessions")));
681 bool have_private_ref;
691 int b = -recent_buffer - 1;
716 if (have_private_ref)
728 if (have_private_ref)
739 if (!have_private_ref)
810 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
811 errmsg(
"cannot access temporary tables of other sessions")));
818 forkNum, blockNum,
mode, strategy);
842 permanent ? RELPERSISTENCE_PERMANENT : RELPERSISTENCE_UNLOGGED,
895 if (bmr.
smgr == NULL)
903 buffers, extended_by);
931 if (bmr.
smgr == NULL)
987 num_pages, extend_to,
988 buffers, &extended_by);
995 if (first_block +
i != extend_to - 1)
1010 Assert(extended_by == 0);
1012 fork, extend_to - 1,
mode, strategy);
1038 need_to_zero =
false;
1040 else if (isLocalBuf)
1084 else if (!isLocalBuf)
1118 Assert((persistence == RELPERSISTENCE_TEMP ||
1119 persistence == RELPERSISTENCE_PERMANENT ||
1120 persistence == RELPERSISTENCE_UNLOGGED));
1122 if (persistence == RELPERSISTENCE_TEMP)
1133 TRACE_POSTGRESQL_BUFFER_READ_START(forkNum, blockNum,
1139 if (persistence == RELPERSISTENCE_TEMP)
1147 bufHdr =
BufferAlloc(smgr, persistence, forkNum, blockNum,
1148 strategy, foundPtr, io_context);
1169 TRACE_POSTGRESQL_BUFFER_READ_DONE(forkNum, blockNum,
1217 persistence = rel->
rd_rel->relpersistence;
1219 persistence = smgr_persistence;
1227 forkNum, blockNum, strategy, &found);
1240 operation.
smgr = smgr;
1241 operation.
rel = rel;
1260 bool allow_forwarding)
1262 int actual_nblocks = *nblocks;
1266 Assert(*nblocks == 1 || allow_forwarding);
1270 for (
int i = 0;
i < actual_nblocks; ++
i)
1333#ifdef USE_ASSERT_CHECKING
1367 if (
i == 0 && actual_nblocks > 1)
1372 if (
unlikely(maxcombine < actual_nblocks))
1374 elog(
DEBUG2,
"limiting nblocks at %u from %u to %u",
1375 blockNum, actual_nblocks, maxcombine);
1376 actual_nblocks = maxcombine;
1381 *nblocks = actual_nblocks;
1386 operation->
flags = flags;
1387 operation->
nblocks = actual_nblocks;
1423 operation->
nblocks = *nblocks;
1450 did_start_io =
true;
1455 return did_start_io;
1527#ifdef USE_ASSERT_CHECKING
1541 if (i < operation->nblocks_done)
1595 int newly_read_blocks = 0;
1621 Assert(newly_read_blocks > 0);
1636 if (operation->
persistence == RELPERSISTENCE_TEMP)
1659 elog(
ERROR,
"waiting for read operation that didn't read");
1670 int ignored_nblocks_progress;
1765 int flags = operation->
flags;
1771 int io_buffers_len = 0;
1787 if (persistence == RELPERSISTENCE_TEMP)
1870 *nblocks_progress = 1;
1874 did_start_io =
false;
1881 TRACE_POSTGRESQL_BUFFER_READ_DONE(forknum, blocknum + operation->
nblocks_done,
1888 if (persistence == RELPERSISTENCE_TEMP)
1906 Assert(io_buffers[0] == buffers[nblocks_done]);
1916 for (
int i = nblocks_done + 1;
i < operation->
nblocks;
i++)
1923 Assert(io_buffers[io_buffers_len] == buffers[
i]);
1935 persistence == RELPERSISTENCE_TEMP ?
1953 blocknum + nblocks_done,
1954 io_pages, io_buffers_len);
1956 io_start, 1, io_buffers_len * BLCKSZ);
1958 if (persistence == RELPERSISTENCE_TEMP)
1971 *nblocks_progress = io_buffers_len;
1972 did_start_io =
true;
1975 return did_start_io;
2005 LWLock *newPartitionLock;
2006 int existing_buf_id;
2025 if (existing_buf_id >= 0)
2078 if (existing_buf_id >= 0)
2105 valid =
PinBuffer(existing_buf_hdr, strategy);
2122 return existing_buf_hdr;
2128 victim_buf_state =
LockBufHdr(victim_buf_hdr);
2134 victim_buf_hdr->
tag = newTag;
2143 if (relpersistence == RELPERSISTENCE_PERMANENT || forkNum ==
INIT_FORKNUM)
2155 return victim_buf_hdr;
2180 LWLock *oldPartitionLock;
2234 elog(
ERROR,
"buffer is pinned in InvalidateBuffer");
2423 if (strategy != NULL)
2484#ifdef USE_ASSERT_CHECKING
2517 uint32 estimated_pins_held;
2545 if (*additional_pins <= 1)
2549 limit =
Max(limit, 1);
2550 if (limit < *additional_pins)
2551 *additional_pins = limit;
2570 TRACE_POSTGRESQL_BUFFER_EXTEND_START(fork,
2579 extend_by, extend_upto,
2580 buffers, &extend_by);
2583 extend_by, extend_upto,
2584 buffers, &extend_by);
2585 *extended_by = extend_by;
2587 TRACE_POSTGRESQL_BUFFER_EXTEND_DONE(fork,
2636 MemSet(buf_block, 0, BLCKSZ);
2669 uint32 orig_extend_by = extend_by;
2671 if (first_block > extend_upto)
2673 else if ((
uint64) first_block + extend_by > extend_upto)
2674 extend_by = extend_upto - first_block;
2676 for (
uint32 i = extend_by;
i < orig_extend_by;
i++)
2692 *extended_by = extend_by;
2700 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
2701 errmsg(
"cannot extend relation %s beyond %u blocks",
2713 Buffer victim_buf = buffers[
i];
2746 if (existing_id >= 0)
2756 valid =
PinBuffer(existing_hdr, strategy);
2772 (
errmsg(
"unexpected data beyond EOF in block %u of relation %s",
2775 errhint(
"This has been seen to occur with buggy kernels; consider updating your system.")));
2791 buf_state &= ~BM_VALID;
2805 victim_buf_hdr->
tag = tag;
2845 io_start, 1, extend_by * BLCKSZ);
2859 if (first_block +
i + 1 == extend_upto)
2871 *extended_by = extend_by;
2972 buf_state = old_buf_state;
3089 buf_state = old_buf_state;
3094 if (strategy == NULL)
3113 result = (buf_state &
BM_VALID) != 0;
3240 int wait_backend_pgprocno =
buf->wait_backend_pgprocno;
3242 buf_state &= ~BM_PIN_COUNT_WAITER;
3307 buf_state = old_buf_state;
3324#define ST_SORT sort_checkpoint_bufferids
3325#define ST_ELEMENT_TYPE CkptSortItem
3326#define ST_COMPARE(a, b) ckpt_buforder_comparator(a, b)
3327#define ST_SCOPE static
3383 for (buf_id = 0; buf_id <
NBuffers; buf_id++)
3393 if ((buf_state & mask) == mask)
3414 if (num_to_scan == 0)
3419 TRACE_POSTGRESQL_BUFFER_SYNC_START(
NBuffers, num_to_scan);
3437 for (
i = 0;
i < num_to_scan;
i++)
3448 if (last_tsid ==
InvalidOid || last_tsid != cur_tsid)
3460 if (per_ts_stat == NULL)
3465 s = &per_ts_stat[num_spaces - 1];
3466 memset(s, 0,
sizeof(*s));
3481 last_tsid = cur_tsid;
3485 s = &per_ts_stat[num_spaces - 1];
3506 for (
i = 0;
i < num_spaces;
i++)
3554 TRACE_POSTGRESQL_BUFFER_SYNC_WRITTEN(buf_id);
3603 TRACE_POSTGRESQL_BUFFER_SYNC_DONE(
NBuffers, num_written, num_to_scan);
3621 int strategy_buf_id;
3629 static bool saved_info_valid =
false;
3630 static int prev_strategy_buf_id;
3631 static uint32 prev_strategy_passes;
3632 static int next_to_clean;
3633 static uint32 next_passes;
3636 static float smoothed_alloc = 0;
3637 static float smoothed_density = 10.0;
3640 float smoothing_samples = 16;
3641 float scan_whole_pool_milliseconds = 120000.0;
3644 long strategy_delta;
3647 float scans_per_alloc;
3648 int reusable_buffers_est;
3649 int upcoming_alloc_est;
3650 int min_scan_buffers;
3655 int reusable_buffers;
3658 long new_strategy_delta;
3677 saved_info_valid =
false;
3689 if (saved_info_valid)
3691 int32 passes_delta = strategy_passes - prev_strategy_passes;
3693 strategy_delta = strategy_buf_id - prev_strategy_buf_id;
3694 strategy_delta += (long) passes_delta *
NBuffers;
3696 Assert(strategy_delta >= 0);
3698 if ((
int32) (next_passes - strategy_passes) > 0)
3701 bufs_to_lap = strategy_buf_id - next_to_clean;
3703 elog(
DEBUG2,
"bgwriter ahead: bgw %u-%u strategy %u-%u delta=%ld lap=%d",
3704 next_passes, next_to_clean,
3705 strategy_passes, strategy_buf_id,
3706 strategy_delta, bufs_to_lap);
3709 else if (next_passes == strategy_passes &&
3710 next_to_clean >= strategy_buf_id)
3713 bufs_to_lap =
NBuffers - (next_to_clean - strategy_buf_id);
3715 elog(
DEBUG2,
"bgwriter ahead: bgw %u-%u strategy %u-%u delta=%ld lap=%d",
3716 next_passes, next_to_clean,
3717 strategy_passes, strategy_buf_id,
3718 strategy_delta, bufs_to_lap);
3728 elog(
DEBUG2,
"bgwriter behind: bgw %u-%u strategy %u-%u delta=%ld",
3729 next_passes, next_to_clean,
3730 strategy_passes, strategy_buf_id,
3733 next_to_clean = strategy_buf_id;
3734 next_passes = strategy_passes;
3745 elog(
DEBUG2,
"bgwriter initializing: strategy %u-%u",
3746 strategy_passes, strategy_buf_id);
3749 next_to_clean = strategy_buf_id;
3750 next_passes = strategy_passes;
3755 prev_strategy_buf_id = strategy_buf_id;
3756 prev_strategy_passes = strategy_passes;
3757 saved_info_valid =
true;
3765 if (strategy_delta > 0 && recent_alloc > 0)
3767 scans_per_alloc = (float) strategy_delta / (
float) recent_alloc;
3768 smoothed_density += (scans_per_alloc - smoothed_density) /
3777 bufs_ahead =
NBuffers - bufs_to_lap;
3778 reusable_buffers_est = (float) bufs_ahead / smoothed_density;
3785 if (smoothed_alloc <= (
float) recent_alloc)
3786 smoothed_alloc = recent_alloc;
3788 smoothed_alloc += ((float) recent_alloc - smoothed_alloc) /
3802 if (upcoming_alloc_est == 0)
3817 if (upcoming_alloc_est < (min_scan_buffers + reusable_buffers_est))
3820 elog(
DEBUG2,
"bgwriter: alloc_est=%d too small, using min=%d + reusable_est=%d",
3821 upcoming_alloc_est, min_scan_buffers, reusable_buffers_est);
3823 upcoming_alloc_est = min_scan_buffers + reusable_buffers_est;
3833 num_to_scan = bufs_to_lap;
3835 reusable_buffers = reusable_buffers_est;
3838 while (num_to_scan > 0 && reusable_buffers < upcoming_alloc_est)
3866 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",
3867 recent_alloc, smoothed_alloc, strategy_delta, bufs_ahead,
3868 smoothed_density, reusable_buffers_est, upcoming_alloc_est,
3869 bufs_to_lap - num_to_scan,
3871 reusable_buffers - reusable_buffers_est);
3882 new_strategy_delta = bufs_to_lap - num_to_scan;
3883 new_recent_alloc = reusable_buffers - reusable_buffers_est;
3884 if (new_strategy_delta > 0 && new_recent_alloc > 0)
3886 scans_per_alloc = (float) new_strategy_delta / (
float) new_recent_alloc;
3887 smoothed_density += (scans_per_alloc - smoothed_density) /
3891 elog(
DEBUG2,
"bgwriter: cleaner density alloc=%u scan=%ld density=%.2f new smoothed=%.2f",
3892 new_recent_alloc, new_strategy_delta,
3893 scans_per_alloc, smoothed_density);
3898 return (bufs_to_lap == 0 && recent_alloc == 0);
3943 else if (skip_recently_used)
4060#ifdef USE_ASSERT_CHECKING
4061 int RefCountErrors = 0;
4096 Assert(RefCountErrors == 0);
4129 result =
psprintf(
"[%03d] (rel=%s, blockNum=%u, flags=0x%x, refcount=%u %d)",
4264 buf_state &= ~BM_JUST_DIRTIED;
4363 if (RELKIND_HAS_TABLE_AM(relation->
rd_rel->relkind))
4375 return (szbytes + (BLCKSZ - 1)) / BLCKSZ;
4377 else if (RELKIND_HAS_STORAGE(relation->
rd_rel->relkind))
4477 uint64 nBlocksToInvalidate = 0;
4486 for (
j = 0;
j < nforks;
j++)
4515 for (
i = 0;
i < nforks;
i++)
4527 nBlocksToInvalidate += (nForkBlock[
i] - firstDelBlock[
i]);
4537 for (
j = 0;
j < nforks;
j++)
4539 nForkBlock[
j], firstDelBlock[
j]);
4569 for (
j = 0;
j < nforks;
j++)
4599 uint64 nBlocksToInvalidate = 0;
4610 for (
i = 0;
i < nlocators;
i++)
4618 rels[n++] = smgr_reln[
i];
4642 for (
i = 0;
i < n && cached;
i++)
4659 nBlocksToInvalidate += block[
i][
j];
4669 for (
i = 0;
i < n;
i++)
4690 for (
i = 0;
i < n;
i++)
4691 locators[
i] = rels[
i]->smgr_rlocator.locator;
4720 for (
j = 0;
j < n;
j++)
4724 rlocator = &locators[
j];
4734 rlocator = bsearch(&locator,
4740 if (rlocator == NULL)
4770 for (curBlock = firstDelBlock; curBlock < nForkBlock; curBlock++)
4774 LWLock *bufPartitionLock;
4894 errcallback.
arg = bufHdr;
4975 for (
i = 0;
i < nrels;
i++)
4980 srels[
i].
srel = smgrs[
i];
5008 for (
j = 0;
j < nrels;
j++)
5012 srelent = &srels[
j];
5022 srelent = bsearch(&rlocator,
5028 if (srelent == NULL)
5100 memset(
buf.data, 0, BLCKSZ);
5121 permanent ? RELPERSISTENCE_PERMANENT : RELPERSISTENCE_UNLOGGED,
5128 for (blkno = 0; blkno < nblocks; blkno++)
5146 memcpy(dstPage, srcPage, BLCKSZ);
5180 char relpersistence;
5185 relpersistence = permanent ?
5186 RELPERSISTENCE_PERMANENT : RELPERSISTENCE_UNLOGGED;
5402 bool dirtied =
false;
5403 bool delayChkptFlags =
false;
5455 delayChkptFlags =
true;
5487 if (delayChkptFlags)
5525 buf_state &= ~BM_PIN_COUNT_WAITER;
5589 elog(
ERROR,
"incorrect local pin count: %d",
5595 elog(
ERROR,
"incorrect local pin count: %d",
5622 bool logged_recovery_conflict =
false;
5661 if (logged_recovery_conflict)
5679 elog(
ERROR,
"multiple backends attempting to wait for pincount 1");
5705 if (waitStart != 0 && !logged_recovery_conflict)
5713 waitStart,
now, NULL,
true);
5714 logged_recovery_conflict =
true;
5746 buf_state &= ~BM_PIN_COUNT_WAITER;
6033 bool forget_owner,
bool release_aio)
6040 buf_state &= ~BM_IO_IN_PROGRESS;
6043 buf_state &= ~BM_IO_ERROR;
6056 buf_state |= set_flag_bits;
6115 errmsg(
"could not write block %u of %s",
6119 errdetail(
"Multiple failures --- write error might be permanent.")));
6136 errcontext(
"writing block %u of relation %s",
6151 errcontext(
"writing block %u of relation %s",
6280 if (
a->tsId <
b->tsId)
6282 else if (
a->tsId >
b->tsId)
6285 if (
a->relNumber <
b->relNumber)
6287 else if (
a->relNumber >
b->relNumber)
6290 else if (
a->forkNum <
b->forkNum)
6292 else if (
a->forkNum >
b->forkNum)
6295 else if (
a->blockNum <
b->blockNum)
6297 else if (
a->blockNum >
b->blockNum)
6366 pending->
tag = *tag;
6378#define ST_SORT sort_pending_writebacks
6379#define ST_ELEMENT_TYPE PendingWriteback
6380#define ST_COMPARE(a, b) buffertag_comparator(&a->tag, &b->tag)
6381#define ST_SCOPE static
6433 for (ahead = 0;
i + ahead + 1 < wb_context->
nr_pending; ahead++)
6445 if (
cur->tag.blockNum ==
next->tag.blockNum)
6449 if (
cur->tag.blockNum + 1 !=
next->tag.blockNum)
6522 *buffer_flushed =
false;
6547 *buffer_flushed =
true;
6611 int32 *buffers_skipped)
6613 *buffers_evicted = 0;
6614 *buffers_skipped = 0;
6615 *buffers_flushed = 0;
6621 bool buffer_flushed;
6633 (*buffers_evicted)++;
6635 (*buffers_skipped)++;
6638 (*buffers_flushed)++;
6659 int32 *buffers_flushed,
int32 *buffers_skipped)
6663 *buffers_skipped = 0;
6664 *buffers_evicted = 0;
6665 *buffers_flushed = 0;
6671 bool buffer_flushed;
6693 (*buffers_evicted)++;
6695 (*buffers_skipped)++;
6698 (*buffers_flushed)++;
6720 uint8 handle_data_len;
6729 for (
int i = 0;
i < handle_data_len;
i++)
6745 first = buf_hdr->
tag;
6799 if (is_write && !is_temp)
6829 uint8 *zeroed_or_error_count,
6830 uint8 *checkfail_count,
6836#define READV_COUNT_BITS 7
6837#define READV_COUNT_MASK ((1 << READV_COUNT_BITS) - 1)
6839 *zeroed_any = rem_error & 1;
6842 *ignored_any = rem_error & 1;
6874 uint8 checkfail_count,
6875 uint8 first_error_off,
6876 uint8 first_zeroed_off,
6877 uint8 first_ignored_off)
6881 uint8 zeroed_or_error_count =
6882 error_count > 0 ? error_count : zeroed_count;
6886 "PG_IOV_MAX is bigger than reserved space for error data");
6888 "PGAIO_RESULT_ERROR_BITS is insufficient for buffer_readv");
6895 if (error_count > 0)
6896 first_off = first_error_off;
6897 else if (zeroed_count > 0)
6898 first_off = first_zeroed_off;
6900 first_off = first_ignored_off;
6902 Assert(!zeroed_any || error_count == 0);
6924 if (error_count > 0)
6933#ifdef USE_ASSERT_CHECKING
6937 uint8 zeroed_or_error_count_2,
6942 &zeroed_any_2, &ignored_any_2,
6943 &zeroed_or_error_count_2,
6946 Assert(zeroed_any == zeroed_any_2);
6947 Assert(ignored_any == ignored_any_2);
6948 Assert(zeroed_or_error_count == zeroed_or_error_count_2);
6949 Assert(checkfail_count == checkfail_count_2);
6950 Assert(first_off == first_off_2);
6954#undef READV_COUNT_BITS
6955#undef READV_COUNT_MASK
6964 uint8 flags,
bool failed,
bool is_temp,
6965 bool *buffer_invalid,
6966 bool *failed_checksum,
6967 bool *ignored_checksum,
6968 bool *zeroed_buffer)
6979#ifdef USE_ASSERT_CHECKING
6992 *buffer_invalid =
false;
6993 *failed_checksum =
false;
6994 *ignored_checksum =
false;
6995 *zeroed_buffer =
false;
7029 memset(bufdata, 0, BLCKSZ);
7030 *zeroed_buffer =
true;
7034 *buffer_invalid =
true;
7039 else if (*failed_checksum)
7040 *ignored_checksum =
true;
7062 if (*buffer_invalid || *failed_checksum || *zeroed_buffer)
7070 *zeroed_buffer ? 1 : 0,
7071 *failed_checksum ? 1 : 0,
7072 buf_off, buf_off, buf_off);
7091 TRACE_POSTGRESQL_BUFFER_READ_DONE(tag.
forkNum,
7108 uint8 cb_data,
bool is_temp)
7112 uint8 first_error_off = 0;
7113 uint8 first_zeroed_off = 0;
7114 uint8 first_ignored_off = 0;
7115 uint8 error_count = 0;
7116 uint8 zeroed_count = 0;
7117 uint8 ignored_count = 0;
7118 uint8 checkfail_count = 0;
7120 uint8 handle_data_len;
7135 for (
uint8 buf_off = 0; buf_off < handle_data_len; buf_off++)
7139 bool failed_verification =
false;
7140 bool failed_checksum =
false;
7141 bool zeroed_buffer =
false;
7142 bool ignored_checksum =
false;
7153 || prior_result.
result <= buf_off;
7156 &failed_verification,
7166 if (failed_verification && !zeroed_buffer && error_count++ == 0)
7167 first_error_off = buf_off;
7168 if (zeroed_buffer && zeroed_count++ == 0)
7169 first_zeroed_off = buf_off;
7170 if (ignored_checksum && ignored_count++ == 0)
7171 first_ignored_off = buf_off;
7172 if (failed_checksum)
7181 (error_count > 0 || ignored_count > 0 || zeroed_count > 0))
7184 zeroed_count > 0, ignored_count > 0,
7185 error_count, zeroed_count, checkfail_count,
7186 first_error_off, first_zeroed_off,
7195 if (is_temp && checkfail_count > 0)
7222 uint8 zeroed_or_error_count,
7225 uint8 affected_count;
7226 const char *msg_one,
7232 &zeroed_or_error_count,
7241 if (zeroed_any && ignored_any)
7243 Assert(zeroed_any && ignored_any);
7246 affected_count = zeroed_or_error_count;
7250 errmsg(
"zeroing %u page(s) and ignoring %u checksum failure(s) among blocks %u..%u of relation %s",
7251 affected_count, checkfail_count, first, last, rpath.
str),
7252 affected_count > 1 ?
7253 errdetail(
"Block %u held first zeroed page.",
7254 first + first_off) : 0,
7255 errhint(
"See server log for details about the other %u invalid block(s).",
7256 affected_count + checkfail_count - 1));
7268 affected_count = zeroed_or_error_count;
7269 msg_one =
_(
"invalid page in block %u of relation %s");
7270 msg_mult =
_(
"%u invalid pages among blocks %u..%u of relation %s");
7271 det_mult =
_(
"Block %u held first invalid page.");
7272 hint_mult =
_(
"See server log for the other %u invalid block(s).");
7274 else if (zeroed_any && !ignored_any)
7276 affected_count = zeroed_or_error_count;
7277 msg_one =
_(
"invalid page in block %u of relation %s; zeroing out page");
7278 msg_mult =
_(
"zeroing out %u invalid pages among blocks %u..%u of relation %s");
7279 det_mult =
_(
"Block %u held first zeroed page.");
7280 hint_mult =
_(
"See server log for the other %u zeroed block(s).");
7282 else if (!zeroed_any && ignored_any)
7284 affected_count = checkfail_count;
7285 msg_one =
_(
"ignoring checksum failure in block %u of relation %s");
7286 msg_mult =
_(
"ignoring %u checksum failures among blocks %u..%u of relation %s");
7287 det_mult =
_(
"Block %u held first ignored page.");
7288 hint_mult =
_(
"See server log for the other %u ignored block(s).");
7295 affected_count == 1 ?
7328 uint8 zeroed_or_error_count,
7333 return prior_result;
7338 &zeroed_or_error_count,
7342 if (checkfail_count)
7350 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
#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)
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 * 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)