Index: src/main/java/org/apache/hadoop/hbase/monitoring/TaskMonitor.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/monitoring/TaskMonitor.java (revision 1587361) +++ src/main/java/org/apache/hadoop/hbase/monitoring/TaskMonitor.java (working copy) @@ -28,6 +28,7 @@ import java.util.Iterator; import java.util.List; +import org.apache.commons.collections.buffer.CircularFifoBuffer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -50,8 +51,7 @@ static final int MAX_TASKS = 1000; private static TaskMonitor instance; - private List tasks = - Lists.newArrayList(); + private CircularFifoBuffer tasks = new CircularFifoBuffer(MAX_TASKS); /** * Get singleton instance. @@ -73,9 +73,6 @@ new PassthroughInvocationHandler(stat)); TaskAndWeakRefPair pair = new TaskAndWeakRefPair(stat, proxy); tasks.add(pair); - if (tasks.size() > MAX_TASKS) { - purgeExpiredTasks(); - } return proxy; } @@ -88,15 +85,10 @@ new PassthroughInvocationHandler(stat)); TaskAndWeakRefPair pair = new TaskAndWeakRefPair(stat, proxy); tasks.add(pair); - if (tasks.size() > MAX_TASKS) { - purgeExpiredTasks(); - } return proxy; } private synchronized void purgeExpiredTasks() { - int size = 0; - for (Iterator it = tasks.iterator(); it.hasNext();) { TaskAndWeakRefPair pair = it.next(); @@ -113,15 +105,8 @@ if (canPurge(stat)) { it.remove(); - } else { - size++; } } - - if (size > MAX_TASKS) { - LOG.warn("Too many actions in action monitor! Purging some."); - tasks = tasks.subList(size - MAX_TASKS, size); - } } /** @@ -132,7 +117,9 @@ public synchronized List getTasks() { purgeExpiredTasks(); ArrayList ret = Lists.newArrayListWithCapacity(tasks.size()); - for (TaskAndWeakRefPair pair : tasks) { + for (Iterator it = tasks.iterator(); + it.hasNext();) { + TaskAndWeakRefPair pair = it.next(); MonitoredTask t = pair.get(); ret.add(t.clone()); }