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();
       }
     }