ndimiduk commented on code in PR #5770:
URL: https://github.com/apache/hbase/pull/5770#discussion_r1574542917


##########
hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionRegistryFactory.java:
##########
@@ -17,27 +17,75 @@
  */
 package org.apache.hadoop.hbase.client;
 
-import static 
org.apache.hadoop.hbase.HConstants.CLIENT_CONNECTION_REGISTRY_IMPL_CONF_KEY;
-
+import java.io.IOException;
+import java.net.URI;
+import java.util.ServiceLoader;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.security.User;
 import org.apache.hadoop.hbase.util.ReflectionUtils;
 import org.apache.yetus.audience.InterfaceAudience;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableMap;
 
 /**
- * Factory class to get the instance of configured connection registry.
+ * The entry point for creating a {@link ConnectionRegistry}.
  */
 @InterfaceAudience.Private
 final class ConnectionRegistryFactory {
 
+  private static final Logger LOG = 
LoggerFactory.getLogger(ConnectionRegistryFactory.class);
+
+  private static final ImmutableMap<String, ConnectionRegistryCreator> 
CREATORS;
+  static {
+    ImmutableMap.Builder<String, ConnectionRegistryCreator> builder = 
ImmutableMap.builder();
+    for (ConnectionRegistryCreator factory : 
ServiceLoader.load(ConnectionRegistryCreator.class)) {
+      builder.put(factory.protocol(), factory);
+    }
+    CREATORS = builder.build();
+  }
+
   private ConnectionRegistryFactory() {
   }
 
-  /** Returns The connection registry implementation to use. */
-  static ConnectionRegistry getRegistry(Configuration conf, User user) {
+  /**
+   * Returns the connection registry implementation to use, for the given 
connection url
+   * {@code uri}.
+   * <p/>
+   * We use {@link ServiceLoader} to load different implementations, and use 
the scheme of the given
+   * {@code uri} to select. And if there is no protocol specified, or we can 
not find a
+   * {@link ConnectionRegistryCreator} implementation for the given scheme, we 
will fallback to use
+   * the old way to create the {@link ConnectionRegistry}. Notice that, if 
fallback happens, the
+   * specified connection url {@code uri} will not take effect, we will load 
all the related
+   * configurations from the given Configuration instance {@code conf}
+   */
+  static ConnectionRegistry create(URI uri, Configuration conf, User user) 
throws IOException {
+    if (StringUtils.isBlank(uri.getScheme())) {
+      LOG.warn("No scheme specified for {}, fallback to use old way", uri);

Review Comment:
   Understood.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@hbase.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to