You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@zookeeper.apache.org by "yuemeng (JIRA)" <ji...@apache.org> on 2016/02/25 10:31:18 UTC
[jira] [Commented] (ZOOKEEPER-2375) The synchronize method of
createSaslClient in ZooKeeperSaslClient can't be synchronize
[ https://issues.apache.org/jira/browse/ZOOKEEPER-2375?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15166984#comment-15166984 ]
yuemeng commented on ZOOKEEPER-2375:
------------------------------------
synchronized private SaslClient createSaslClient(final String servicePrincipal,
final String loginContext) throws LoginException {
try {
if (login == null) {
if (LOG.isDebugEnabled()) {
LOG.debug("JAAS loginContext is: " + loginContext);
}
// note that the login object is static: it's shared amongst all zookeeper-related connections.
// createSaslClient() must be declared synchronized so that login is initialized only once.
login = new Login(loginContext, new ClientCallbackHandler(null));
login.startThreadIfNeeded();
}
this synchronize just for lock it's own object,it's can't prevent other ZooKeeperSaslClient instance access static variable login,because of the login object is static,if one ZooKeeperSaslClient instance had new Login but not call the login.startThreadIfNeeded(),at same time,the other ZooKeeperSaslClient instance also new Login object for static variable login,then login.startThreadIfNeeded() will be execute twice for one login object.
> The synchronize method of createSaslClient in ZooKeeperSaslClient can't be synchronize
> --------------------------------------------------------------------------------------
>
> Key: ZOOKEEPER-2375
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2375
> Project: ZooKeeper
> Issue Type: Bug
> Components: java client
> Affects Versions: 3.4.6, 3.4.8, 3.5.0, 3.5.1
> Reporter: yuemeng
> Fix For: 3.5.2
>
>
> If there are exist many ZooKeeperSaslClient instance in one process,each ZooKeeperSaslClient instance will be call synchronize method createSaslClient,But each ZooKeeperSaslClient instance will be lock the current object(that is say ,the synchronize only for lock it's own object) ,but many instances can access the static variable login,the synchronize can't prevent other threads access the static login object,it will be cause more than one ZooKeeperSaslClient instances use the same login object,and login.startThreadIfNeeded() will be called more than one times for same thread object。
> it wll cause problem:
> ERROR | [Executor task launch worker-1-SendThread(fi1:24002)] | Exception while trying to create SASL client: java.lang.IllegalThreadStateException | org.apache.zookeeper.client.ZooKeeperSaslClient.createSaslClient(ZooKeeperSaslClient.java:305)
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)