diff options
author | Pavan Deolasee | 2014-10-20 10:56:15 +0000 |
---|---|---|
committer | Pavan Deolasee | 2015-04-15 05:46:20 +0000 |
commit | 8cf5471b6288ff1268b6d05f8ab7dea5e6c8f6c5 (patch) | |
tree | 630a5c6876b16d419d8a979dd074b0311a2bc8b4 | |
parent | 5f06d1c23728451e8c1ee5c410060814895ca0f0 (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.c | 6 | ||||
-rw-r--r-- | src/include/storage/relfilenode.h | 3 | ||||
-rw-r--r-- | src/include/storage/smgr.h | 4 |
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); |