[
https://issues.apache.org/jira/browse/ZOOKEEPER-737?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Patrick Hunt updated ZOOKEEPER-737:
-----------------------------------
Status: Open (was: Patch Available)
Mahadev, this looks great, a few issues I noticed:
If the pwriter flush/close calls fail for any reason we will not close the
socket. In cleanupWriterSocket I think you should have a try/finally around the
pwriter conditional block. This will ensure that no matter what happens we will
close the socket.
What happens if cancel key fails? Is this really a debug level message? What
would happen if cancel fails but later the socket is explicitly closed (after
command returns)?
+ if (k != null) {
+ try {
+ k.cancel();
+ } catch(Exception e) {
+ LOG.debug("Error cancelling command selection key ", e);
+ }
Are these errors or info messages? Seems like both are LOG.error? (ie we'd
really want to know if this happened)
LOG.info("Error sending data synchronously ", ie);
LOG.info("Error closing a command socket ", e);
> some 4 letter words may fail with netcat (nc)
> ---------------------------------------------
>
> Key: ZOOKEEPER-737
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-737
> Project: Zookeeper
> Issue Type: Bug
> Components: server
> Affects Versions: 3.3.0
> Reporter: Patrick Hunt
> Assignee: Mahadev konar
> Priority: Blocker
> Fix For: 3.3.1, 3.4.0
>
> Attachments: ZOOKEEPER-737.patch, ZOOKEEPER-737.patch,
> ZOOKEEPER-737.patch, ZOOKEEPER-737.patch
>
>
> nc closes the write channel as soon as it's sent it's information, for
> example "echo stat|nc localhost 2181"
> in general this is fine, however the server code will close the socket as
> soon as it receives notice that nc has
> closed it's write channel. if not all the 4 letter word result has been
> written back to the client yet, this will cause
> some or all of the result to be lost - ie the client will not see the full
> result. this was introduced in 3.3.0 as part
> of a change to reduce blocking of the selector by long running 4letter words.
> here's an example of the logs from the server during this
> echo -n stat | nc localhost 2181
> 2010-04-09 21:55:36,124 - INFO
> [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:nioservercnxn$fact...@251] -
> Accepted socket connection from /127.0.0.1:42179
> 2010-04-09 21:55:36,124 - INFO
> [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:nioserverc...@968] - Processing
> stat command from /127.0.0.1:42179
> 2010-04-09 21:55:36,125 - WARN
> [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:nioserverc...@606] -
> EndOfStreamException: Unable to read additional data from client sessionid
> 0x0, likely client has closed socket
> 2010-04-09 21:55:36,125 - INFO
> [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:nioserverc...@1286] - Closed
> socket connection for client /127.0.0.1:42179 (no session established for
> client)
> [ph...@gsbl90850 zookeeper-3.3.0]$ 2010-04-09 21:55:36,126 - ERROR
> [Thread-15:nioserverc...@422] - Unexpected Exception:
> java.nio.channels.CancelledKeyException
> at sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:55)
> at sun.nio.ch.SelectionKeyImpl.interestOps(SelectionKeyImpl.java:59)
> at
> org.apache.zookeeper.server.NIOServerCnxn.sendBuffer(NIOServerCnxn.java:395)
> at
> org.apache.zookeeper.server.NIOServerCnxn$SendBufferWriter.checkFlush(NIOServerCnxn.java:907)
> at
> org.apache.zookeeper.server.NIOServerCnxn$SendBufferWriter.flush(NIOServerCnxn.java:945)
> at java.io.BufferedWriter.flush(BufferedWriter.java:236)
> at java.io.PrintWriter.flush(PrintWriter.java:276)
> at
> org.apache.zookeeper.server.NIOServerCnxn$2.run(NIOServerCnxn.java:1089)
> 2010-04-09 21:55:36,126 - ERROR [Thread-15:nioservercnxn$factor...@82] -
> Thread Thread[Thread-15,5,main] died
> java.nio.channels.CancelledKeyException
> at sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:55)
> at sun.nio.ch.SelectionKeyImpl.interestOps(SelectionKeyImpl.java:64)
> at
> org.apache.zookeeper.server.NIOServerCnxn$SendBufferWriter.wakeup(NIOServerCnxn.java:927)
> at
> org.apache.zookeeper.server.NIOServerCnxn$SendBufferWriter.checkFlush(NIOServerCnxn.java:909)
> at
> org.apache.zookeeper.server.NIOServerCnxn$SendBufferWriter.flush(NIOServerCnxn.java:945)
> at java.io.BufferedWriter.flush(BufferedWriter.java:236)
> at java.io.PrintWriter.flush(PrintWriter.java:276)
> at
> org.apache.zookeeper.server.NIOServerCnxn$2.run(NIOServerCnxn.java:1089)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.