[
https://issues.apache.org/jira/browse/ZOOKEEPER-3652?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17514212#comment-17514212
]
Mohammad Arshad commented on ZOOKEEPER-3652:
--------------------------------------------
Some how wrong version number "3.6.4,3.7.1,3.8.0,3.9.0" got created into the
jira system. I will delete this version number
> 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
> Priority: Major
> Labels: pull-request-available
> Fix For: 3.6.4,3.7.1,3.8.0,3.9.0
>
> Time Spent: 1h 20m
> Remaining Estimate: 0h
>
> 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.20.1#820001)