hi, moon:
Recently, we often encounter a same problem when open some web url (ex.
localhost:8080) to access zeppelin server, there are no note show in the
web page, and refresh the web page did't work. Then we find the error info
in zeppelin logs:

--------------------------------------------------------------------------------------------------------------------------------
INFO [2015-09-22 10:05:43,360] ({qtp489396160-1328}
NotebookServer.java[onMessage]:101) - RECEIVE << PING
INFO [2015-09-22 10:05:43,360] ({qtp489396160-1328}
NotebookServer.java[onMessage]:101) - RECEIVE << PING
INFO [2015-09-22 10:05:43,360] ({qtp489396160-1328}
NotebookServer.java[onMessage]:101) - RECEIVE << PING
INFO [2015-09-22 10:05:43,590] ({qtp489396160-1329}
NotebookServer.java[onOpen]:89) - New connection from xxx : 49725
INFO [2015-09-22 10:05:43,619] ({qtp489396160-1329}
NotebookServer.java[onMessage]:101) - RECEIVE << LIST_NOTES
ERROR [2015-09-22 10:05:43,620] ({qtp489396160-1329}
NotebookServer.java[broadcastAll]:270) - socket error
java.io.IOException: closedOut 1001:null
at
org.eclipse.jetty.websocket.WebSocketConnectionRFC6455$WSFrameConnection.sendMessage(WebSocketConnectionRFC6455.java:437)
at org.apache.zeppelin.socket.NotebookSocket.send(NotebookSocket.java:69)
at
org.apache.zeppelin.socket.NotebookServer.broadcastAll(NotebookServer.java:268)
at
org.apache.zeppelin.socket.NotebookServer.broadcastNoteList(NotebookServer.java:302)
at
org.apache.zeppelin.socket.NotebookServer.onMessage(NotebookServer.java:105)
at
org.apache.zeppelin.socket.NotebookSocket.onMessage(NotebookSocket.java:56)
at
org.eclipse.jetty.websocket.WebSocketConnectionRFC6455$WSFrameHandler.onFrame(WebSocketConnectionRFC6455.java:835)
at
org.eclipse.jetty.websocket.WebSocketParserRFC6455.parseNext(WebSocketParserRFC6455.java:349)
at
org.eclipse.jetty.websocket.WebSocketConnectionRFC6455.handle(WebSocketConnectionRFC6455.java:225)
at
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
at
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:745)
INFO [2015-09-22 10:05:43,698] ({qtp489396160-1328}
NotebookServer.java[onMessage]:101) - RECEIVE << PING
INFO [2015-09-22 10:05:43,698] ({qtp489396160-1328}
NotebookServer.java[onMessage]:101) - RECEIVE << PING
INFO [2015-09-22 10:05:43,698] ({qtp489396160-1328}
NotebookServer.java[onMessage]:101) - RECEIVE << PING
INFO [2015-09-22 10:05:43,698] ({qtp489396160-1328}
NotebookServer.java[onMessage]:101) - RECEIVE << PING
-----------------------------------------------------------------------------------------------------------

in the NotebookServer.java we find that when we access the zeppelin web, it
will call broadcastNoteList(), and then broadcastNoteList will call
broadcastAll():
{noformat}
  private void broadcastAll(Message m) {
    synchronized (connectedSockets) {
      for (NotebookSocket conn : connectedSockets) {
        try {
          conn.send(serializeMessage(m));
        } catch (IOException e) {
          LOG.error("socket error", e);
        }
      }
    }
  }

------------------------------------------------------------------------------------------------------------------------
the broadcaseAll function will call conn.send(serializeMessage(m))  one by
one to send message, and if one conn has some problem say: closed or send
message timeout, it will block the other socket to get the message, so some
zeppelin web url can't show any note in home page.
I think it's better to:
(1)judge if the conn is open before call conn.send(serializeMessage(m));
(2)call conn.send(serializeMessage(m)) concurrently

Reply via email to