You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hawq.apache.org by rl...@apache.org on 2016/10/28 03:53:07 UTC

[04/17] incubator-hawq git commit: HAWQ-1122. Print exception message as warning and abort plan generation.(#920)

HAWQ-1122. Print exception message as warning and abort plan generation.(#920)

This is cherry-picked from greenplum-db/gpdb@36b504e65ef2fe68b13c773df9d80a90ddcc9b55


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

Branch: refs/heads/master
Commit: 783d3ea09b7a991496dbd060396960813c031cfc
Parents: f6b7647
Author: Karthikeyan Jambu Rajaraman <ka...@gmail.com>
Authored: Wed Jul 6 13:53:08 2016 -0700
Committer: rlei <rl...@pivotal.io>
Committed: Fri Oct 28 11:52:20 2016 +0800

----------------------------------------------------------------------
 src/backend/gpopt/CGPOptimizer.cpp    |  6 +++-
 src/backend/gpopt/utils/COptTasks.cpp | 50 ++++++++++++++++++++++++------
 src/include/gpopt/utils/COptTasks.h   |  4 +++
 3 files changed, 50 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/783d3ea0/src/backend/gpopt/CGPOptimizer.cpp
----------------------------------------------------------------------
diff --git a/src/backend/gpopt/CGPOptimizer.cpp b/src/backend/gpopt/CGPOptimizer.cpp
index 4ade344..bcace95 100644
--- a/src/backend/gpopt/CGPOptimizer.cpp
+++ b/src/backend/gpopt/CGPOptimizer.cpp
@@ -77,9 +77,13 @@ CGPOptimizer::PplstmtOptimize
 	}
 	GPOS_CATCH_EX(ex)
 	{
+		if (GPOS_MATCH_EX(ex, gpdxl::ExmaDXL, gpdxl::ExmiWarningAsError))
+		{
+		  elog(ERROR, "PQO unable to generate plan, please see the above message for details.");
+		}
 		if (GPOS_MATCH_EX(ex, gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError))
 		{
-		  elog(ERROR, "GPDB exception. Aborting GPORCA plan generation.");
+		  elog(ERROR, "GPDB exception. Aborting PQO plan generation.");
 		}
 	}
 	GPOS_CATCH_END;

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/783d3ea0/src/backend/gpopt/utils/COptTasks.cpp
----------------------------------------------------------------------
diff --git a/src/backend/gpopt/utils/COptTasks.cpp b/src/backend/gpopt/utils/COptTasks.cpp
index 58085b8..52ef8b5 100644
--- a/src/backend/gpopt/utils/COptTasks.cpp
+++ b/src/backend/gpopt/utils/COptTasks.cpp
@@ -50,6 +50,7 @@
 #include "utils/guc.h"
 
 #include "gpos/base.h"
+#include "gpos/error/CException.h"
 #undef setstate
 
 #include "gpos/_api.h"
@@ -178,6 +179,37 @@ COptTasks::SOptContext::SOptContext()
 	m_szErrorMsg(NULL)
 {}
 
+//---------------------------------------------------------------------------
+//	@function:
+//		COptTasks::SOptContext::HandleError
+//
+//	@doc:
+//		If there is an error print as warning and throw GPOS_EXCEPTION to abort
+//		plan generation. Calling elog::ERROR will result in longjump and hence
+//		a memory leak.
+//---------------------------------------------------------------------------
+void
+COptTasks::SOptContext::HandleError
+	(
+	BOOL *pfUnexpectedFailure
+	)
+{
+	BOOL bhasError = false;
+	if (NULL != m_szErrorMsg)
+	{
+		bhasError = true;
+		elog(WARNING, "%s", m_szErrorMsg);
+	}
+	*pfUnexpectedFailure = m_fUnexpectedFailure;
+
+	// clean up context
+	Free(epinQuery, epinPlStmt);
+	if (bhasError)
+	{
+		GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiWarningAsError);
+	}
+}
+
 
 //---------------------------------------------------------------------------
 //	@function:
@@ -1611,17 +1643,17 @@ COptTasks::PplstmtOptimize
 	SOptContext octx;
 	octx.m_pquery = pquery;
 	octx.m_fGeneratePlStmt= true;
-	Execute(&PvOptimizeTask, &octx);
-
-	if (NULL != octx.m_szErrorMsg)
+	GPOS_TRY
 	{
-		elog(ERROR, octx.m_szErrorMsg);
+		Execute(&PvOptimizeTask, &octx);
 	}
-	*pfUnexpectedFailure = octx.m_fUnexpectedFailure;
-
-	// clean up context
-	octx.Free(octx.epinQuery, octx.epinPlStmt);
-
+	GPOS_CATCH_EX(ex)
+	{
+		octx.HandleError(pfUnexpectedFailure);
+		GPOS_RETHROW(ex);
+	}
+	GPOS_CATCH_END;
+	octx.HandleError(pfUnexpectedFailure);
 	return octx.m_pplstmt;
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/783d3ea0/src/include/gpopt/utils/COptTasks.h
----------------------------------------------------------------------
diff --git a/src/include/gpopt/utils/COptTasks.h b/src/include/gpopt/utils/COptTasks.h
index 580ab1d..fe24475 100644
--- a/src/include/gpopt/utils/COptTasks.h
+++ b/src/include/gpopt/utils/COptTasks.h
@@ -114,6 +114,10 @@ class COptTasks
 			// ctor
 			SOptContext();
 
+			// If there is an error print as warning and throw exception to abort
+			// plan generation
+			void HandleError(BOOL *pfUnexpectedFailure);
+
 			// free all members except input and output pointers
 			void Free(EPin epinInput, EPin epinOutput);