1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.client;
19
20 import org.apache.hadoop.conf.Configuration;
21 import org.apache.hadoop.hbase.HConstants;
22 import org.apache.hadoop.hbase.classification.InterfaceAudience;
23 import org.apache.hadoop.hbase.util.ReflectionUtils;
24
25
26
27
28 @InterfaceAudience.Private
29 public class RpcRetryingCallerFactory {
30
31
32 public static final String CUSTOM_CALLER_CONF_KEY = "hbase.rpc.callerfactory.class";
33 protected final Configuration conf;
34 private final long pause;
35 private final int retries;
36 private final int startLogErrorsCnt;
37 private final boolean enableBackPressure;
38 private ServerStatisticTracker stats;
39
40 public RpcRetryingCallerFactory(Configuration conf) {
41 this(conf, null);
42 }
43
44 public RpcRetryingCallerFactory(Configuration conf, ServerStatisticTracker stats) {
45 this.conf = conf;
46 this.stats = stats;
47 pause = conf.getLong(HConstants.HBASE_CLIENT_PAUSE,
48 HConstants.DEFAULT_HBASE_CLIENT_PAUSE);
49 retries = conf.getInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER,
50 HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER);
51 startLogErrorsCnt = conf.getInt(AsyncProcess.START_LOG_ERRORS_AFTER_COUNT_KEY,
52 AsyncProcess.DEFAULT_START_LOG_ERRORS_AFTER_COUNT);
53 enableBackPressure = conf.getBoolean(HConstants.ENABLE_CLIENT_BACKPRESSURE,
54 HConstants.DEFAULT_ENABLE_CLIENT_BACKPRESSURE);
55 }
56
57
58
59
60 public void setStatisticTracker(ServerStatisticTracker statisticTracker) {
61 this.stats = statisticTracker;
62 }
63
64 public <T> RpcRetryingCaller<T> newCaller() {
65
66
67 RpcRetryingCaller<T> caller;
68 if (enableBackPressure && this.stats != null) {
69 caller = new StatsTrackingRpcRetryingCaller<T>(pause, retries, startLogErrorsCnt,
70 this.stats);
71 } else {
72 caller = new RpcRetryingCaller<T>(pause, retries, startLogErrorsCnt);
73 }
74 return caller;
75 }
76
77 public static RpcRetryingCallerFactory instantiate(Configuration configuration,
78 ServerStatisticTracker stats) {
79 String clazzName = RpcRetryingCallerFactory.class.getName();
80 String rpcCallerFactoryClazz =
81 configuration.get(RpcRetryingCallerFactory.CUSTOM_CALLER_CONF_KEY, clazzName);
82 if (rpcCallerFactoryClazz.equals(clazzName)) {
83 return new RpcRetryingCallerFactory(configuration, stats);
84 }
85 try {
86 return ReflectionUtils.instantiateWithCustomCtor(rpcCallerFactoryClazz,
87 new Class[] { Configuration.class, ServerStatisticTracker.class },
88 new Object[] { configuration, stats });
89 } catch (UnsupportedOperationException e) {
90 return ReflectionUtils.instantiateWithCustomCtor(rpcCallerFactoryClazz,
91 new Class[] { Configuration.class },
92 new Object[] { configuration });
93 }
94 }
95 }