!874 add smgr cached nblocks for main fork
Merge pull request !874 from LiHeng/cachedNblock
This commit is contained in:
@ -687,6 +687,7 @@ void RelationTruncate(Relation rel, BlockNumber nblocks)
|
||||
rel->rd_smgr->smgr_targblock = InvalidBlockNumber;
|
||||
rel->rd_smgr->smgr_fsm_nblocks = InvalidBlockNumber;
|
||||
rel->rd_smgr->smgr_vm_nblocks = InvalidBlockNumber;
|
||||
rel->rd_smgr->smgr_cached_nblocks = InvalidBlockNumber;
|
||||
|
||||
for (int i = 0; i < rel->rd_smgr->smgr_bcmarry_size; i++)
|
||||
rel->rd_smgr->smgr_bcm_nblocks[i] = InvalidBlockNumber;
|
||||
|
||||
@ -2030,9 +2030,16 @@ static Buffer ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumb
|
||||
*/
|
||||
#ifndef ENABLE_MULTIPLE_NODES
|
||||
} else if (RecoveryInProgress()) {
|
||||
if (blockNum >= smgrnblocks(smgr, forkNum))
|
||||
return InvalidBuffer;
|
||||
BlockNumber totalBlkNum = smgrnblocks_cached(smgr, forkNum);
|
||||
|
||||
/* Update cached blocks */
|
||||
if (totalBlkNum == InvalidBlockNumber || blockNum >= totalBlkNum) {
|
||||
totalBlkNum = smgrnblocks(smgr, forkNum);
|
||||
}
|
||||
|
||||
if (blockNum >= totalBlkNum) {
|
||||
return InvalidBuffer;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -150,6 +150,7 @@ static void _smgr_init(SMgrRelation reln, int col = 0)
|
||||
reln->smgr_targblock = InvalidBlockNumber;
|
||||
reln->smgr_fsm_nblocks = InvalidBlockNumber;
|
||||
reln->smgr_vm_nblocks = InvalidBlockNumber;
|
||||
reln->smgr_cached_nblocks = InvalidBlockNumber;
|
||||
|
||||
reln->smgr_which = 0; /* we only have md.c at present */
|
||||
|
||||
@ -809,7 +810,36 @@ void smgrwriteback(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum,
|
||||
*/
|
||||
BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum)
|
||||
{
|
||||
return (*(smgrsw[reln->smgr_which].smgr_nblocks))(reln, forknum);
|
||||
BlockNumber result = InvalidBlockNumber;
|
||||
|
||||
result = (*(smgrsw[reln->smgr_which].smgr_nblocks))(reln, forknum);
|
||||
if (forknum == MAIN_FORKNUM) {
|
||||
reln->smgr_cached_nblocks = result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* smgrnblocks_cached() -- Get the cached number of blocks in the supplied
|
||||
* relation.
|
||||
*
|
||||
* Returns an InvalidBlockNumber when not in recovery and when the relation
|
||||
* fork size is not cached. Now, we only support cache main fork.
|
||||
*/
|
||||
BlockNumber
|
||||
smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum)
|
||||
{
|
||||
/*
|
||||
* For now, we only use cached values in recovery due to lack of a shared
|
||||
* invalidation mechanism for changes in file size.
|
||||
*/
|
||||
if (RecoveryInProgress() && forknum == MAIN_FORKNUM &&
|
||||
reln->smgr_cached_nblocks != InvalidBlockNumber) {
|
||||
return reln->smgr_cached_nblocks;
|
||||
}
|
||||
|
||||
return InvalidBlockNumber;
|
||||
}
|
||||
|
||||
void smgrtruncatefunc(SMgrRelation reln, ForkNumber forknum, BlockNumber nblocks)
|
||||
@ -839,6 +869,9 @@ void smgrtruncate(SMgrRelation reln, ForkNumber forknum, BlockNumber nblocks)
|
||||
if (forknum == BCM_FORKNUM)
|
||||
BCMArrayDropAllBlocks(reln->smgr_rnode.node);
|
||||
|
||||
/* Make the cached size is invalid if we encounter an error. */
|
||||
reln->smgr_cached_nblocks = InvalidBlockNumber;
|
||||
|
||||
/*
|
||||
* Send a shared-inval message to force other backends to close any smgr
|
||||
* references they may have for this rel. This is useful because they
|
||||
|
||||
@ -60,6 +60,7 @@ typedef struct SMgrRelationData {
|
||||
BlockNumber smgr_targblock; /* current insertion target block */
|
||||
BlockNumber smgr_fsm_nblocks; /* last known size of fsm fork */
|
||||
BlockNumber smgr_vm_nblocks; /* last known size of vm fork */
|
||||
BlockNumber smgr_cached_nblocks; /* last known size of main fork*/
|
||||
|
||||
int smgr_bcmarry_size;
|
||||
BlockNumber* smgr_bcm_nblocks; /* last known size of bcm fork */
|
||||
@ -106,6 +107,7 @@ extern void smgrread(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum
|
||||
extern void smgrwrite(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, const char* buffer, bool skipFsync);
|
||||
extern void smgrwriteback(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, BlockNumber nblocks);
|
||||
extern BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum);
|
||||
extern BlockNumber smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum);
|
||||
extern void smgrtruncatefunc(SMgrRelation reln, ForkNumber forknum, BlockNumber nblocks);
|
||||
extern void smgrtruncate(SMgrRelation reln, ForkNumber forknum, BlockNumber nblocks);
|
||||
extern void smgrimmedsync(SMgrRelation reln, ForkNumber forknum);
|
||||
|
||||
Reference in New Issue
Block a user