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)