You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hawq.apache.org by ml...@apache.org on 2017/05/05 06:11:36 UTC

incubator-hawq git commit: HAWQ-1453. Fixed relation_close() error at analyzeStmt(): not owned by resource owner TopTransaction (resowner.c:814)

Repository: incubator-hawq
Updated Branches:
  refs/heads/master afcf34c09 -> 50bf9a3e9


HAWQ-1453. Fixed relation_close() error at analyzeStmt(): not owned by resource owner TopTransaction (resowner.c:814)

The relation opened at TopResourceOwner, while close at a new transaction resource owner.
So when we close these relations, we need to firstly switch back to the TopResourceOwner.


Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/50bf9a3e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/50bf9a3e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/50bf9a3e

Branch: refs/heads/master
Commit: 50bf9a3e9e5e18ead5167c21fefc48cf9c754179
Parents: afcf34c
Author: Ming LI <ml...@apache.org>
Authored: Wed May 3 17:01:03 2017 +0800
Committer: Ming LI <ml...@apache.org>
Committed: Fri May 5 14:09:29 2017 +0800

----------------------------------------------------------------------
 src/backend/access/heap/heapam.c |  8 ++++++++
 src/backend/commands/analyze.c   | 24 ++++++++++++------------
 src/include/access/heapam.h      |  1 +
 3 files changed, 21 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/50bf9a3e/src/backend/access/heap/heapam.c
----------------------------------------------------------------------
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 78427e9..33e87f4 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -1269,6 +1269,14 @@ relation_close(Relation relation, LOCKMODE lockmode)
 }
 
 
+void
+relation_close_at_resource_owner(Relation relation, LOCKMODE lockmode, ResourceOwner resowner)
+{
+	ResourceOwner oldOwner = CurrentResourceOwner;
+	CurrentResourceOwner = resowner;
+	relation_close(relation, lockmode);
+	CurrentResourceOwner = oldOwner;
+}
 /* ----------------
  *		heap_open - open a heap relation by relation OID
  *

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/50bf9a3e/src/backend/commands/analyze.c
----------------------------------------------------------------------
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index c3cf8ac..ddd9677 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -308,7 +308,7 @@ void analyzeStmt(VacuumStmt *stmt, List *relids, int preferred_seg_num)
 	ListCell				*le1 = NULL;
 	int 					successCount = 0, failCount = 0;
 	StringInfoData 			failNames;
-	ResourceOwner owner, oldOwner;
+	ResourceOwner asOwner, oldOwner1;  /* asOwner for analyzeStmt resource owner */
 
 	/**
 	 * Ensure that an ANALYZE is requested.
@@ -480,9 +480,9 @@ void analyzeStmt(VacuumStmt *stmt, List *relids, int preferred_seg_num)
 	/**
 	 * Create a resource owner to keep track of our resources even not in trasaction block
 	 */
-	owner = ResourceOwnerCreate(CurrentResourceOwner, "analyzeStmt");
-	oldOwner = CurrentResourceOwner;
-	CurrentResourceOwner = owner;
+	asOwner = ResourceOwnerCreate(CurrentResourceOwner, "analyzeStmt");
+	oldOwner1 = CurrentResourceOwner;
+	CurrentResourceOwner = asOwner;
 
 	/**
 	 *  we use preferred_seg_num as default and
@@ -612,12 +612,12 @@ void analyzeStmt(VacuumStmt *stmt, List *relids, int preferred_seg_num)
 						        (errmsg("skipping \"%s\" --- cannot analyze indexes, views, external tables or special system tables",
 						                RelationGetRelationName(candidateRelation))));
 
-						relation_close(candidateRelation, ShareUpdateExclusiveLock);
+						relation_close_at_resource_owner(candidateRelation, ShareUpdateExclusiveLock, asOwner);
 					}
 					else if (isOtherTempNamespace(RelationGetNamespace(candidateRelation)))
 					{
 						/* Silently ignore tables that are temp tables of other backends. */
-						relation_close(candidateRelation, ShareUpdateExclusiveLock);
+						relation_close_at_resource_owner(candidateRelation, ShareUpdateExclusiveLock, asOwner);
 					}
 					else if (RelationIsExternalPxfReadOnly(candidateRelation, &ext_uri) &&
 					         (!pxf_enable_stat_collection))
@@ -627,7 +627,7 @@ void analyzeStmt(VacuumStmt *stmt, List *relids, int preferred_seg_num)
 						        (errmsg("skipping \"%s\" --- analyze for PXF tables is turned off by 'pxf_enable_stat_collection'",
 						                RelationGetRelationName(candidateRelation))));
 
-						relation_close(candidateRelation, ShareUpdateExclusiveLock);
+						relation_close_at_resource_owner(candidateRelation, ShareUpdateExclusiveLock, asOwner);
 					}
 					else
 					{
@@ -722,7 +722,7 @@ void analyzeStmt(VacuumStmt *stmt, List *relids, int preferred_seg_num)
 						 * releasing the lock before commit would expose
 						 * us to concurrent-update failures.)
 						 */
-						relation_close(candidateRelation, NoLock);
+						relation_close_at_resource_owner(candidateRelation, NoLock, asOwner);
 
 						/* MPP-6929: metadata tracking */
 						if (!bTemp && (Gp_role == GP_ROLE_DISPATCH))
@@ -753,7 +753,7 @@ void analyzeStmt(VacuumStmt *stmt, List *relids, int preferred_seg_num)
 					        (errmsg("Skipping \"%s\" --- only table or database owner can analyze it",
 					                RelationGetRelationName(candidateRelation))));
 
-					relation_close(candidateRelation, ShareUpdateExclusiveLock);
+					relation_close_at_resource_owner(candidateRelation, ShareUpdateExclusiveLock, asOwner);
 				} /* if (analyzePermitted(RelationGetRelid(candidateRelation))) */
 			}
 			else
@@ -795,11 +795,11 @@ void analyzeStmt(VacuumStmt *stmt, List *relids, int preferred_seg_num)
 	UnsetActiveQueryResource();
 	SetActiveQueryResource(savedResource);
 
-	ResourceOwnerRelease(owner,
+	ResourceOwnerRelease(asOwner,
             RESOURCE_RELEASE_BEFORE_LOCKS,
             false, false);
-	CurrentResourceOwner = oldOwner;
-	ResourceOwnerDelete(owner);
+	CurrentResourceOwner = oldOwner1;
+	ResourceOwnerDelete(asOwner);
 
 	if (bUseOwnXacts)
 	{

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/50bf9a3e/src/include/access/heapam.h
----------------------------------------------------------------------
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index dfec95f..5ec8231 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -211,6 +211,7 @@ extern Relation try_relation_openrv(const RangeVar *relation, LOCKMODE lockmode,
 									bool noWait);
 
 extern void relation_close(Relation relation, LOCKMODE lockmode);
+extern void relation_close_at_resource_owner(Relation relation, LOCKMODE lockmode, ResourceOwner resowner);
 
 extern Relation heap_open(Oid relationId, LOCKMODE lockmode);
 extern Relation heap_openrv(const RangeVar *relation, LOCKMODE lockmode);