hbase-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From la...@apache.org
Subject svn commit: r1242981 - in /hbase/trunk/src: main/java/org/apache/hadoop/hbase/regionserver/ test/java/org/apache/hadoop/hbase/regionserver/
Date Fri, 10 Feb 2012 23:32:52 GMT
Author: larsh
Date: Fri Feb 10 23:32:52 2012
New Revision: 1242981

URL: http://svn.apache.org/viewvc?rev=1242981&view=rev
Log:
HBASE-5368 Move PrefixSplitKeyPolicy out of the src/test into src, so it is accessible in
HBase installs

Added:
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/KeyPrefixRegionSplitPolicy.java
Removed:
    hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/PrefixSplitKeyPolicy.java
Modified:
    hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java

Added: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/KeyPrefixRegionSplitPolicy.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/KeyPrefixRegionSplitPolicy.java?rev=1242981&view=auto
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/KeyPrefixRegionSplitPolicy.java
(added)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/KeyPrefixRegionSplitPolicy.java
Fri Feb 10 23:32:52 2012
@@ -0,0 +1,78 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.regionserver;
+
+import java.util.Arrays;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * A custom RegionSplitPolicy implementing a SplitPolicy that groups
+ * rows by a prefix of the row-key
+ *
+ * This ensures that a region is not split "inside" a prefix of a row key.
+ * I.e. rows can be co-located in a regionb by their prefix.
+ */
+public class KeyPrefixRegionSplitPolicy extends ConstantSizeRegionSplitPolicy {
+  private static final Log LOG = LogFactory
+      .getLog(KeyPrefixRegionSplitPolicy.class);
+  public static String PREFIX_LENGTH_KEY = "prefix_split_key_policy.prefix_length";
+
+  private int prefixLength = 0;
+
+  @Override
+  protected void configureForRegion(HRegion region) {
+    super.configureForRegion(region);
+    if (region != null) {
+      prefixLength = 0;
+
+      // read the prefix length from the table descriptor
+      String prefixLengthString = region.getTableDesc().getValue(
+          PREFIX_LENGTH_KEY);
+      if (prefixLengthString == null) {
+        LOG.error(PREFIX_LENGTH_KEY + " not specified for table "
+            + region.getTableDesc().getNameAsString()
+            + ". Using default RegionSplitPolicy");
+        return;
+      }
+      try {
+        prefixLength = Integer.parseInt(prefixLengthString);
+      } catch (NumberFormatException nfe) {
+        // ignore
+      }
+      if (prefixLength <= 0) {
+        LOG.error("Invalid value for " + PREFIX_LENGTH_KEY + " for table "
+            + region.getTableDesc().getNameAsString() + ":"
+            + prefixLengthString + ". Using default RegionSplitPolicy");
+      }
+    }
+  }
+
+  @Override
+  protected byte[] getSplitPoint() {
+    byte[] splitPoint = super.getSplitPoint();
+    if (prefixLength > 0 && splitPoint != null && splitPoint.length >
0) {
+      // group split keys by a prefix
+      return Arrays.copyOf(splitPoint,
+          Math.min(prefixLength, splitPoint.length));
+    } else {
+      return splitPoint;
+    }
+  }
+}

Modified: hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java?rev=1242981&r1=1242980&r2=1242981&view=diff
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java
(original)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java
Fri Feb 10 23:32:52 2012
@@ -79,8 +79,8 @@ public class TestRegionSplitPolicy {
   public void testCustomPolicy() throws IOException {
     HTableDescriptor myHtd = new HTableDescriptor();
     myHtd.setValue(HTableDescriptor.SPLIT_POLICY,
-        PrefixSplitKeyPolicy.class.getName());
-    myHtd.setValue(PrefixSplitKeyPolicy.PREFIX_LENGTH_KEY, String.valueOf(2));
+        KeyPrefixRegionSplitPolicy.class.getName());
+    myHtd.setValue(KeyPrefixRegionSplitPolicy.PREFIX_LENGTH_KEY, String.valueOf(2));
 
     HRegion myMockRegion = Mockito.mock(HRegion.class);
     Mockito.doReturn(myHtd).when(myMockRegion).getTableDesc();
@@ -92,7 +92,7 @@ public class TestRegionSplitPolicy {
     Mockito.doReturn(Bytes.toBytes("abcd")).when(mockStore).getSplitPoint();
     stores.put(new byte[] { 1 }, mockStore);
 
-    PrefixSplitKeyPolicy policy = (PrefixSplitKeyPolicy) RegionSplitPolicy
+    KeyPrefixRegionSplitPolicy policy = (KeyPrefixRegionSplitPolicy) RegionSplitPolicy
         .create(myMockRegion, conf);
 
     assertEquals("ab", Bytes.toString(policy.getSplitPoint()));
@@ -101,7 +101,7 @@ public class TestRegionSplitPolicy {
     Mockito.doReturn(Bytes.toBytes("efgh")).when(myMockRegion)
         .getExplicitSplitPoint();
 
-    policy = (PrefixSplitKeyPolicy) RegionSplitPolicy
+    policy = (KeyPrefixRegionSplitPolicy) RegionSplitPolicy
         .create(myMockRegion, conf);
 
     assertEquals("ef", Bytes.toString(policy.getSplitPoint()));



Mime
View raw message