From f736deb8ccb00157866ad37f692ebf6730e441c2 Mon Sep 17 00:00:00 2001 From: Dilip Kumar Date: Fri, 24 Sep 2021 18:23:39 +0530 Subject: [PATCH v3 4/6] Extend bufmgr interfaces Extend ReadBufferWithoutRelcache interface to take relpersistence as and input and extend DropDatabaseBuffers to take tablespace oid as input. --- src/backend/storage/buffer/bufmgr.c | 24 +++++++++++------------- src/include/storage/bufmgr.h | 5 +++-- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index e88e4e918b..ed54c34031 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -770,24 +770,17 @@ ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, /* * ReadBufferWithoutRelcache -- like ReadBufferExtended, but doesn't require * a relcache entry for the relation. - * - * NB: At present, this function may only be used on permanent relations, which - * is OK, because we only use it during XLOG replay. If in the future we - * want to use it on temporary or unlogged relations, we could pass additional - * parameters. */ Buffer ReadBufferWithoutRelcache(RelFileNode rnode, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, - BufferAccessStrategy strategy) + BufferAccessStrategy strategy, char relpersistence) { bool hit; SMgrRelation smgr = smgropen(rnode, InvalidBackendId); - Assert(InRecovery); - - return ReadBuffer_common(smgr, RELPERSISTENCE_PERMANENT, forkNum, blockNum, + return ReadBuffer_common(smgr, relpersistence, forkNum, blockNum, mode, strategy, &hit); } @@ -797,7 +790,7 @@ ReadBufferWithoutRelcache(RelFileNode rnode, ForkNumber forkNum, * * *hit is set to true if the request was satisfied from shared buffer cache. */ -static Buffer +Buffer ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy, bool *hit) @@ -3402,10 +3395,13 @@ FindAndDropRelFileNodeBuffers(RelFileNode rnode, ForkNumber forkNum, * database, to avoid trying to flush data to disk when the directory * tree no longer exists. Implementation is pretty similar to * DropRelFileNodeBuffers() which is for destroying just one relation. + * + * If a valid tablespace oid is passed then it will compare the tablespace + * oid as well otherwise just the db oid. * -------------------------------------------------------------------- */ void -DropDatabaseBuffers(Oid dbid) +DropDatabaseBuffers(Oid dbid, Oid tbsid) { int i; @@ -3423,11 +3419,13 @@ DropDatabaseBuffers(Oid dbid) * As in DropRelFileNodeBuffers, an unlocked precheck should be safe * and saves some cycles. */ - if (bufHdr->tag.rnode.dbNode != dbid) + if (bufHdr->tag.rnode.dbNode != dbid || + (OidIsValid(tbsid) && bufHdr->tag.rnode.spcNode != tbsid)) continue; buf_state = LockBufHdr(bufHdr); - if (bufHdr->tag.rnode.dbNode == dbid) + if (bufHdr->tag.rnode.dbNode == dbid && + (!OidIsValid(tbsid) || bufHdr->tag.rnode.spcNode == tbsid)) InvalidateBuffer(bufHdr); /* releases spinlock */ else UnlockBufHdr(bufHdr, buf_state); diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h index cfce23ecbc..237c6a9078 100644 --- a/src/include/storage/bufmgr.h +++ b/src/include/storage/bufmgr.h @@ -184,7 +184,8 @@ extern Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BufferAccessStrategy strategy); extern Buffer ReadBufferWithoutRelcache(RelFileNode rnode, ForkNumber forkNum, BlockNumber blockNum, - ReadBufferMode mode, BufferAccessStrategy strategy); + ReadBufferMode mode, BufferAccessStrategy strategy, + char relpersistence); extern void ReleaseBuffer(Buffer buffer); extern void UnlockReleaseBuffer(Buffer buffer); extern void MarkBufferDirty(Buffer buffer); @@ -207,7 +208,7 @@ extern void FlushDatabaseBuffers(Oid dbid); extern void DropRelFileNodeBuffers(struct SMgrRelationData *smgr_reln, ForkNumber *forkNum, int nforks, BlockNumber *firstDelBlock); extern void DropRelFileNodesAllBuffers(struct SMgrRelationData **smgr_reln, int nnodes); -extern void DropDatabaseBuffers(Oid dbid); +extern void DropDatabaseBuffers(Oid dbid, Oid tbsid); #define RelationGetNumberOfBlocks(reln) \ RelationGetNumberOfBlocksInFork(reln, MAIN_FORKNUM) -- 2.23.0