You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2013/04/03 15:51:01 UTC
svn commit: r1464012 - in /hbase/trunk:
hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/
hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/
Author: tedyu
Date: Wed Apr 3 13:51:01 2013
New Revision: 1464012
URL: http://svn.apache.org/r1464012
Log:
HBASE-7871 HBase can be stuck when closing regions concurrently (Ted Yu)
Modified:
hbase/trunk/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
hbase/trunk/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
Modified: hbase/trunk/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java?rev=1464012&r1=1464011&r2=1464012&view=diff
==============================================================================
--- hbase/trunk/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java (original)
+++ hbase/trunk/hbase-hadoop1-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java Wed Apr 3 13:51:01 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/trunk/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java?rev=1464012&r1=1464011&r2=1464012&view=diff
==============================================================================
--- hbase/trunk/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java (original)
+++ hbase/trunk/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java Wed Apr 3 13:51:01 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();
}
}