Hiroshi Ikeda created HADOOP-10524:
--------------------------------------

             Summary: Race condition around MutableMetric and its subclasses
                 Key: HADOOP-10524
                 URL: https://issues.apache.org/jira/browse/HADOOP-10524
             Project: Hadoop Common
          Issue Type: Bug
            Reporter: Hiroshi Ikeda
            Priority: Minor


For example, MutableGaugeInt has two methods:

{code}
public synchronized void incr() {
  ++value;
  setChanged();
}

public void set(int value) {
  this.value = value;
  setChanged();
}
{code}

and the lack of synchronization of the {{set}} method causes a problem that 
calling the {{set}} method might be ignored while another thread is calling the 
{{incr}} method, such as:

(1) Thread1 takes the current value in the {{incr}} method.
(2) Thread2 sets the new value in the {{set}} method.
(3) Thread1 adds +1 to the taken value and sets the value in the {{incr}} 
method.

Also, in the first place, MutableMetric has a volatile instance variable 
{{changed}}, but lack of synchronization causes a problem that it drops the 
latest notification which is called just before clearing the {{changed}} 
variable. That means, the volatile keyword is useless unless it is needed to 
just check the flag itself. Indeed, the implementation of the method 
{{snapshot}} in MutableCounterInt has this problem because of lack of 
synchronization.

Anyway, synchronization around MutableMetric and its subclasses is doubtful and 
should be reviewed.




--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to