1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.regionserver.throttle;
19
20 import org.apache.commons.logging.Log;
21 import org.apache.commons.logging.LogFactory;
22 import org.apache.hadoop.conf.Configuration;
23 import org.apache.hadoop.hbase.HBaseInterfaceAudience;
24 import org.apache.hadoop.hbase.classification.InterfaceAudience;
25 import org.apache.hadoop.hbase.regionserver.RegionServerServices;
26 import org.apache.hadoop.util.ReflectionUtils;
27
28 @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)
29 public final class CompactionThroughputControllerFactory {
30
31 private static final Log LOG = LogFactory.getLog(CompactionThroughputControllerFactory.class);
32
33 public static final String HBASE_THROUGHPUT_CONTROLLER_KEY =
34 "hbase.regionserver.throughput.controller";
35
36 private CompactionThroughputControllerFactory() {
37 }
38
39 private static final Class<? extends ThroughputController>
40 DEFAULT_THROUGHPUT_CONTROLLER_CLASS = PressureAwareCompactionThroughputController.class;
41
42
43 private static final String DEPRECATED_NAME_OF_PRESSURE_AWARE_THROUGHPUT_CONTROLLER_CLASS =
44 "org.apache.hadoop.hbase.regionserver.compactions.PressureAwareCompactionThroughputController";
45 private static final String DEPRECATED_NAME_OF_NO_LIMIT_THROUGHPUT_CONTROLLER_CLASS =
46 "org.apache.hadoop.hbase.regionserver.compactions.NoLimitThroughputController";
47
48 public static ThroughputController create(RegionServerServices server,
49 Configuration conf) {
50 Class<? extends ThroughputController> clazz = getThroughputControllerClass(conf);
51 ThroughputController controller = ReflectionUtils.newInstance(clazz, conf);
52 controller.setup(server);
53 return controller;
54 }
55
56 public static Class<? extends ThroughputController> getThroughputControllerClass(
57 Configuration conf) {
58 String className =
59 conf.get(HBASE_THROUGHPUT_CONTROLLER_KEY, DEFAULT_THROUGHPUT_CONTROLLER_CLASS.getName());
60 className = resolveDeprecatedClassName(className);
61 try {
62 return Class.forName(className).asSubclass(ThroughputController.class);
63 } catch (Exception e) {
64 LOG.warn(
65 "Unable to load configured throughput controller '" + className
66 + "', load default throughput controller "
67 + DEFAULT_THROUGHPUT_CONTROLLER_CLASS.getName() + " instead", e);
68 return DEFAULT_THROUGHPUT_CONTROLLER_CLASS;
69 }
70 }
71
72
73
74
75
76
77 private static String resolveDeprecatedClassName(String oldName) {
78 String className = oldName.trim();
79 if (className.equals(DEPRECATED_NAME_OF_PRESSURE_AWARE_THROUGHPUT_CONTROLLER_CLASS)) {
80 className = PressureAwareCompactionThroughputController.class.getName();
81 } else if (className.equals(DEPRECATED_NAME_OF_NO_LIMIT_THROUGHPUT_CONTROLLER_CLASS)) {
82 className = NoLimitThroughputController.class.getName();
83 }
84 if (!className.equals(oldName)) {
85 LOG.warn(oldName + " is deprecated, please use " + className + " instead");
86 }
87 return className;
88 }
89 }