Repository: incubator-hawq
Updated Branches:
  refs/heads/master 1d914de51 -> 1bbd1e969 (forced update)


HAWQ-1417. Fixed crash when ANALYZE after COPY because of invalid resource owner


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

Branch: refs/heads/master
Commit: 1bbd1e96981306bf721276f1934d44f27e847981
Parents: 8595cdb
Author: Ming LI <[email protected]>
Authored: Tue Mar 28 15:52:02 2017 +0800
Committer: Ming LI <[email protected]>
Committed: Fri Apr 7 14:49:25 2017 +0800

----------------------------------------------------------------------
 src/backend/commands/analyze.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/1bbd1e96/src/backend/commands/analyze.c
----------------------------------------------------------------------
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index 65d9bd3..be1f3f7 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -308,6 +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;
 
        /**
         * Ensure that an ANALYZE is requested.
@@ -477,6 +478,13 @@ 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;
+
+       /**
         *  we use preferred_seg_num as default and
         *  compute target_seg_num based on data size and distributed type
         *  if there is no preferred_seg_num.
@@ -773,6 +781,12 @@ void analyzeStmt(VacuumStmt *stmt, List *relids, int 
preferred_seg_num)
                resource = NULL;
                UnsetActiveQueryResource();
                SetActiveQueryResource(savedResource);
+               
+               ResourceOwnerRelease(owner,
+                               RESOURCE_RELEASE_BEFORE_LOCKS,
+                               false, true);
+               CurrentResourceOwner = oldOwner;
+               ResourceOwnerDelete(owner);
 
                /* Carry on with error handling. */
                PG_RE_THROW();
@@ -787,6 +801,12 @@ void analyzeStmt(VacuumStmt *stmt, List *relids, int 
preferred_seg_num)
        UnsetActiveQueryResource();
        SetActiveQueryResource(savedResource);
 
+       ResourceOwnerRelease(owner,
+            RESOURCE_RELEASE_BEFORE_LOCKS,
+            false, true);
+       CurrentResourceOwner = oldOwner;
+       ResourceOwnerDelete(owner);
+
        if (bUseOwnXacts)
        {
                /**

Reply via email to