[ 
https://issues.apache.org/jira/browse/ZOOKEEPER-1739?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Flavio Junqueira updated ZOOKEEPER-1739:
----------------------------------------

    Description: 
I am reading the trunk source code recently and find a thread-safe problem, but 
i'm not quite sure.

in FastLeaderElection:

{code}
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();
}
...
{code}

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
{code} 
WorkerSender(QuorumCnxManager manager){ 
        this.stop = false; 
        this.manager = manager; 
} 
{code}

to 

{code}
WorkerSender(QuorumCnxManager manager){ 
        this.manager = manager; 
        this.stop = false; 
} 
{code}

or(2)
change 

{code}
QuorumCnxManager manager; 
{code}

to 

{code}
final QuorumCnxManager manager;
{code}

  was:
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;


    
> 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: qingjie qiao
>            Priority: Minor
>
> I am reading the trunk source code recently and find a thread-safe problem, 
> but i'm not quite sure.
> in FastLeaderElection:
> {code}
> 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();
> }
> ...
> {code}
> 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
> {code} 
> WorkerSender(QuorumCnxManager manager){ 
>         this.stop = false; 
>         this.manager = manager; 
> } 
> {code}
> to 
> {code}
> WorkerSender(QuorumCnxManager manager){ 
>       this.manager = manager; 
>       this.stop = false; 
> } 
> {code}
> or(2)
> change 
> {code}
> QuorumCnxManager manager; 
> {code}
> to 
> {code}
> final QuorumCnxManager manager;
> {code}

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

Reply via email to