Author: tedyu
Date: Wed Apr 3 13:52:26 2013
New Revision: 1464013
URL: http://svn.apache.org/r1464013
Log:
HBASE-7871 HBase can be stuck when closing regions concurrently (Ted Yu)
Modified:
hbase/branches/0.95/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
hbase/branches/0.95/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
Modified:
hbase/branches/0.95/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
URL:
http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java?rev=1464013&r1=1464012&r2=1464013&view=diff
==============================================================================
---
hbase/branches/0.95/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
(original)
+++
hbase/branches/0.95/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
Wed Apr 3 13:52:26 2013
@@ -25,10 +25,13 @@ import org.apache.hadoop.metrics2.Metric
import org.apache.hadoop.metrics2.MetricsRecordBuilder;
import java.util.TreeSet;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
public class MetricsRegionAggregateSourceImpl extends BaseSourceImpl
implements MetricsRegionAggregateSource {
private final Log LOG = LogFactory.getLog(this.getClass());
+ // lock to guard against concurrent access to regionSources
+ final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final TreeSet<MetricsRegionSourceImpl> regionSources =
new TreeSet<MetricsRegionSourceImpl>();
@@ -47,12 +50,22 @@ public class MetricsRegionAggregateSourc
@Override
public void register(MetricsRegionSource source) {
- regionSources.add((MetricsRegionSourceImpl) source);
+ lock.writeLock().lock();
+ try {
+ regionSources.add((MetricsRegionSourceImpl) source);
+ } finally {
+ lock.writeLock().unlock();
+ }
}
@Override
public void deregister(MetricsRegionSource source) {
- regionSources.remove(source);
+ lock.writeLock().lock();
+ try {
+ regionSources.remove(source);
+ } finally {
+ lock.writeLock().unlock();
+ }
}
/**
@@ -66,17 +79,20 @@ public class MetricsRegionAggregateSourc
@Override
public void getMetrics(MetricsBuilder metricsBuilder, boolean all) {
-
MetricsRecordBuilder mrb = metricsBuilder.addRecord(metricsName)
.setContext(metricsContext);
if (regionSources != null) {
- for (MetricsRegionSourceImpl regionMetricSource : regionSources) {
- regionMetricSource.snapshot(mrb, all);
+ lock.readLock().lock();
+ try {
+ for (MetricsRegionSourceImpl regionMetricSource : regionSources) {
+ regionMetricSource.snapshot(mrb, all);
+ }
+ } finally {
+ lock.readLock().unlock();
}
}
-
metricsRegistry.snapshot(mrb, all);
}
}
Modified:
hbase/branches/0.95/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
URL:
http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java?rev=1464013&r1=1464012&r2=1464013&view=diff
==============================================================================
---
hbase/branches/0.95/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
(original)
+++
hbase/branches/0.95/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
Wed Apr 3 13:52:26 2013
@@ -25,11 +25,14 @@ import org.apache.hadoop.metrics2.Metric
import org.apache.hadoop.metrics2.MetricsRecordBuilder;
import java.util.TreeSet;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
public class MetricsRegionAggregateSourceImpl extends BaseSourceImpl
implements MetricsRegionAggregateSource {
private final Log LOG = LogFactory.getLog(this.getClass());
+ // lock to guard against concurrent access to regionSources
+ final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final TreeSet<MetricsRegionSourceImpl> regionSources =
new TreeSet<MetricsRegionSourceImpl>();
@@ -48,12 +51,22 @@ public class MetricsRegionAggregateSourc
@Override
public void register(MetricsRegionSource source) {
- regionSources.add((MetricsRegionSourceImpl) source);
+ lock.writeLock().lock();
+ try {
+ regionSources.add((MetricsRegionSourceImpl) source);
+ } finally {
+ lock.writeLock().unlock();
+ }
}
@Override
public void deregister(MetricsRegionSource source) {
- regionSources.remove(source);
+ lock.writeLock().lock();
+ try {
+ regionSources.remove(source);
+ } finally {
+ lock.writeLock().unlock();
+ }
}
/**
@@ -72,8 +85,13 @@ public class MetricsRegionAggregateSourc
.setContext(metricsContext);
if (regionSources != null) {
- for (MetricsRegionSourceImpl regionMetricSource : regionSources) {
- regionMetricSource.snapshot(mrb, all);
+ lock.readLock().lock();
+ try {
+ for (MetricsRegionSourceImpl regionMetricSource : regionSources) {
+ regionMetricSource.snapshot(mrb, all);
+ }
+ } finally {
+ lock.readLock().unlock();
}
}