[
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)