From 5374398050f3fc5ac7ddc4239c6d3d4b29bd7525 Mon Sep 17 00:00:00 2001 From: Kent Yao Date: Fri, 27 Nov 2020 22:20:51 +0800 Subject: [PATCH] Stringlify exception for better client debugging --- .../kyuubi/engine/spark/operation/SparkOperation.scala | 5 +++-- .../engine/spark/operation/SparkOperationSuite.scala | 6 ++---- .../scala/org/apache/kyuubi/KyuubiSQLException.scala | 9 +++++++++ .../scala/org/apache/kyuubi/operation/JDBCTests.scala | 6 ++---- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/operation/SparkOperation.scala b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/operation/SparkOperation.scala index 3dfcb997e..226127318 100644 --- a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/operation/SparkOperation.scala +++ b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/operation/SparkOperation.scala @@ -88,11 +88,12 @@ abstract class SparkOperation(spark: SparkSession, opType: OperationType, sessio case e: Exception => if (cancel) spark.sparkContext.cancelJobGroup(statementId) state.synchronized { + val errMsg = KyuubiSQLException.stringifyException(e) if (isTerminalState(state)) { - warn(s"Ignore exception in terminal state with $statementId: $e") + warn(s"Ignore exception in terminal state with $statementId: $errMsg") } else { setState(OperationState.ERROR) - val ke = KyuubiSQLException(s"Error operating $opType: ${e.getMessage}", e) + val ke = KyuubiSQLException(s"Error operating $opType: $errMsg", e) setOperationException(ke) throw ke } diff --git a/externals/kyuubi-spark-sql-engine/src/test/scala/org/apache/kyuubi/engine/spark/operation/SparkOperationSuite.scala b/externals/kyuubi-spark-sql-engine/src/test/scala/org/apache/kyuubi/engine/spark/operation/SparkOperationSuite.scala index 30e32d665..481f3c2bd 100644 --- a/externals/kyuubi-spark-sql-engine/src/test/scala/org/apache/kyuubi/engine/spark/operation/SparkOperationSuite.scala +++ b/externals/kyuubi-spark-sql-engine/src/test/scala/org/apache/kyuubi/engine/spark/operation/SparkOperationSuite.scala @@ -138,12 +138,10 @@ class SparkOperationSuite extends WithSparkSQLEngine { } val e = intercept[HiveSQLException](metaData.getColumns(null, "*", null, null)) - assert(e.getCause.getMessage === "org.apache.kyuubi.KyuubiSQLException:" + - "Error operating GET_COLUMNS: Dangling meta character '*' near index 0\n*\n^") + assert(e.getCause.getMessage contains "Dangling meta character '*' near index 0\n*\n^") val e1 = intercept[HiveSQLException](metaData.getColumns(null, null, null, "*")) - assert(e1.getCause.getMessage === "org.apache.kyuubi.KyuubiSQLException:" + - "Error operating GET_COLUMNS: Dangling meta character '*' near index 0\n*\n^") + assert(e1.getCause.getMessage contains "Dangling meta character '*' near index 0\n*\n^") } } diff --git a/kyuubi-common/src/main/scala/org/apache/kyuubi/KyuubiSQLException.scala b/kyuubi-common/src/main/scala/org/apache/kyuubi/KyuubiSQLException.scala index 148181ce4..2c88fc35a 100644 --- a/kyuubi-common/src/main/scala/org/apache/kyuubi/KyuubiSQLException.scala +++ b/kyuubi-common/src/main/scala/org/apache/kyuubi/KyuubiSQLException.scala @@ -17,6 +17,7 @@ package org.apache.kyuubi +import java.io.{PrintWriter, StringWriter} import java.sql.SQLException import scala.collection.JavaConverters._ @@ -147,4 +148,12 @@ object KyuubiSQLException { ex } + def stringifyException(e: Throwable): String = { + val stm = new StringWriter + val wrt = new PrintWriter(stm) + e.printStackTrace(wrt) + wrt.close() + stm.toString + } + } diff --git a/kyuubi-common/src/test/scala/org/apache/kyuubi/operation/JDBCTests.scala b/kyuubi-common/src/test/scala/org/apache/kyuubi/operation/JDBCTests.scala index 8a4c2f353..66bc13415 100644 --- a/kyuubi-common/src/test/scala/org/apache/kyuubi/operation/JDBCTests.scala +++ b/kyuubi-common/src/test/scala/org/apache/kyuubi/operation/JDBCTests.scala @@ -122,8 +122,7 @@ trait JDBCTests extends KyuubiFunSuite { checkResult(metaData.getSchemas(null, "db_not_exist"), Seq.empty) val e = intercept[HiveSQLException](metaData.getSchemas(null, "*")) - assert(e.getCause.getMessage === "org.apache.kyuubi.KyuubiSQLException:" + - "Error operating GET_SCHEMAS: Dangling meta character '*' near index 0\n*\n^") + assert(e.getCause.getMessage contains "Dangling meta character '*' near index 0\n*\n^") } } @@ -185,8 +184,7 @@ trait JDBCTests extends KyuubiFunSuite { } val e = intercept[HiveSQLException](metaData.getTables(null, "*", null, null)) - assert(e.getCause.getMessage === "org.apache.kyuubi.KyuubiSQLException:" + - "Error operating GET_TABLES: Dangling meta character '*' near index 0\n*\n^") + assert(e.getCause.getMessage contains "Dangling meta character '*' near index 0\n*\n^") } }