[ 
https://issues.apache.org/jira/browse/ZOOKEEPER-2091?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14244659#comment-14244659
 ] 

Camille Fournier commented on ZOOKEEPER-2091:
---------------------------------------------

I agree that it seems like only sending the full packet in 
ClientCnxnSocketNIO#SendPacket() would fix this issue. We don't do this in doIO 
presumably because we might only send part of the buffer, then allow another 
read to come in before we send the rest of the packet so as not to block on the 
complete send of the pending outgoing packet? Is that correct for implementing 
the nonblocking socket, can someone verify?

> Possible logic error in ClientCnxnSocketNIO
> -------------------------------------------
>
>                 Key: ZOOKEEPER-2091
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2091
>             Project: ZooKeeper
>          Issue Type: Bug
>          Components: java client
>    Affects Versions: 3.4.6
>            Reporter: Cheng
>            Assignee: Rakesh R
>             Fix For: 3.5.1
>
>         Attachments: ZOOKEEPER-2091.patch
>
>
> When SASL authentication is enabled, the ZooKeeper client will finally call 
> ClientCnxnSocketNIO#sendPacket(Packet p) to send a packet to server:
> @Override
> void sendPacket(Packet p) throws IOException {
>     SocketChannel sock = (SocketChannel) sockKey.channel();
>     if (sock == null) {
>         throw new IOException("Socket is null!");
>     }
>     p.createBB();
>     ByteBuffer pbb = p.bb;
>     sock.write(pbb);
> }
> One problem I can see is that the sock is non-blocking, so when the sock's 
> output buffer is full(theoretically), only part of the Packet is sent out and 
> the communication will break.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to