MAPREDUCE-4226. ConcurrentModificationException in FileSystemCounterGroup.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1335197 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Thomas White 2012-05-07 19:05:59 +00:00
parent eca2c850a5
commit 55cd161a35
3 changed files with 26 additions and 1 deletions

View File

@ -461,6 +461,9 @@ Release 0.23.3 - UNRELEASED
MAPREDUCE-4220. RM apps page starttime/endtime sorts are incorrect MAPREDUCE-4220. RM apps page starttime/endtime sorts are incorrect
(Jonathan Eagles via bobby) (Jonathan Eagles via bobby)
MAPREDUCE-4226. ConcurrentModificationException in FileSystemCounterGroup.
(tomwhite)
Release 0.23.2 - UNRELEASED Release 0.23.2 - UNRELEASED
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -23,6 +23,7 @@ import java.io.DataOutput;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@ -54,7 +55,8 @@ public abstract class FileSystemCounterGroup<C extends Counter>
// C[] would need Array.newInstance which requires a Class<C> reference. // C[] would need Array.newInstance which requires a Class<C> reference.
// Just a few local casts probably worth not having to carry it around. // Just a few local casts probably worth not having to carry it around.
private final Map<String, Object[]> map = Maps.newTreeMap(); private final Map<String, Object[]> map =
new ConcurrentSkipListMap<String, Object[]>();
private String displayName; private String displayName;
private static final Joiner NAME_JOINER = Joiner.on('_'); private static final Joiner NAME_JOINER = Joiner.on('_');

View File

@ -18,6 +18,7 @@
package org.apache.hadoop.mapred; package org.apache.hadoop.mapred;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
@ -204,6 +205,25 @@ public class TestCounters {
iterator.next(); iterator.next();
} }
@Test
public void testFileSystemGroupIteratorConcurrency() {
Counters counters = new Counters();
// create 2 filesystem counter groups
counters.findCounter("fs1", FileSystemCounter.BYTES_READ).increment(1);
counters.findCounter("fs2", FileSystemCounter.BYTES_READ).increment(1);
// Iterate over the counters in this group while updating counters in
// the group
Group group = counters.getGroup(FileSystemCounter.class.getName());
Iterator<Counter> iterator = group.iterator();
counters.findCounter("fs3", FileSystemCounter.BYTES_READ).increment(1);
assertTrue(iterator.hasNext());
iterator.next();
counters.findCounter("fs3", FileSystemCounter.BYTES_READ).increment(1);
assertTrue(iterator.hasNext());
iterator.next();
}
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
new TestCounters().testCounters(); new TestCounters().testCounters();
} }