2121import org .apache .hadoop .conf .Configuration ;
2222import org .apache .hadoop .hbase .util .ReflectionUtils ;
2323import org .apache .yetus .audience .InterfaceAudience ;
24+ import org .slf4j .Logger ;
25+ import org .slf4j .LoggerFactory ;
2426
2527/**
2628 * Factory to create an {@link RpcRetryingCaller}
2729 */
2830@ InterfaceAudience .Private
2931public class RpcRetryingCallerFactory {
3032
33+ private static final Logger LOG = LoggerFactory .getLogger (RpcRetryingCallerFactory .class );
34+
3135 /** Configuration key for a custom {@link RpcRetryingCaller} */
3236 public static final String CUSTOM_CALLER_CONF_KEY = "hbase.rpc.callerfactory.class" ;
3337 private final ConnectionConfiguration connectionConf ;
@@ -38,12 +42,12 @@ public class RpcRetryingCallerFactory {
3842
3943 public RpcRetryingCallerFactory (Configuration conf , ConnectionConfiguration connectionConf ) {
4044 this (conf , connectionConf , RetryingCallerInterceptorFactory .NO_OP_INTERCEPTOR , null ,
41- OperationInterceptorFactory . NO_OP );
45+ createOperationInterceptorFactory ( conf ) );
4246 }
4347
4448 public RpcRetryingCallerFactory (Configuration conf , ConnectionConfiguration connectionConf ,
4549 RetryingCallerInterceptor interceptor , MetricsConnection metrics ) {
46- this (conf , connectionConf , interceptor , metrics , OperationInterceptorFactory . NO_OP );
50+ this (conf , connectionConf , interceptor , metrics , createOperationInterceptorFactory ( conf ) );
4751 }
4852
4953 public RpcRetryingCallerFactory (Configuration conf , ConnectionConfiguration connectionConf ,
@@ -90,21 +94,23 @@ public static RpcRetryingCallerFactory instantiate(Configuration configuration,
9094 public static RpcRetryingCallerFactory instantiate (Configuration configuration ,
9195 ConnectionConfiguration connectionConf , MetricsConnection metrics ) {
9296 return instantiate (configuration , connectionConf ,
93- RetryingCallerInterceptorFactory .NO_OP_INTERCEPTOR , null , metrics );
97+ RetryingCallerInterceptorFactory .NO_OP_INTERCEPTOR , null , metrics ,
98+ createOperationInterceptorFactory (configuration ));
9499 }
95100
96101 public static RpcRetryingCallerFactory instantiate (Configuration configuration ,
97102 ConnectionConfiguration connectionConf , ServerStatisticTracker stats ,
98103 MetricsConnection metrics ) {
99104 return instantiate (configuration , connectionConf ,
100- RetryingCallerInterceptorFactory .NO_OP_INTERCEPTOR , stats , metrics );
105+ RetryingCallerInterceptorFactory .NO_OP_INTERCEPTOR , stats , metrics ,
106+ createOperationInterceptorFactory (configuration ));
101107 }
102108
103109 public static RpcRetryingCallerFactory instantiate (Configuration configuration ,
104110 ConnectionConfiguration connectionConf , RetryingCallerInterceptor interceptor ,
105111 ServerStatisticTracker stats , MetricsConnection metrics ) {
106112 return instantiate (configuration , connectionConf , interceptor , stats , metrics ,
107- OperationInterceptorFactory . NO_OP );
113+ createOperationInterceptorFactory ( configuration ) );
108114 }
109115
110116 public static RpcRetryingCallerFactory instantiate (Configuration configuration ,
@@ -125,4 +131,20 @@ public static RpcRetryingCallerFactory instantiate(Configuration configuration,
125131 }
126132 return factory ;
127133 }
134+
135+ private static OperationInterceptorFactory createOperationInterceptorFactory (Configuration conf ) {
136+ String clazz = conf .get (OperationInterceptorFactory .HBASE_CLIENT_OPERATION_INTERCEPTOR_IMPL );
137+ if (clazz == null || clazz .isEmpty ()) {
138+ return OperationInterceptorFactory .NO_OP ;
139+ }
140+ try {
141+ Class <? extends OperationInterceptorFactory > factoryClass =
142+ conf .getClassByName (clazz ).asSubclass (OperationInterceptorFactory .class );
143+ return ReflectionUtils .newInstance (factoryClass , conf );
144+ } catch (ClassNotFoundException e ) {
145+ LOG .warn ("Failed to load OperationInterceptorFactory class: {}, using NO_OP instead" , clazz ,
146+ e );
147+ return OperationInterceptorFactory .NO_OP ;
148+ }
149+ }
128150}
0 commit comments