diff --git a/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/ProcBuilder.scala b/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/ProcBuilder.scala index a5ffeec22..704f606db 100644 --- a/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/ProcBuilder.scala +++ b/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/ProcBuilder.scala @@ -148,14 +148,14 @@ trait ProcBuilder { val maxErrorSize = conf.get(KyuubiConf.ENGINE_ERROR_MAX_SIZE) while (true) { if (reader.ready()) { - var line: String = reader.readLine - if (containsIgnoreCase(line, "Exception:") && + var line: String = reader.readLine.trim + if (containsException(line) && !line.contains("at ") && !line.startsWith("Caused by:")) { val sb = new StringBuilder(line) error = KyuubiSQLException(sb.toString() + s"\n See more: $engineLog") - line = reader.readLine() + line = reader.readLine().trim while (sb.length < maxErrorSize && line != null && - (containsIgnoreCase(line, "Exception:") || + (containsException(line) || line.startsWith("\tat ") || line.startsWith("Caused by: "))) { sb.append("\n" + line) @@ -211,6 +211,9 @@ trait ProcBuilder { case other => other } } + + private def containsException(log: String): Boolean = + containsIgnoreCase(log, "Exception:") || containsIgnoreCase(log, "Exception in thread") } object ProcBuilder extends Logging { diff --git a/kyuubi-server/src/test/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilderSuite.scala b/kyuubi-server/src/test/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilderSuite.scala index 79fb21f96..128f5ab2e 100644 --- a/kyuubi-server/src/test/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilderSuite.scala +++ b/kyuubi-server/src/test/scala/org/apache/kyuubi/engine/spark/SparkProcessBuilderSuite.scala @@ -94,6 +94,16 @@ class SparkProcessBuilderSuite extends KerberizedTestHelper { assert(error1.getMessage.contains("See more: ")) assert(!error1.getMessage.contains(msg), "stack trace shall be truncated") } + + val pb3 = + new SparkProcessBuilder("kentyao", conf.set("spark.kerberos.principal", testPrincipal)) + pb3.start + eventually(timeout(90.seconds), interval(500.milliseconds)) { + val error1 = pb3.getError + assert(!error1.getMessage.contains("Failed to detect the root cause")) + assert(error1.getMessage.contains("See more: ")) + assert(error1.getMessage.contains("Exception in thread")) + } } test("proxy user or keytab") {