summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavan Deolasee2014-10-20 10:56:15 +0000
committerPavan Deolasee2015-04-15 05:46:20 +0000
commit8cf5471b6288ff1268b6d05f8ab7dea5e6c8f6c5 (patch)
tree630a5c6876b16d419d8a979dd074b0311a2bc8b4
parent5f06d1c23728451e8c1ee5c410060814895ca0f0 (diff)
Handle TEMP relations appropriately.
There were couple of places where the check for MyCoordId was missing. This was leaving buffers of temporary tables in the buffer cache, even after a table is dropped/truncated. Later when the buffer is chosen for eviction, it will fail to write the buffer and report an error. Similar issues can also lead to fsync failure. Per report from Jov. Investigation and fixes by me
-rw-r--r--src/backend/storage/buffer/bufmgr.c6
-rw-r--r--src/include/storage/relfilenode.h3
-rw-r--r--src/include/storage/smgr.h4
3 files changed, 6 insertions, 7 deletions
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 6858f1ee80..bf7ce4acac 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -2053,12 +2053,8 @@ DropRelFileNodeBuffers(RelFileNodeBackend rnode, ForkNumber forkNum,
{
int i;
-#ifdef XCP
- if (!OidIsValid(MyCoordId) && rnode.backend != InvalidBackendId)
-#else
/* If it's a local relation, it's localbuf.c's problem. */
- if (rnode.backend != InvalidBackendId)
-#endif
+ if (RelFileNodeBackendIsTemp(rnode))
{
if (rnode.backend == MyBackendId)
DropRelFileNodeLocalBuffers(rnode.node, forkNum, firstDelBlock);
diff --git a/src/include/storage/relfilenode.h b/src/include/storage/relfilenode.h
index 60c3829537..f6f015ea05 100644
--- a/src/include/storage/relfilenode.h
+++ b/src/include/storage/relfilenode.h
@@ -87,6 +87,9 @@ typedef struct RelFileNodeBackend
BackendId backend;
} RelFileNodeBackend;
+#define RelFileNodeBackendIsTemp(rnode) \
+ (!OidIsValid(MyCoordId) && ((rnode).backend != InvalidBackendId))
+
/*
* Note: RelFileNodeEquals and RelFileNodeBackendEquals compare relNode first
* since that is most likely to be different in two unequal RelFileNodes. It
diff --git a/src/include/storage/smgr.h b/src/include/storage/smgr.h
index 18c8b98016..828317c76f 100644
--- a/src/include/storage/smgr.h
+++ b/src/include/storage/smgr.h
@@ -76,10 +76,10 @@ typedef SMgrRelationData *SMgrRelation;
#ifdef XCP
#define SmgrIsTemp(smgr) \
(!OidIsValid(MyCoordId) && \
- ((smgr)->smgr_rnode.backend != InvalidBackendId))
+ RelFileNodeBackendIsTemp((smgr)->smgr_rnode))
#else
#define SmgrIsTemp(smgr) \
- ((smgr)->smgr_rnode.backend != InvalidBackendId)
+ RelFileNodeBackendIsTemp((smgr)->smgr_rnode)
#endif
extern void smgrinit(void);