From: Robert Haas Date: Fri, 14 Sep 2012 13:35:07 +0000 (-0400) Subject: Properly set relpersistence for fake relcache entries. X-Git-Tag: REL9_3_BETA1~909 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=beb850e1d873f8920a78b9b9ee27e9f87c95592f;p=postgresql Properly set relpersistence for fake relcache entries. This can result in buffers failing to be properly flushed at checkpoint time, leading to data loss. Report, diagnosis, and patch by Jeff Davis. --- diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index 6ddcc59b37..5676120a86 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -394,6 +394,8 @@ CreateFakeRelcacheEntry(RelFileNode rnode) FakeRelCacheEntry fakeentry; Relation rel; + Assert(InRecovery); + /* Allocate the Relation struct and all related space in one block. */ fakeentry = palloc0(sizeof(FakeRelCacheEntryData)); rel = (Relation) fakeentry; @@ -403,6 +405,9 @@ CreateFakeRelcacheEntry(RelFileNode rnode) /* We will never be working with temp rels during recovery */ rel->rd_backend = InvalidBackendId; + /* It must be a permanent table if we're in recovery. */ + rel->rd_rel->relpersistence = RELPERSISTENCE_PERMANENT; + /* We don't know the name of the relation; use relfilenode instead */ sprintf(RelationGetRelationName(rel), "%u", rnode.relNode); diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index dba19ebc6d..ff92360155 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -271,6 +271,8 @@ ReadBufferWithoutRelcache(RelFileNode rnode, ForkNumber forkNum, SMgrRelation smgr = smgropen(rnode, InvalidBackendId); + Assert(InRecovery); + return ReadBuffer_common(smgr, RELPERSISTENCE_PERMANENT, forkNum, blockNum, mode, strategy, &hit); }