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/08/02 00:17:21 UTC

git commit: HBASE-11632 Region split needs to clear force split flag at the end of SplitRequest run (Jerry He)

Repository: hbase
Updated Branches:
  refs/heads/master 04e06645a -> eb79a4358


HBASE-11632 Region split needs to clear force split flag at the end of SplitRequest run (Jerry He)


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/eb79a435
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/eb79a435
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/eb79a435

Branch: refs/heads/master
Commit: eb79a4358029653817ddf8bee0dde392c3368ecb
Parents: 04e0664
Author: Ted Yu <te...@apache.org>
Authored: Fri Aug 1 22:17:09 2014 +0000
Committer: Ted Yu <te...@apache.org>
Committed: Fri Aug 1 22:17:09 2014 +0000

----------------------------------------------------------------------
 .../hbase/regionserver/CompactSplitThread.java  |  3 +
 .../hadoop/hbase/regionserver/HRegion.java      |  7 +-
 .../hadoop/hbase/regionserver/SplitRequest.java |  3 +
 .../hadoop/hbase/regionserver/TestHRegion.java  | 76 +++++++++++++++++++-
 .../hadoop/hbase/regionserver/TestStore.java    |  2 +-
 5 files changed, 86 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/eb79a435/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java
index c3ac096..d9ddba3 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactSplitThread.java
@@ -215,6 +215,9 @@ public class CompactSplitThread implements CompactionRequestor {
     if (midKey == null) {
       LOG.debug("Region " + r.getRegionNameAsString() +
         " not splittable because midkey=null");
+      if (r.shouldForceSplit()) {
+        r.clearSplit();
+      }
       return;
     }
     try {

http://git-wip-us.apache.org/repos/asf/hbase/blob/eb79a435/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
index c0fd07c..98c32b0 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
@@ -5797,16 +5797,17 @@ public class HRegion implements HeapSize { // , Writable{
   }
 
   void forceSplit(byte[] sp) {
-    // NOTE : this HRegion will go away after the forced split is successful
-    //        therefore, no reason to clear this value
+    // This HRegion will go away after the forced split is successful
+    // But if a forced split fails, we need to clear forced split.
     this.splitRequest = true;
     if (sp != null) {
       this.explicitSplitPoint = sp;
     }
   }
 
-  void clearSplit_TESTS_ONLY() {
+  void clearSplit() {
     this.splitRequest = false;
+    this.explicitSplitPoint = null;
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/hbase/blob/eb79a435/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SplitRequest.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SplitRequest.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SplitRequest.java
index 4b57a20..e39763d 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SplitRequest.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SplitRequest.java
@@ -124,6 +124,9 @@ class SplitRequest implements Runnable {
             io instanceof RemoteException ? ((RemoteException) io).unwrapRemoteException() : io);
         }
       }
+      if (parent.shouldForceSplit()) {
+        parent.clearSplit();
+      }
       releaseTableLock();
     }
   }

http://git-wip-us.apache.org/repos/asf/hbase/blob/eb79a435/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
index 0f9de92..3b98533 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
@@ -144,6 +144,7 @@ import org.junit.rules.TestName;
 import org.mockito.ArgumentMatcher;
 import org.mockito.Mockito;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.protobuf.ByteString;
 
@@ -2358,8 +2359,10 @@ public class TestHRegion {
     SplitTransaction st = new SplitTransaction(parent, midkey);
     // If prepare does not return true, for some reason -- logged inside in
     // the prepare call -- we are not ready to split just now. Just return.
-    if (!st.prepare())
+    if (!st.prepare()) {
+      parent.clearSplit();
       return null;
+    }
     try {
       result = st.execute(null, null);
     } catch (IOException ioe) {
@@ -2375,6 +2378,9 @@ public class TestHRegion {
             + " -- aborting server", e);
       }
     }
+    finally {
+      parent.clearSplit();
+    }
     return new HRegion[] { result.getFirst(), result.getSecond() };
   }
 
@@ -3329,6 +3335,74 @@ public class TestHRegion {
     }
   }
 
+  @Test
+  public void testClearForceSplit() throws IOException {
+    byte[] qualifier = Bytes.toBytes("qualifier");
+    Configuration hc = initSplit();
+    int numRows = 10;
+    byte[][] families = { fam1, fam3 };
+
+    // Setting up region
+    String method = this.getName();
+    this.region = initHRegion(tableName, method, hc, families);
+
+    // Put data in region
+    int startRow = 100;
+    putData(startRow, numRows, qualifier, families);
+    int splitRow = startRow + numRows;
+    byte[] splitRowBytes = Bytes.toBytes("" + splitRow);
+    putData(splitRow, numRows, qualifier, families);
+    region.flushcache();
+
+    HRegion[] regions = null;
+    try {
+      // Set force split
+      region.forceSplit(splitRowBytes);
+      assertTrue(region.shouldForceSplit());
+      // Split point should be the force split row
+      assertTrue(Bytes.equals(splitRowBytes, region.checkSplit()));
+
+      // Add a store that has references.
+      HStore storeMock = Mockito.mock(HStore.class);
+      when(storeMock.hasReferences()).thenReturn(true);
+      when(storeMock.getFamily()).thenReturn(new HColumnDescriptor("cf"));
+      when(storeMock.close()).thenReturn(ImmutableList.<StoreFile>of());
+      when(storeMock.getColumnFamilyName()).thenReturn("cf");
+      region.stores.put(Bytes.toBytes(storeMock.getColumnFamilyName()), storeMock);
+      assertTrue(region.hasReferences());
+
+      // Will not split since the store has references.
+      regions = splitRegion(region, splitRowBytes);
+      assertNull(regions);
+
+      // Region force split should be cleared after the split try.
+      assertFalse(region.shouldForceSplit());
+
+      // Remove the store that has references.
+      region.stores.remove(Bytes.toBytes(storeMock.getColumnFamilyName()));
+      assertFalse(region.hasReferences());
+
+      // Now we can split.
+      regions = splitRegion(region, splitRowBytes);
+
+      // Opening the regions returned.
+      for (int i = 0; i < regions.length; i++) {
+        regions[i] = HRegion.openHRegion(regions[i], null);
+      }
+      // Verifying that the region has been split
+      assertEquals(2, regions.length);
+
+      // Verifying that all data is still there and that data is in the right
+      // place
+      verifyData(regions[0], startRow, numRows, qualifier, families);
+      verifyData(regions[1], splitRow, numRows, qualifier, families);
+
+    } finally {
+      HRegion.closeHRegion(this.region);
+      this.region = null;
+    }
+  }
+
   /**
    * Flushes the cache in a thread while scanning. The tests verify that the
    * scan is coherent - e.g. the returned results are always of the same or

http://git-wip-us.apache.org/repos/asf/hbase/blob/eb79a435/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java
index bc0c859..9600932 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStore.java
@@ -925,7 +925,7 @@ public class TestStore {
     Assert.assertNull(store.getSplitPoint());
     store.getHRegion().forceSplit(null);
     Assert.assertNull(store.getSplitPoint());
-    store.getHRegion().clearSplit_TESTS_ONLY();
+    store.getHRegion().clearSplit();
   }
 
   @Test