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


Reply via email to