1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.regionserver;
19
20 import java.util.Arrays;
21
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24 import org.apache.hadoop.classification.InterfaceAudience;
25
26
27
28
29
30
31
32
33 @InterfaceAudience.Private
34 public class KeyPrefixRegionSplitPolicy extends IncreasingToUpperBoundRegionSplitPolicy {
35 private static final Log LOG = LogFactory
36 .getLog(KeyPrefixRegionSplitPolicy.class);
37 @Deprecated
38 public static final String PREFIX_LENGTH_KEY_DEPRECATED = "prefix_split_key_policy.prefix_length";
39 public static final String PREFIX_LENGTH_KEY = "KeyPrefixRegionSplitPolicy.prefix_length";
40
41 private int prefixLength = 0;
42
43 @Override
44 protected void configureForRegion(HRegion region) {
45 super.configureForRegion(region);
46 if (region != null) {
47 prefixLength = 0;
48
49
50 String prefixLengthString = region.getTableDesc().getValue(
51 PREFIX_LENGTH_KEY);
52 if (prefixLengthString == null) {
53
54 prefixLengthString = region.getTableDesc().getValue(PREFIX_LENGTH_KEY_DEPRECATED);
55 if (prefixLengthString == null) {
56 LOG.error(PREFIX_LENGTH_KEY + " not specified for table "
57 + region.getTableDesc().getNameAsString()
58 + ". Using default RegionSplitPolicy");
59 return;
60 }
61 }
62 try {
63 prefixLength = Integer.parseInt(prefixLengthString);
64 } catch (NumberFormatException nfe) {
65
66 }
67 if (prefixLength <= 0) {
68 LOG.error("Invalid value for " + PREFIX_LENGTH_KEY + " for table "
69 + region.getTableDesc().getNameAsString() + ":"
70 + prefixLengthString + ". Using default RegionSplitPolicy");
71 }
72 }
73 }
74
75 @Override
76 protected byte[] getSplitPoint() {
77 byte[] splitPoint = super.getSplitPoint();
78 if (prefixLength > 0 && splitPoint != null && splitPoint.length > 0) {
79
80 return Arrays.copyOf(splitPoint,
81 Math.min(prefixLength, splitPoint.length));
82 } else {
83 return splitPoint;
84 }
85 }
86 }