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 2014/01/17 19:46:36 UTC

svn commit: r1559216 - in /hbase/trunk/hbase-server/src: main/java/org/apache/hadoop/hbase/regionserver/HRegion.java test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java

Author: tedyu
Date: Fri Jan 17 18:46:35 2014
New Revision: 1559216

URL: http://svn.apache.org/r1559216
Log:
HBASE-10370 Compaction in out-of-date Store causes region split failed


Modified:
    hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
    hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java

Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1559216&r1=1559215&r2=1559216&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Fri Jan 17 18:46:35 2014
@@ -1345,6 +1345,14 @@ public class HRegion implements HeapSize
     // block waiting for the lock for compaction
     lock.readLock().lock();
     try {
+      byte[] cf = Bytes.toBytes(store.getColumnFamilyName());
+      if (stores.get(cf) != store) {
+        LOG.warn("Store " + store.getColumnFamilyName() + " on region " + this
+            + " has been re-instantiated, cancel this compaction request. "
+            + " It may be caused by the roll back of split transaction");
+        return false;
+      }
+
       status = TaskMonitor.get().createStatus("Compacting " + store + " in " + this);
       if (this.closed.get()) {
         String msg = "Skipping compaction on " + this + " because closed";

Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java?rev=1559216&r1=1559215&r2=1559216&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java Fri Jan 17 18:46:35 2014
@@ -75,6 +75,8 @@ import org.apache.hadoop.hbase.master.Re
 import org.apache.hadoop.hbase.master.RegionStates;
 import org.apache.hadoop.hbase.master.RegionState.State;
 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
+import org.apache.hadoop.hbase.regionserver.compactions.CompactionContext;
+import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 import org.apache.hadoop.hbase.util.FSUtils;
@@ -298,7 +300,59 @@ public class TestSplitTransactionOnClust
       TESTING_UTIL.deleteTable(tableName);
     }
   }
-
+  @Test
+  public void testSplitFailedCompactionAndSplit() throws Exception {
+    final byte[] tableName = Bytes.toBytes("testSplitFailedCompactionAndSplit");
+    Configuration conf = TESTING_UTIL.getConfiguration();
+    HBaseAdmin admin = new HBaseAdmin(conf);
+    // Create table then get the single region for our new table.
+    HTableDescriptor htd = new HTableDescriptor(tableName);
+    byte[] cf = Bytes.toBytes("cf");
+    htd.addFamily(new HColumnDescriptor(cf));
+    admin.createTable(htd);
+    
+    for (int i = 0; cluster.getRegions(tableName).size() == 0 && i < 100; i++) {
+      Thread.sleep(100);
+    }
+    assertEquals(1, cluster.getRegions(tableName).size());
+    
+    HRegion region = cluster.getRegions(tableName).get(0);
+    Store store = region.getStore(cf);
+    int regionServerIndex = cluster.getServerWith(region.getRegionName());
+    HRegionServer regionServer = cluster.getRegionServer(regionServerIndex);
+    
+    HTable t  = new HTable(conf, tableName);
+    // insert data
+    insertData(tableName, admin, t);
+    insertData(tableName, admin, t);
+    insertData(tableName, admin, t);
+    insertData(tableName, admin, t);
+    
+    int fileNum = store.getStorefiles().size();
+    // 0, Compaction Request
+    store.triggerMajorCompaction();
+    CompactionContext cc = store.requestCompaction();
+    assertNotNull(cc);
+    // 1, A timeout split 
+    // 1.1 close region 
+    assertEquals(2, region.close(false).get(cf).size());
+    // 1.2 rollback and Region initialize again
+    region.initialize();
+    
+    // 2, Run Compaction cc
+    assertFalse(region.compact(cc, store));
+    assertTrue(fileNum > store.getStorefiles().size());
+
+    // 3, Split
+    SplitTransaction st = new SplitTransaction(region, Bytes.toBytes("row3"));
+    assertTrue(st.prepare());
+    st.execute(regionServer, regionServer);
+    assertEquals(2, cluster.getRegions(tableName).size());
+    
+    region.close();
+    t.close();
+  }
+  
   public static class FailingSplitRegionObserver extends BaseRegionObserver {
     static volatile CountDownLatch latch = new CountDownLatch(1);
     @Override