You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2011/03/22 01:22:04 UTC

svn commit: r1084038 - in /hbase/trunk: ./ src/main/java/org/apache/hadoop/hbase/regionserver/

Author: stack
Date: Tue Mar 22 00:22:04 2011
New Revision: 1084038

URL: http://svn.apache.org/viewvc?rev=1084038&view=rev
Log:
HBASE-3532 HRegion#equals is broken

Modified:
    hbase/trunk/CHANGES.txt
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java

Modified: hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1084038&r1=1084037&r2=1084038&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Tue Mar 22 00:22:04 2011
@@ -43,6 +43,7 @@ Release 0.91.0 - Unreleased
                creating scanner
    HBASE-3641  LruBlockCache.CacheStats.getHitCount() is not using the
                correct variable
+   HBASE-3532  HRegion#equals is broken (Ted Yu via Stack)
 
   IMPROVEMENTS
    HBASE-3290  Max Compaction Size (Nicolas Spiegelberg via Stack)  

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1084038&r1=1084037&r2=1084038&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Tue Mar 22 00:22:04 2011
@@ -2357,7 +2357,7 @@ public class HRegion implements HeapSize
     if (!(o instanceof HRegion)) {
       return false;
     }
-    return this.hashCode() == ((HRegion)o).hashCode();
+    return Bytes.equals(this.regionInfo.getRegionName(), ((HRegion)o).regionInfo.getRegionName());
   }
 
   @Override

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1084038&r1=1084037&r2=1084038&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Tue Mar 22 00:22:04 2011
@@ -2410,31 +2410,6 @@ public class HRegionServer implements HR
     }
   }
 
-  /**
-   * @return Returns list of non-closed regions hosted on this server. If no
-   *         regions to check, returns an empty list.
-   */
-  protected Set<HRegion> getRegionsToCheck() {
-    HashSet<HRegion> regionsToCheck = new HashSet<HRegion>();
-    // TODO: is this locking necessary?
-    lock.readLock().lock();
-    try {
-      synchronized (this.onlineRegions) {
-        regionsToCheck.addAll(this.onlineRegions.values());
-      }
-    } finally {
-      lock.readLock().unlock();
-    }
-    // Purge closed regions.
-    for (final Iterator<HRegion> i = regionsToCheck.iterator(); i.hasNext();) {
-      HRegion r = i.next();
-      if (r.isClosed()) {
-        i.remove();
-      }
-    }
-    return regionsToCheck;
-  }
-
   @Override
   @QosPriority(priority=HIGH_QOS)
   public long getProtocolVersion(final String protocol, final long clientVersion)

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java?rev=1084038&r1=1084037&r2=1084038&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java Tue Mar 22 00:22:04 2011
@@ -19,21 +19,9 @@
  */
 package org.apache.hadoop.hbase.regionserver;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.DroppedSnapshotException;
-import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.RemoteExceptionHandler;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.util.StringUtils;
-
-import com.google.common.base.Preconditions;
-
 import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.util.ConcurrentModificationException;
-import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -47,6 +35,17 @@ import java.util.concurrent.atomic.Atomi
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.ReentrantLock;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.DroppedSnapshotException;
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.RemoteExceptionHandler;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.util.StringUtils;
+
+import com.google.common.base.Preconditions;
+
 /**
  * Thread that flushes cache on request
  *
@@ -152,19 +151,17 @@ class MemStoreFlusher extends Thread imp
     SortedMap<Long, HRegion> regionsBySize =
         server.getCopyOfOnlineRegionsSortedBySize();
 
-    // TODO: HBASE-3532 - we can't use Set<HRegion> here because it doesn't
-    // implement equals correctly. So, set of region names.
-    Set<byte[]> excludedRegionNames = new TreeSet<byte[]>(Bytes.BYTES_COMPARATOR);
+    Set<HRegion> excludedRegions = new TreeSet<HRegion>();
 
     boolean flushedOne = false;
     while (!flushedOne) {
       // Find the biggest region that doesn't have too many storefiles
       // (might be null!)
       HRegion bestFlushableRegion = getBiggestMemstoreRegion(
-          regionsBySize, excludedRegionNames, true);
+          regionsBySize, excludedRegions, true);
       // Find the biggest region, total, even if it might have too many flushes.
       HRegion bestAnyRegion = getBiggestMemstoreRegion(
-          regionsBySize, excludedRegionNames, false);
+          regionsBySize, excludedRegions, false);
 
       if (bestAnyRegion == null) {
         LOG.error("Above memory mark but there are no flushable regions!");
@@ -201,7 +198,7 @@ class MemStoreFlusher extends Thread imp
       if (!flushedOne) {
         LOG.info("Excluding unflushable region " + regionToFlush +
           " - trying to find a different region to flush.");
-        excludedRegionNames.add(regionToFlush.getRegionName());
+        excludedRegions.add(regionToFlush);
       }
     }
     return true;
@@ -272,11 +269,11 @@ class MemStoreFlusher extends Thread imp
 
   private HRegion getBiggestMemstoreRegion(
       SortedMap<Long, HRegion> regionsBySize,
-      Set<byte[]> excludedRegionNames,
+      Set<HRegion> excludedRegions,
       boolean checkStoreFileCount) {
     synchronized (regionsInQueue) {
       for (HRegion region : regionsBySize.values()) {
-        if (excludedRegionNames.contains(region.getRegionName())) {
+        if (excludedRegions.contains(region)) {
           continue;
         }