[ https://issues.apache.org/jira/browse/ZOOKEEPER-1683?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13628652#comment-13628652 ]
Shevek commented on ZOOKEEPER-1683: ----------------------------------- volatile causes a write-read pair of the variable to form a transitive happen-before relationship in the JMM. It does not solve the race - we (A) could check sockKey != null, then the close() (B) could clear it, then we (A) indirect on it, and we have an ABA race. Personally, I would probably change testableCloseSocket to load sockKey into a temporary local, then test for nullness of the local before indirecting on that. No synchronization needed, and pointer assignment is always atomic, even in 64-bit JVMs. > ZooKeeper client NPE when updating server list on disconnected client > --------------------------------------------------------------------- > > Key: ZOOKEEPER-1683 > URL: https://issues.apache.org/jira/browse/ZOOKEEPER-1683 > Project: ZooKeeper > Issue Type: Bug > Components: java client > Affects Versions: 3.5.0 > Reporter: Shevek > Assignee: Alexander Shraer > Fix For: 3.5.0 > > Attachments: ZOOKEEPER-1683.patch, ZOOKEEPER-1683-ver1.patch > > > 2013-04-04 22:16:15,872 ERROR [pool-4-thread-1] > com.netflix.curator.ConnectionState.getZooKeeper (ConnectionState.java:84) - > Background exception caught > java.lang.NullPointerException > at > org.apache.zookeeper.client.StaticHostProvider.updateServerList(StaticHostProvider.java:161) > ~[zookeeper-3.5.0.jar:3.5.0--1] > at > org.apache.zookeeper.ZooKeeper.updateServerList(ZooKeeper.java:183) > ~[zookeeper-3.5.0.jar:3.5.0--1] > at > com.netflix.curator.HandleHolder$1$1.setConnectionString(HandleHolder.java:121) > ~[curator-client-1.3.5-SNAPSHOT.jar:?] > The duff code is this: > ClientCnxnSocket clientCnxnSocket = cnxn.sendThread.getClientCnxnSocket(); > InetSocketAddress currentHost = (InetSocketAddress) > clientCnxnSocket.getRemoteSocketAddress(); > boolean reconfigMode = hostProvider.updateServerList(serverAddresses, > currentHost); > Now, currentHost might be null, if we're not yet connected. But > StaticHostProvider.updateServerList indirects on it unconditionally. > This would be caught by findbugs. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira