qiaoqingjie created ZOOKEEPER-1739:
--------------------------------------
Summary: thread safe bug in FastLeaderElection: instance of
WorkerSender is not safe published, WorkerSender thread may see that
WorkerSender.manager is the default value null
Key: ZOOKEEPER-1739
URL: https://issues.apache.org/jira/browse/ZOOKEEPER-1739
Project: ZooKeeper
Issue Type: Bug
Components: leaderElection
Affects Versions: 3.4.5
Reporter: qiaoqingjie
Priority: Minor
I am reading the trunk source code recently and find a thread-safe problem, but
i'm not quite sure.
in FastLeaderElection:
class WorkerSender implements Runnable {
volatile boolean stop;
QuorumCnxManager manager;
WorkerSender(QuorumCnxManager manager){
this.stop = false;
this.manager = manager;
}
public void run() {
...
}
}
...
Messenger(QuorumCnxManager manager) {
this.ws = new WorkerSender(manager);
Thread t = new Thread(this.ws,
"WorkerSender[myid=" + self.getId() + "]");
t.setDaemon(true);
t.start();
this.wr = new WorkerReceiver(manager);
t = new Thread(this.wr,
"WorkerReceiver[myid=" + self.getId() + "]");
t.setDaemon(true);
t.start();
}
...
The instance of WorkerSender is constructed in main thread, and its field
manager is assigned , and it is used in another thread. The later thread may
see that WorkerSender.manager is the default value null. The solution may be:
(1) change
WorkerSender(QuorumCnxManager manager){
this.stop = false;
this.manager = manager;
}
to
WorkerSender(QuorumCnxManager manager){
this.manager = manager;
this.stop = false;
}
or(2)
change
QuorumCnxManager manager;
to
final QuorumCnxManager manager;
--
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