in repl/src/main/scala/org/apache/livy/repl/Session.scala [263:334]
private def executeCode(interp: Option[Interpreter],
executionCount: Int,
code: String): String = {
changeState(SessionState.Busy)
def transitToIdle() = {
val executingLastStatement = executionCount == newStatementId.intValue() - 1
if (_statements.isEmpty || executingLastStatement) {
changeState(SessionState.Idle)
}
}
val resultInJson = interp.map { i =>
try {
i.execute(code) match {
case Interpreter.ExecuteSuccess(data) =>
transitToIdle()
(STATUS -> OK) ~
(EXECUTION_COUNT -> executionCount) ~
(DATA -> data)
case Interpreter.ExecuteIncomplete() =>
transitToIdle()
(STATUS -> ERROR) ~
(EXECUTION_COUNT -> executionCount) ~
(ENAME -> "Error") ~
(EVALUE -> "incomplete statement") ~
(TRACEBACK -> Seq.empty[String])
case Interpreter.ExecuteError(ename, evalue, traceback) =>
transitToIdle()
(STATUS -> ERROR) ~
(EXECUTION_COUNT -> executionCount) ~
(ENAME -> ename) ~
(EVALUE -> evalue) ~
(TRACEBACK -> traceback)
case Interpreter.ExecuteAborted(message) =>
changeState(SessionState.Error())
(STATUS -> ERROR) ~
(EXECUTION_COUNT -> executionCount) ~
(ENAME -> "Error") ~
(EVALUE -> f"Interpreter died:\n$message") ~
(TRACEBACK -> Seq.empty[String])
}
} catch {
case e: Throwable =>
error("Exception when executing code", e)
transitToIdle()
(STATUS -> ERROR) ~
(EXECUTION_COUNT -> executionCount) ~
(ENAME -> f"Internal Error: ${e.getClass.getName}") ~
(EVALUE -> e.getMessage) ~
(TRACEBACK -> Seq.empty[String])
}
}.getOrElse {
transitToIdle()
(STATUS -> ERROR) ~
(EXECUTION_COUNT -> executionCount) ~
(ENAME -> "InterpreterError") ~
(EVALUE -> "Fail to start interpreter") ~
(TRACEBACK -> Seq.empty[String])
}
compact(render(resultInJson))
}