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/04/21 08:37:46 UTC

incubator-hawq git commit: HAWQ-1438. Support resource owner beyond transaction boundary

Repository: incubator-hawq
Updated Branches:
  refs/heads/master e889fc6d7 -> b8e6afd12


HAWQ-1438. Support resource owner beyond transaction boundary

(1) Add TopResourceOwner to trace resource used beyond the transaction boundary.
(2) When to auto alloc a new TopResourceOwner for each process?
    Generate a singleton TopResourceOwner when setting CurrentResourceOwner to NULL.
(3) If crashed at some code beyond the transaction boundary, we should manually create
    a new resource owner, because we don't manually create TopResourceOwner for each process.
(4) When to call ResourceOwnerDelete(TopResourceOwner) automatically for each process?
    Register it at on_proc_exit().


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

Branch: refs/heads/master
Commit: b8e6afd12c170830c5fbb03ef8405fe71154c367
Parents: e889fc6
Author: Ming LI <ml...@apache.org>
Authored: Thu Apr 20 17:04:51 2017 +0800
Committer: Ming LI <ml...@apache.org>
Committed: Fri Apr 21 15:24:27 2017 +0800

----------------------------------------------------------------------
 src/backend/access/transam/xact.c     |  6 +--
 src/backend/access/transam/xlog.c     |  4 +-
 src/backend/utils/init/flatfiles.c    |  2 +-
 src/backend/utils/resowner/resowner.c | 66 ++++++++++++++++++++++++++----
 src/include/utils/resowner.h          |  2 +
 5 files changed, 65 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b8e6afd1/src/backend/access/transam/xact.c
----------------------------------------------------------------------
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index 440b2ca..3a408c7 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -2458,7 +2458,7 @@ CommitTransaction(void)
 	//AtEOXact_Snapshot(true);
 	pgstat_report_xact_timestamp(0);
 
-	CurrentResourceOwner = NULL;
+	CurrentResourceOwner = GetTopResourceOwner();
 	ResourceOwnerDelete(TopTransactionResourceOwner);
 	s->curTransactionOwner = NULL;
 	CurTransactionResourceOwner = NULL;
@@ -2687,7 +2687,7 @@ PrepareTransaction(void)
 	AtEOXact_HashTables(true);
 	/* don't call AtEOXact_PgStat here */
 
-	CurrentResourceOwner = NULL;
+	CurrentResourceOwner = GetTopResourceOwner();
 	ResourceOwnerDelete(TopTransactionResourceOwner);
 	s->curTransactionOwner = NULL;
 	CurTransactionResourceOwner = NULL;
@@ -2933,7 +2933,7 @@ CleanupTransaction(void)
 	 */
 	AtCleanup_Portals();		/* now safe to release portal memory */
 
-	CurrentResourceOwner = NULL;	/* and resource owner */
+	CurrentResourceOwner = GetTopResourceOwner();	/* and resource owner */
 	if (TopTransactionResourceOwner)
 		ResourceOwnerDelete(TopTransactionResourceOwner);
 	s->curTransactionOwner = NULL;

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b8e6afd1/src/backend/access/transam/xlog.c
----------------------------------------------------------------------
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index eeef04e..0a0f73c 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -6561,7 +6561,7 @@ StartupXLOG(void)
 					(errmsg("redo done at %X/%X",
 							ReadRecPtr.xlogid, ReadRecPtr.xrecoff)));
 
-			CurrentResourceOwner = NULL;
+			CurrentResourceOwner = GetTopResourceOwner();
 
 			InRedo = false;
 
@@ -7574,7 +7574,7 @@ XLogStandbyRecoverRange(XLogRecPtr *redoCheckpointLoc, CheckPoint *redoCheckPoin
 	 */
 	FlushBufferPool();
 
-	CurrentResourceOwner = NULL;
+	CurrentResourceOwner = GetTopResourceOwner();
 
 	InRedo = false;
 	InRecovery = false;

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b8e6afd1/src/backend/utils/init/flatfiles.c
----------------------------------------------------------------------
diff --git a/src/backend/utils/init/flatfiles.c b/src/backend/utils/init/flatfiles.c
index 79f5ec3..d916293 100644
--- a/src/backend/utils/init/flatfiles.c
+++ b/src/backend/utils/init/flatfiles.c
@@ -1107,7 +1107,7 @@ BuildFlatFiles(bool database_only)
 		write_auth_time_file(rel_authid, rel_authtime);
 	}
 
-	CurrentResourceOwner = NULL;
+	CurrentResourceOwner = GetTopResourceOwner();
 	ResourceOwnerDelete(owner);
 
 	XLogCloseRelationCache();

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b8e6afd1/src/backend/utils/resowner/resowner.c
----------------------------------------------------------------------
diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c
index b45c92c..055280d 100644
--- a/src/backend/utils/resowner/resowner.c
+++ b/src/backend/utils/resowner/resowner.c
@@ -70,6 +70,7 @@ typedef struct ResourceOwnerData
  *	  GLOBAL MEMORY															 *
  *****************************************************************************/
 
+static ResourceOwner TopResourceOwner = NULL;
 ResourceOwner CurrentResourceOwner = NULL;
 ResourceOwner CurTransactionResourceOwner = NULL;
 ResourceOwner TopTransactionResourceOwner = NULL;
