From 691fdb2c64a8e3f0ec7fa1acb2225a63fc77d431 Mon Sep 17 00:00:00 2001 From: Hadi Moshayedi Date: Mon, 9 Nov 2020 23:23:50 -0800 Subject: [PATCH] Don't grab in additional locks cstore code when truncating --- src/backend/columnar/cstore_fdw.c | 13 ++++++++++++- src/backend/columnar/cstore_tableam.c | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/backend/columnar/cstore_fdw.c b/src/backend/columnar/cstore_fdw.c index 97e6f5a3c..19b3d1847 100644 --- a/src/backend/columnar/cstore_fdw.c +++ b/src/backend/columnar/cstore_fdw.c @@ -718,7 +718,7 @@ FindCStoreTables(List *tableList) foreach(relationCell, tableList) { RangeVar *rangeVar = (RangeVar *) lfirst(relationCell); - Oid relationId = RangeVarGetRelid(rangeVar, AccessShareLock, true); + Oid relationId = RangeVarGetRelid(rangeVar, NoLock, true); if (IsCStoreFdwTable(relationId) && !DistributedTable(relationId)) { cstoreTableList = lappend(cstoreTableList, rangeVar); @@ -758,6 +758,17 @@ OpenRelationsForTruncate(List *cstoreTableList) { heap_close(relation, AccessExclusiveLock); } + + /* + * Type of cstore tables can change since we checked last time, + * since we didn't hold a lock when checking. + */ + else if (!IsCStoreFdwTable(relationId)) + { + ereport(ERROR, (errmsg("relation \"%s\" not columnar anymore", + RelationGetRelationName(relation)), + errhint("try repeating the truncate command"))); + } else { relationIdList = lappend_oid(relationIdList, relationId); diff --git a/src/backend/columnar/cstore_tableam.c b/src/backend/columnar/cstore_tableam.c index 203cbb334..d7c3aff11 100644 --- a/src/backend/columnar/cstore_tableam.c +++ b/src/backend/columnar/cstore_tableam.c @@ -58,7 +58,7 @@ * These are the same values from src/backend/access/heap/vacuumlazy.c */ #define VACUUM_TRUNCATE_LOCK_WAIT_INTERVAL 50 /* ms */ -#define VACUUM_TRUNCATE_LOCK_TIMEOUT 5000 /* ms */ +#define VACUUM_TRUNCATE_LOCK_TIMEOUT 4500 /* ms */ typedef struct CStoreScanDescData {