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 2009/09/22 21:18:49 UTC

svn commit: r817779 - in /hadoop/hbase/trunk: CHANGES.txt src/java/org/apache/hadoop/hbase/master/RegionManager.java src/test/org/apache/hadoop/hbase/master/TestRegionManager.java

Author: stack
Date: Tue Sep 22 19:18:43 2009
New Revision: 817779

URL: http://svn.apache.org/viewvc?rev=817779&view=rev
Log:
HBASE-1857 WrongRegionException when setting region online after .META. split

Added:
    hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/master/TestRegionManager.java
Modified:
    hadoop/hbase/trunk/CHANGES.txt
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java

Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=817779&r1=817778&r2=817779&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Tue Sep 22 19:18:43 2009
@@ -40,6 +40,8 @@
                to contact a failed regionserver
    HBASE-1856  HBASE-1765 broke MapReduce when using Result.list()
                (Lars George via Stack)
+   HBASE-1857  WrongRegionException when setting region online after .META.
+               split (Cosmin Lehane via Stack)
 
   IMPROVEMENTS
    HBASE-1760  Cleanup TODOs in HTable

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java?rev=817779&r1=817778&r2=817779&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java Tue Sep 22 19:18:43 2009
@@ -624,7 +624,7 @@
           return onlineMetaRegions.get(newRegion.getRegionName());
         } 
         return onlineMetaRegions.get(onlineMetaRegions.headMap(
-            newRegion.getTableDesc().getName()).lastKey());
+            newRegion.getRegionName()).lastKey());
       }
     }
   }

Added: hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/master/TestRegionManager.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/master/TestRegionManager.java?rev=817779&view=auto
==============================================================================
--- hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/master/TestRegionManager.java (added)
+++ hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/master/TestRegionManager.java Tue Sep 22 19:18:43 2009
@@ -0,0 +1,69 @@
+package org.apache.hadoop.hbase.master;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.hadoop.hbase.HBaseClusterTestCase;
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.HBaseTestCase;
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.HServerAddress;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
+import org.apache.hadoop.hbase.client.HTable;
+import org.apache.hadoop.hbase.client.Put;
+import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.regionserver.HRegion;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.Writables;
+import org.apache.hadoop.util.StringUtils;
+
+public class TestRegionManager extends HBaseClusterTestCase {
+   public void testGetFirstMetaRegionForRegionAfterMetaSplit()
+   throws Exception {
+     HTable meta = new HTable(HConstants.META_TABLE_NAME);
+     HMaster master = this.cluster.getMaster();
+     HServerAddress address = master.getMasterAddress();
+     HTableDescriptor tableDesc = new HTableDescriptor(Bytes.toBytes("_MY_TABLE_"));
+     HTableDescriptor metaTableDesc = meta.getTableDescriptor();
+     // master.regionManager.onlineMetaRegions already contains first .META. region at key Bytes.toBytes("")
+     byte[] startKey0 = Bytes.toBytes("f");
+     byte[] endKey0 = Bytes.toBytes("h");
+     HRegionInfo regionInfo0 = new HRegionInfo(tableDesc, startKey0, endKey0);
+
+     // 1st .META. region will be something like .META.,,1253625700761
+     HRegionInfo metaRegionInfo0 = new HRegionInfo(metaTableDesc, Bytes.toBytes(""), regionInfo0.getRegionName());
+     MetaRegion meta0 = new MetaRegion(address, metaRegionInfo0);
+   
+     byte[] startKey1 = Bytes.toBytes("j");
+     byte[] endKey1 = Bytes.toBytes("m");
+     HRegionInfo regionInfo1 = new HRegionInfo(tableDesc, startKey1, endKey1);
+     // 2nd .META. region will be something like .META.,_MY_TABLE_,f,1253625700761,1253625700761 
+     HRegionInfo metaRegionInfo1 = new HRegionInfo(metaTableDesc, regionInfo0.getRegionName(), regionInfo1.getRegionName());
+     MetaRegion meta1 = new MetaRegion(address, metaRegionInfo1);
+
+
+     // 3rd .META. region will be something like .META.,_MY_TABLE_,j,1253625700761,1253625700761
+     HRegionInfo metaRegionInfo2 = new HRegionInfo(metaTableDesc, regionInfo1.getRegionName(), Bytes.toBytes(""));
+     MetaRegion meta2 = new MetaRegion(address, metaRegionInfo2);
+
+     byte[] startKeyX = Bytes.toBytes("h");
+     byte[] endKeyX = Bytes.toBytes("j");
+     HRegionInfo regionInfoX = new HRegionInfo(tableDesc, startKeyX, endKeyX);
+   
+   
+     master.regionManager.offlineMetaRegion(startKey0);
+     master.regionManager.putMetaRegionOnline(meta0);
+     master.regionManager.putMetaRegionOnline(meta1);
+     master.regionManager.putMetaRegionOnline(meta2);
+   
+//    for (byte[] b : master.regionManager.getOnlineMetaRegions().keySet()) {
+//      System.out.println("FROM TEST KEY " + b +"  " +new String(b));
+//    }
+
+     assertEquals(metaRegionInfo1.getStartKey(), master.regionManager.getFirstMetaRegionForRegion(regionInfoX).getStartKey());
+     assertEquals(metaRegionInfo1.getRegionName(), master.regionManager.getFirstMetaRegionForRegion(regionInfoX).getRegionName());
+   }
+}