@@ -94,22 +95,21 @@ static void ResourceOwnerReleaseInternal(ResourceOwner owner,
 							 bool isTopLevel);
 static void PrintRelCacheLeakWarning(Relation rel);
 static void PrintTupleDescLeakWarning(TupleDesc tupdesc);
-
-
+static ResourceOwner ResourceOwnerCreateInternal(ResourceOwner parent,
+					const char *name);
 /*****************************************************************************
  *	  EXPORTED ROUTINES														 *
  *****************************************************************************/
 
-
 /*
- * ResourceOwnerCreate
- *		Create an empty ResourceOwner.
+ * ResourceOwnerCreateInternal
+ *		Create an empty ResourceOwner. This is only internal usage.
  *
  * All ResourceOwner objects are kept in TopMemoryContext, since they should
  * only be freed explicitly.
  */
-ResourceOwner
-ResourceOwnerCreate(ResourceOwner parent, const char *name)
+static ResourceOwner
+ResourceOwnerCreateInternal(ResourceOwner parent, const char *name)
 {
 	ResourceOwner owner;
 
@@ -126,7 +126,35 @@ ResourceOwnerCreate(ResourceOwner parent, const char *name)
 
 	return owner;
 }
+/*
+ * GetTopResourceOwner
+ *		Get a singleton TopResourceOwner, if it doesn't exist, create a new ResourceOwner.
+ *
+ * It will register callback fucntion to delete it for process exits when it is created,
+ * so that we did not need to call it in every process.
+ */
+ResourceOwner
+GetTopResourceOwner()
+{
+	if(TopResourceOwner == NULL){
+	    TopResourceOwner = ResourceOwnerCreateInternal(NULL, "Default TopResourceOwner");
+	    /* Register to automatically delete TopResourceOwner when process exit */
+	    on_proc_exit(DeleteTopResourceOwner, 0);
+	}
 
+	return TopResourceOwner;
+}
+/*
+ * ResourceOwnerCreate
+ *
+ * If parent is NULL, we will set parent to TopResourceOwner, so that all resource owner can be
+ * traced by only one TopResourceOwner.
+ */
+ResourceOwner
+ResourceOwnerCreate(ResourceOwner parent, const char *name)
+{
+	return ResourceOwnerCreateInternal(parent == NULL?GetTopResourceOwner():parent, name);
+}
 /*
  * ResourceOwnerRelease
  *		Release all resources owned by a ResourceOwner and its descendants,
@@ -285,7 +313,7 @@ ResourceOwnerReleaseInternal(ResourceOwner owner,
 		{
 			if (isCommit)
 				PrintCatCacheLeakWarning(owner->catrefs[owner->ncatrefs - 1],
-                                         owner->name);
+	                                     owner->name);
 			ReleaseCatCache(owner->catrefs[owner->ncatrefs - 1]);
 		}
 		/* Ditto for catcache lists */
@@ -293,7 +321,7 @@ ResourceOwnerReleaseInternal(ResourceOwner owner,
 		{
 			if (isCommit)
 				PrintCatCacheListLeakWarning(owner->catlistrefs[owner->ncatlistrefs - 1],
-                                             owner->name);
+	                                         owner->name);
 			ReleaseCatCacheList(owner->catlistrefs[owner->ncatlistrefs - 1]);
 		}
 		/* Ditto for tupdesc references */
@@ -364,6 +392,26 @@ ResourceOwnerDelete(ResourceOwner owner)
 }
 
 /*
+ * DeleteTopResourceOwner
+ *		Firstly release all resource, then Delete TopResourceOwner object and its descendants.
+ *
+ * This function can be called serveral times because it need to be registerred in a callback
+ * function, which may occurs serveral times.
+ */
+void
+DeleteTopResourceOwner()
+{
+	if(TopResourceOwner == NULL)
+	    return;
+
+	ResourceOwnerRelease(TopResourceOwner,
+	        RESOURCE_RELEASE_BEFORE_LOCKS,
+	        false, true);
+	CurrentResourceOwner = NULL;
+	ResourceOwnerDelete(TopResourceOwner);
+	TopResourceOwner = NULL;
+}
+/*
  * Fetch parent of a ResourceOwner (returns NULL if top-level owner)
  */
 ResourceOwner

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b8e6afd1/src/include/utils/resowner.h
----------------------------------------------------------------------
diff --git a/src/include/utils/resowner.h b/src/include/utils/resowner.h
index 2cd615c..382cf7d 100644
--- a/src/include/utils/resowner.h
+++ b/src/include/utils/resowner.h
@@ -67,6 +67,7 @@ typedef void (*ResourceReleaseCallback) (ResourceReleasePhase phase,
  */
 
 /* generic routines */
+extern ResourceOwner GetTopResourceOwner();
 extern ResourceOwner ResourceOwnerCreate(ResourceOwner parent,
 					const char *name);
 extern void ResourceOwnerRelease(ResourceOwner owner,
@@ -74,6 +75,7 @@ extern void ResourceOwnerRelease(ResourceOwner owner,
 					 bool isCommit,
 					 bool isTopLevel);
 extern void ResourceOwnerDelete(ResourceOwner owner);
+extern void DeleteTopResourceOwner();
 extern ResourceOwner ResourceOwnerGetParent(ResourceOwner owner);
 extern void ResourceOwnerNewParent(ResourceOwner owner,
 					   ResourceOwner newparent);