ForkNumber forkNum, BlockNumber blockNum,
ReadBufferMode mode, BufferAccessStrategy strategy,
bool *hit);
-static BlockNumber ExtendBufferedRelCommon(ExtendBufferedWhat eb,
+static BlockNumber ExtendBufferedRelCommon(BufferManagerRelation bmr,
ForkNumber fork,
BufferAccessStrategy strategy,
uint32 flags,
BlockNumber extend_upto,
Buffer *buffers,
uint32 *extended_by);
-static BlockNumber ExtendBufferedRelShared(ExtendBufferedWhat eb,
+static BlockNumber ExtendBufferedRelShared(BufferManagerRelation bmr,
ForkNumber fork,
BufferAccessStrategy strategy,
uint32 flags,
* Convenience wrapper around ExtendBufferedRelBy() extending by one block.
*/
Buffer
-ExtendBufferedRel(ExtendBufferedWhat eb,
+ExtendBufferedRel(BufferManagerRelation bmr,
ForkNumber forkNum,
BufferAccessStrategy strategy,
uint32 flags)
Buffer buf;
uint32 extend_by = 1;
- ExtendBufferedRelBy(eb, forkNum, strategy, flags, extend_by,
+ ExtendBufferedRelBy(bmr, forkNum, strategy, flags, extend_by,
&buf, &extend_by);
return buf;
* be empty.
*/
BlockNumber
-ExtendBufferedRelBy(ExtendBufferedWhat eb,
+ExtendBufferedRelBy(BufferManagerRelation bmr,
ForkNumber fork,
BufferAccessStrategy strategy,
uint32 flags,
Buffer *buffers,
uint32 *extended_by)
{
- Assert((eb.rel != NULL) != (eb.smgr != NULL));
- Assert(eb.smgr == NULL || eb.relpersistence != 0);
+ Assert((bmr.rel != NULL) != (bmr.smgr != NULL));
+ Assert(bmr.smgr == NULL || bmr.relpersistence != 0);
Assert(extend_by > 0);
- if (eb.smgr == NULL)
+ if (bmr.smgr == NULL)
{
- eb.smgr = RelationGetSmgr(eb.rel);
- eb.relpersistence = eb.rel->rd_rel->relpersistence;
+ bmr.smgr = RelationGetSmgr(bmr.rel);
+ bmr.relpersistence = bmr.rel->rd_rel->relpersistence;
}
- return ExtendBufferedRelCommon(eb, fork, strategy, flags,
+ return ExtendBufferedRelCommon(bmr, fork, strategy, flags,
extend_by, InvalidBlockNumber,
buffers, extended_by);
}
* crash recovery).
*/
Buffer
-ExtendBufferedRelTo(ExtendBufferedWhat eb,
+ExtendBufferedRelTo(BufferManagerRelation bmr,
ForkNumber fork,
BufferAccessStrategy strategy,
uint32 flags,
Buffer buffer = InvalidBuffer;
Buffer buffers[64];
- Assert((eb.rel != NULL) != (eb.smgr != NULL));
- Assert(eb.smgr == NULL || eb.relpersistence != 0);
+ Assert((bmr.rel != NULL) != (bmr.smgr != NULL));
+ Assert(bmr.smgr == NULL || bmr.relpersistence != 0);
Assert(extend_to != InvalidBlockNumber && extend_to > 0);
- if (eb.smgr == NULL)
+ if (bmr.smgr == NULL)
{
- eb.smgr = RelationGetSmgr(eb.rel);
- eb.relpersistence = eb.rel->rd_rel->relpersistence;
+ bmr.smgr = RelationGetSmgr(bmr.rel);
+ bmr.relpersistence = bmr.rel->rd_rel->relpersistence;
}
/*
* an smgrexists call.
*/
if ((flags & EB_CREATE_FORK_IF_NEEDED) &&
- (eb.smgr->smgr_cached_nblocks[fork] == 0 ||
- eb.smgr->smgr_cached_nblocks[fork] == InvalidBlockNumber) &&
- !smgrexists(eb.smgr, fork))
+ (bmr.smgr->smgr_cached_nblocks[fork] == 0 ||
+ bmr.smgr->smgr_cached_nblocks[fork] == InvalidBlockNumber) &&
+ !smgrexists(bmr.smgr, fork))
{
- LockRelationForExtension(eb.rel, ExclusiveLock);
+ LockRelationForExtension(bmr.rel, ExclusiveLock);
/* could have been closed while waiting for lock */
- if (eb.rel)
- eb.smgr = RelationGetSmgr(eb.rel);
+ if (bmr.rel)
+ bmr.smgr = RelationGetSmgr(bmr.rel);
/* recheck, fork might have been created concurrently */
- if (!smgrexists(eb.smgr, fork))
- smgrcreate(eb.smgr, fork, flags & EB_PERFORMING_RECOVERY);
+ if (!smgrexists(bmr.smgr, fork))
+ smgrcreate(bmr.smgr, fork, flags & EB_PERFORMING_RECOVERY);
- UnlockRelationForExtension(eb.rel, ExclusiveLock);
+ UnlockRelationForExtension(bmr.rel, ExclusiveLock);
}
/*
* kernel.
*/
if (flags & EB_CLEAR_SIZE_CACHE)
- eb.smgr->smgr_cached_nblocks[fork] = InvalidBlockNumber;
+ bmr.smgr->smgr_cached_nblocks[fork] = InvalidBlockNumber;
/*
* Estimate how many pages we'll need to extend by. This avoids acquiring
* unnecessarily many victim buffers.
*/
- current_size = smgrnblocks(eb.smgr, fork);
+ current_size = smgrnblocks(bmr.smgr, fork);
/*
* Since no-one else can be looking at the page contents yet, there is no
if ((uint64) current_size + num_pages > extend_to)
num_pages = extend_to - current_size;
- first_block = ExtendBufferedRelCommon(eb, fork, strategy, flags,
+ first_block = ExtendBufferedRelCommon(bmr, fork, strategy, flags,
num_pages, extend_to,
buffers, &extended_by);
bool hit;
Assert(extended_by == 0);
- buffer = ReadBuffer_common(eb.smgr, eb.relpersistence,
+ buffer = ReadBuffer_common(bmr.smgr, bmr.relpersistence,
fork, extend_to - 1, mode, strategy,
&hit);
}
if (mode == RBM_ZERO_AND_LOCK || mode == RBM_ZERO_AND_CLEANUP_LOCK)
flags |= EB_LOCK_FIRST;
- return ExtendBufferedRel(EB_SMGR(smgr, relpersistence),
+ return ExtendBufferedRel(BMR_SMGR(smgr, relpersistence),
forkNum, strategy, flags);
}
* avoid duplicating the tracing and relpersistence related logic.
*/
static BlockNumber
-ExtendBufferedRelCommon(ExtendBufferedWhat eb,
+ExtendBufferedRelCommon(BufferManagerRelation bmr,
ForkNumber fork,
BufferAccessStrategy strategy,
uint32 flags,
BlockNumber first_block;
TRACE_POSTGRESQL_BUFFER_EXTEND_START(fork,
- eb.smgr->smgr_rlocator.locator.spcOid,
- eb.smgr->smgr_rlocator.locator.dbOid,
- eb.smgr->smgr_rlocator.locator.relNumber,
- eb.smgr->smgr_rlocator.backend,
+ bmr.smgr->smgr_rlocator.locator.spcOid,
+ bmr.smgr->smgr_rlocator.locator.dbOid,
+ bmr.smgr->smgr_rlocator.locator.relNumber,
+ bmr.smgr->smgr_rlocator.backend,
extend_by);
- if (eb.relpersistence == RELPERSISTENCE_TEMP)
- first_block = ExtendBufferedRelLocal(eb, fork, flags,
+ if (bmr.relpersistence == RELPERSISTENCE_TEMP)
+ first_block = ExtendBufferedRelLocal(bmr, fork, flags,
extend_by, extend_upto,
buffers, &extend_by);
else
- first_block = ExtendBufferedRelShared(eb, fork, strategy, flags,
+ first_block = ExtendBufferedRelShared(bmr, fork, strategy, flags,
extend_by, extend_upto,
buffers, &extend_by);
*extended_by = extend_by;
TRACE_POSTGRESQL_BUFFER_EXTEND_DONE(fork,
- eb.smgr->smgr_rlocator.locator.spcOid,
- eb.smgr->smgr_rlocator.locator.dbOid,
- eb.smgr->smgr_rlocator.locator.relNumber,
- eb.smgr->smgr_rlocator.backend,
+ bmr.smgr->smgr_rlocator.locator.spcOid,
+ bmr.smgr->smgr_rlocator.locator.dbOid,
+ bmr.smgr->smgr_rlocator.locator.relNumber,
+ bmr.smgr->smgr_rlocator.backend,
*extended_by,
first_block);
* shared buffers.
*/
static BlockNumber
-ExtendBufferedRelShared(ExtendBufferedWhat eb,
+ExtendBufferedRelShared(BufferManagerRelation bmr,
ForkNumber fork,
BufferAccessStrategy strategy,
uint32 flags,
*/
if (!(flags & EB_SKIP_EXTENSION_LOCK))
{
- LockRelationForExtension(eb.rel, ExclusiveLock);
- if (eb.rel)
- eb.smgr = RelationGetSmgr(eb.rel);
+ LockRelationForExtension(bmr.rel, ExclusiveLock);
+ if (bmr.rel)
+ bmr.smgr = RelationGetSmgr(bmr.rel);
}
/*
* kernel.
*/
if (flags & EB_CLEAR_SIZE_CACHE)
- eb.smgr->smgr_cached_nblocks[fork] = InvalidBlockNumber;
+ bmr.smgr->smgr_cached_nblocks[fork] = InvalidBlockNumber;
- first_block = smgrnblocks(eb.smgr, fork);
+ first_block = smgrnblocks(bmr.smgr, fork);
/*
* Now that we have the accurate relation size, check if the caller wants
if (extend_by == 0)
{
if (!(flags & EB_SKIP_EXTENSION_LOCK))
- UnlockRelationForExtension(eb.rel, ExclusiveLock);
+ UnlockRelationForExtension(bmr.rel, ExclusiveLock);
*extended_by = extend_by;
return first_block;
}
ereport(ERROR,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("cannot extend relation %s beyond %u blocks",
- relpath(eb.smgr->smgr_rlocator, fork),
+ relpath(bmr.smgr->smgr_rlocator, fork),
MaxBlockNumber)));
/*
LWLock *partition_lock;
int existing_id;
- InitBufferTag(&tag, &eb.smgr->smgr_rlocator.locator, fork, first_block + i);
+ InitBufferTag(&tag, &bmr.smgr->smgr_rlocator.locator, fork, first_block + i);
hash = BufTableHashCode(&tag);
partition_lock = BufMappingPartitionLock(hash);
if (valid && !PageIsNew((Page) buf_block))
ereport(ERROR,
(errmsg("unexpected data beyond EOF in block %u of relation %s",
- existing_hdr->tag.blockNum, relpath(eb.smgr->smgr_rlocator, fork)),
+ existing_hdr->tag.blockNum, relpath(bmr.smgr->smgr_rlocator, fork)),
errhint("This has been seen to occur with buggy kernels; consider updating your system.")));
/*
victim_buf_hdr->tag = tag;
buf_state |= BM_TAG_VALID | BUF_USAGECOUNT_ONE;
- if (eb.relpersistence == RELPERSISTENCE_PERMANENT || fork == INIT_FORKNUM)
+ if (bmr.relpersistence == RELPERSISTENCE_PERMANENT || fork == INIT_FORKNUM)
buf_state |= BM_PERMANENT;
UnlockBufHdr(victim_buf_hdr, buf_state);
*
* We don't need to set checksum for all-zero pages.
*/
- smgrzeroextend(eb.smgr, fork, first_block, extend_by, false);
+ smgrzeroextend(bmr.smgr, fork, first_block, extend_by, false);
/*
* Release the file-extension lock; it's now OK for someone else to extend
* take noticeable time.
*/
if (!(flags & EB_SKIP_EXTENSION_LOCK))
- UnlockRelationForExtension(eb.rel, ExclusiveLock);
+ UnlockRelationForExtension(bmr.rel, ExclusiveLock);
pgstat_count_io_op_time(IOOBJECT_RELATION, io_context, IOOP_EXTEND,
io_start, extend_by);