]> granicus.if.org Git - postgresql/commitdiff
Properly set relpersistence for fake relcache entries.
authorRobert Haas <rhaas@postgresql.org>
Fri, 14 Sep 2012 13:35:07 +0000 (09:35 -0400)
committerRobert Haas <rhaas@postgresql.org>
Fri, 14 Sep 2012 13:35:07 +0000 (09:35 -0400)
This can result in buffers failing to be properly flushed at
checkpoint time, leading to data loss.

Report, diagnosis, and patch by Jeff Davis.

src/backend/access/transam/xlogutils.c
src/backend/storage/buffer/bufmgr.c

index 6ddcc59b37a45941fd17f8e0b7d3ff0976b346e0..5676120a86310fb167de380810cc738a60397f43 100644 (file)
@@ -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);
 
index dba19ebc6d350b400be5eacbbe76e747bec2a77a..ff92360155d0dec44559389523e5a0f37b7e36a8 100644 (file)
@@ -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);
 }