ZEPPELIN-3239. unicode characters in an iPython paragraph makes Spark interpreter irrsponsive

This commit is contained in:
Jeff Zhang 2018-02-20 16:58:47 +08:00
parent bf923dc13c
commit 70c8b4cc7e
2 changed files with 19 additions and 5 deletions

View file

@ -27,7 +27,6 @@ import ipython_pb2_grpc
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
is_py2 = sys.version[0] == '2'
if is_py2:
import Queue as queue
@ -51,7 +50,7 @@ class IPython(ipython_pb2_grpc.IPythonServicer):
def execute(self, request, context):
print("execute code:\n")
print(request.code)
print(request.code.encode('utf-8'))
sys.stdout.flush()
stdout_queue = queue.Queue(maxsize = 10)
stderr_queue = queue.Queue(maxsize = 10)

View file

@ -81,18 +81,33 @@ public class IPythonInterpreterTest {
InterpreterResult result = interpreter.interpret("from __future__ import print_function", getInterpreterContext());
assertEquals(InterpreterResult.Code.SUCCESS, result.code());
result = interpreter.interpret("import sys\nprint(sys.version_info)", getInterpreterContext());
InterpreterContext context = getInterpreterContext();
result = interpreter.interpret("import sys\nprint(sys.version[0])", context);
assertEquals(InterpreterResult.Code.SUCCESS, result.code());
Thread.sleep(100);
List<InterpreterResultMessage> interpreterResultMessages = context.out.getInterpreterResultMessages();
assertEquals(1, interpreterResultMessages.size());
boolean isPython2 = interpreterResultMessages.get(0).getData().equals("2\n");
// single output without print
InterpreterContext context = getInterpreterContext();
context = getInterpreterContext();
result = interpreter.interpret("'hello world'", context);
Thread.sleep(100);
assertEquals(InterpreterResult.Code.SUCCESS, result.code());
List<InterpreterResultMessage> interpreterResultMessages = context.out.getInterpreterResultMessages();
interpreterResultMessages = context.out.getInterpreterResultMessages();
assertEquals(1, interpreterResultMessages.size());
assertEquals("'hello world'", interpreterResultMessages.get(0).getData());
// unicode
context = getInterpreterContext();
result = interpreter.interpret("print(u'你好')", context);
Thread.sleep(100);
assertEquals(InterpreterResult.Code.SUCCESS, result.code());
interpreterResultMessages = context.out.getInterpreterResultMessages();
assertEquals(1, interpreterResultMessages.size());
assertEquals("你好\n", interpreterResultMessages.get(0).getData());
// only the last statement is printed
context = getInterpreterContext();
result = interpreter.interpret("'hello world'\n'hello world2'", context);