!874 add smgr cached nblocks for main fork

Merge pull request !874 from LiHeng/cachedNblock
This commit is contained in:
opengauss-bot
2021-04-01 21:01:14 +08:00
committed by Gitee
4 changed files with 46 additions and 3 deletions

View File

@ -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;

View File

@ -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
}

View File

@ -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

View File

@ -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);