Sylvain Wallez created ZOOKEEPER-3652:
-----------------------------------------

             Summary: Improper synchronization in ClientCnxn
                 Key: ZOOKEEPER-3652
                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-3652
             Project: ZooKeeper
          Issue Type: Bug
          Components: java client
    Affects Versions: 3.5.6
            Reporter: Sylvain Wallez


ZOOKEEPER-2111 introduced {{synchronized(state)}} statements in {{ClientCnxn}} 
and {{ClientCnxn.SendThread}} to coordinate insertion in {{outgoingQueue}} and 
draining it when the client connection isn't alive.

There are several issues with this approach:
 - the value of the {{state}} field is not stable, meaning we don't always 
synchronize on the same object.
 - the {{state}} field is an enum value, which are global objects. So in an 
application with several ZooKeeper clients connected to different servers, this 
causes some contention between clients.

An easy fix is change those {{synchronized(state)}} statements to 
{{synchronized(outgoingQueue)}} since it is local to each client and is what we 
want to coordinate.

I'll be happy to prepare a PR with the above change if this is deemed to be the 
correct way to fix it.

 

Another issue that makes contention worse is {{ClientCnxnSocketNIO.cleanup()}} 
that is called from within the above synchronized block and contains 
{{Thread.sleep(100)}}. Why is this sleep statement needed, and can we remove it?

 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to