From f479c99c616c4a62956e7175e57005ac1c9fc4e9 Mon Sep 17 00:00:00 2001 From: Hossein Date: Tue, 28 Jul 2015 18:05:51 -0700 Subject: [PATCH 1/5] Wrting exception cause message in JVM --- .../scala/org/apache/spark/api/r/RBackendHandler.scala | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/main/scala/org/apache/spark/api/r/RBackendHandler.scala b/core/src/main/scala/org/apache/spark/api/r/RBackendHandler.scala index a5de10fe89c42..10a60c3f4e4c1 100644 --- a/core/src/main/scala/org/apache/spark/api/r/RBackendHandler.scala +++ b/core/src/main/scala/org/apache/spark/api/r/RBackendHandler.scala @@ -69,8 +69,11 @@ private[r] class RBackendHandler(server: RBackend) case e: Exception => logError(s"Removing $objId failed", e) writeInt(dos, -1) + writeString(dos, s"Removing $objId failed: ${e.getMessage}") } - case _ => dos.writeInt(-1) + case _ => + dos.writeInt(-1) + writeString(dos, "Unknown error") } } else { handleMethodCall(isStatic, objId, methodName, numArgs, dis, dos) @@ -148,6 +151,9 @@ private[r] class RBackendHandler(server: RBackend) case e: Exception => logError(s"$methodName on $objId failed", e) writeInt(dos, -1) + // Writing the error message of the cause for the exception. This will be returned + // to user in the R process. + writeString(dos, e.getCause.getMessage) } } From 2af75d5e9e4dfbe1c6a629ff408b6a9998b2b133 Mon Sep 17 00:00:00 2001 From: Hossein Date: Tue, 28 Jul 2015 18:06:21 -0700 Subject: [PATCH 2/5] Reading error message in case of failure and stoping with that message --- R/pkg/R/backend.R | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/R/pkg/R/backend.R b/R/pkg/R/backend.R index 2fb6fae55f28c..49162838b8d1a 100644 --- a/R/pkg/R/backend.R +++ b/R/pkg/R/backend.R @@ -110,6 +110,8 @@ invokeJava <- function(isStatic, objId, methodName, ...) { # TODO: check the status code to output error information returnStatus <- readInt(conn) - stopifnot(returnStatus == 0) + if (returnStatus != 0) { + stop(readString(conn)) + } readObject(conn) } From 5cf17f0305ed27e45161fec6f62c613f319b9b5b Mon Sep 17 00:00:00 2001 From: Hossein Date: Tue, 28 Jul 2015 18:06:59 -0700 Subject: [PATCH 3/5] Adding unit test for error messages from SQLContext --- R/pkg/inst/tests/test_sparkSQL.R | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/R/pkg/inst/tests/test_sparkSQL.R b/R/pkg/inst/tests/test_sparkSQL.R index 62fe48a5d6c7b..756d47fa521ec 100644 --- a/R/pkg/inst/tests/test_sparkSQL.R +++ b/R/pkg/inst/tests/test_sparkSQL.R @@ -1000,6 +1000,11 @@ test_that("crosstab() on a DataFrame", { expect_identical(expected, ordered) }) +test_that("SQL error message is returned from JVM", { + retError <- tryCatch(sql(sqlContext, "select * from blah"), error = function(e) e) + expect_equal(grepl("Table Not Found: blah", retError), TRUE) +}) + unlink(parquetPath) unlink(jsonPath) unlink(jsonPathNa) From 4a8005c33604f5e3a73653c047ec8d401edb6df8 Mon Sep 17 00:00:00 2001 From: Hossein Date: Wed, 29 Jul 2015 18:05:39 -0700 Subject: [PATCH 4/5] Returning stack track of causing exception from RBackendHandler --- .../main/scala/org/apache/spark/api/r/RBackendHandler.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/scala/org/apache/spark/api/r/RBackendHandler.scala b/core/src/main/scala/org/apache/spark/api/r/RBackendHandler.scala index 10a60c3f4e4c1..83b9aa49b37a1 100644 --- a/core/src/main/scala/org/apache/spark/api/r/RBackendHandler.scala +++ b/core/src/main/scala/org/apache/spark/api/r/RBackendHandler.scala @@ -73,7 +73,7 @@ private[r] class RBackendHandler(server: RBackend) } case _ => dos.writeInt(-1) - writeString(dos, "Unknown error") + writeString(dos, s"Error: unknown method $methodName") } } else { handleMethodCall(isStatic, objId, methodName, numArgs, dis, dos) @@ -153,7 +153,7 @@ private[r] class RBackendHandler(server: RBackend) writeInt(dos, -1) // Writing the error message of the cause for the exception. This will be returned // to user in the R process. - writeString(dos, e.getCause.getMessage) + writeString(dos, Utils.exceptionString(e.getCause)) } } From 4f643c9aea187c4876b895d6f0a92bfff93fd818 Mon Sep 17 00:00:00 2001 From: Hossein Date: Thu, 30 Jul 2015 11:53:28 -0700 Subject: [PATCH 5/5] Not logging exceptions in RBackendHandler --- .../src/main/scala/org/apache/spark/api/r/RBackendHandler.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/scala/org/apache/spark/api/r/RBackendHandler.scala b/core/src/main/scala/org/apache/spark/api/r/RBackendHandler.scala index 83b9aa49b37a1..14dac4ed28ce3 100644 --- a/core/src/main/scala/org/apache/spark/api/r/RBackendHandler.scala +++ b/core/src/main/scala/org/apache/spark/api/r/RBackendHandler.scala @@ -149,7 +149,7 @@ private[r] class RBackendHandler(server: RBackend) } } catch { case e: Exception => - logError(s"$methodName on $objId failed", e) + logError(s"$methodName on $objId failed") writeInt(dos, -1) // Writing the error message of the cause for the exception. This will be returned // to user in the R process.