You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by el...@apache.org on 2018/12/07 22:29:23 UTC

[40/51] [abbrv] hbase git commit: HBASE-21541 Move MetaTableLocator.verifyRegionLocation to hbase-rsgroup module

http://git-wip-us.apache.org/repos/asf/hbase/blob/8bf966c8/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MetaTableLocator.java
----------------------------------------------------------------------
diff --git a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MetaTableLocator.java b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MetaTableLocator.java
index 7f0fb11..0cebc76 100644
--- a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MetaTableLocator.java
+++ b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MetaTableLocator.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -17,75 +17,55 @@
  */
 package org.apache.hadoop.hbase.zookeeper;
 
-import java.io.EOFException;
-import java.io.IOException;
-import java.net.ConnectException;
-import java.net.NoRouteToHostException;
-import java.net.SocketException;
-import java.net.SocketTimeoutException;
-import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Locale;
-
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.NotAllMetaRegionsOnlineException;
 import org.apache.hadoop.hbase.ServerName;
-import org.apache.hadoop.hbase.client.ClusterConnection;
 import org.apache.hadoop.hbase.client.RegionInfo;
 import org.apache.hadoop.hbase.client.RegionInfoBuilder;
 import org.apache.hadoop.hbase.client.RegionReplicaUtil;
-import org.apache.hadoop.hbase.client.RetriesExhaustedException;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
-import org.apache.hadoop.hbase.ipc.FailedServerException;
-import org.apache.hadoop.hbase.ipc.HBaseRpcController;
-import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException;
 import org.apache.hadoop.hbase.master.RegionState;
-import org.apache.hadoop.hbase.regionserver.RegionServerStoppedException;
-import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Pair;
-import org.apache.hadoop.ipc.RemoteException;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+
 import org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException;
+
 import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
-import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;
-import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos.MetaRegionServer;
 
 /**
- * Utility class to perform operation (get/wait for/verify/set/delete) on znode in ZooKeeper
- * which keeps hbase:meta region server location.
- *
- * Stateless class with a bunch of static methods. Doesn't manage resources passed in
- * (e.g. Connection, ZKWatcher etc).
- *
- * Meta region location is set by <code>RegionServerServices</code>.
- * This class doesn't use ZK watchers, rather accesses ZK directly.
- *
- * This class it stateless. The only reason it's not made a non-instantiable util class
- * with a collection of static methods is that it'd be rather hard to mock properly in tests.
- *
+ * Utility class to perform operation (get/wait for/verify/set/delete) on znode in ZooKeeper which
+ * keeps hbase:meta region server location.
+ * <p/>
+ * Stateless class with a bunch of static methods. Doesn't manage resources passed in (e.g.
+ * Connection, ZKWatcher etc).
+ * <p/>
+ * Meta region location is set by <code>RegionServerServices</code>. This class doesn't use ZK
+ * watchers, rather accesses ZK directly.
+ * <p/>
  * TODO: rewrite using RPC calls to master to find out about hbase:meta.
  */
 @InterfaceAudience.Private
-public class MetaTableLocator {
+public final class MetaTableLocator {
   private static final Logger LOG = LoggerFactory.getLogger(MetaTableLocator.class);
 
-  // only needed to allow non-timeout infinite waits to stop when cluster shuts down
-  private volatile boolean stopped = false;
+  private MetaTableLocator() {
+  }
 
   /**
    * Checks if the meta region location is available.
    * @return true if meta region location is available, false if not
    */
-  public boolean isLocationAvailable(ZKWatcher zkw) {
+  public static boolean isLocationAvailable(ZKWatcher zkw) {
     return getMetaRegionLocation(zkw) != null;
   }
 
@@ -93,7 +73,7 @@ public class MetaTableLocator {
    * @param zkw ZooKeeper watcher to be used
    * @return meta table regions and their locations.
    */
-  public List<Pair<RegionInfo, ServerName>> getMetaRegionsAndLocations(ZKWatcher zkw) {
+  public static List<Pair<RegionInfo, ServerName>> getMetaRegionsAndLocations(ZKWatcher zkw) {
     return getMetaRegionsAndLocations(zkw, RegionInfo.DEFAULT_REPLICA_ID);
   }
 
@@ -104,7 +84,7 @@ public class MetaTableLocator {
    * @param replicaId the ID of the replica
    * @return meta table regions and their locations.
    */
-  public List<Pair<RegionInfo, ServerName>> getMetaRegionsAndLocations(ZKWatcher zkw,
+  public static List<Pair<RegionInfo, ServerName>> getMetaRegionsAndLocations(ZKWatcher zkw,
       int replicaId) {
     ServerName serverName = getMetaRegionLocation(zkw, replicaId);
     List<Pair<RegionInfo, ServerName>> list = new ArrayList<>(1);
@@ -119,30 +99,30 @@ public class MetaTableLocator {
    * @param zkw ZooKeeper watcher to be used
    * @return List of meta regions
    */
-  public List<RegionInfo> getMetaRegions(ZKWatcher zkw) {
+  public static List<RegionInfo> getMetaRegions(ZKWatcher zkw) {
     return getMetaRegions(zkw, RegionInfo.DEFAULT_REPLICA_ID);
   }
 
   /**
    * Gets the meta regions for the given path and replica ID.
-   *
    * @param zkw reference to the {@link ZKWatcher} which also contains configuration and operation
    * @param replicaId the ID of the replica
    * @return List of meta regions
    */
-  public List<RegionInfo> getMetaRegions(ZKWatcher zkw, int replicaId) {
+  public static List<RegionInfo> getMetaRegions(ZKWatcher zkw, int replicaId) {
     List<Pair<RegionInfo, ServerName>> result;
     result = getMetaRegionsAndLocations(zkw, replicaId);
     return getListOfRegionInfos(result);
   }
 
-  private List<RegionInfo> getListOfRegionInfos(final List<Pair<RegionInfo, ServerName>> pairs) {
+  private static List<RegionInfo> getListOfRegionInfos(
+      final List<Pair<RegionInfo, ServerName>> pairs) {
     if (pairs == null || pairs.isEmpty()) {
-      return Collections.EMPTY_LIST;
+      return Collections.emptyList();
     }
 
     List<RegionInfo> result = new ArrayList<>(pairs.size());
-    for (Pair<RegionInfo, ServerName> pair: pairs) {
+    for (Pair<RegionInfo, ServerName> pair : pairs) {
       result.add(pair.getFirst());
     }
     return result;
@@ -153,7 +133,7 @@ public class MetaTableLocator {
    * @param zkw zookeeper connection to use
    * @return server name or null if we failed to get the data.
    */
-  public ServerName getMetaRegionLocation(final ZKWatcher zkw) {
+  public static ServerName getMetaRegionLocation(final ZKWatcher zkw) {
     try {
       RegionState state = getMetaRegionState(zkw);
       return state.isOpened() ? state.getServerName() : null;
@@ -168,7 +148,7 @@ public class MetaTableLocator {
    * @param replicaId the ID of the replica
    * @return server name
    */
-  public ServerName getMetaRegionLocation(final ZKWatcher zkw, int replicaId) {
+  public static ServerName getMetaRegionLocation(final ZKWatcher zkw, int replicaId) {
     try {
       RegionState state = getMetaRegionState(zkw, replicaId);
       return state.isOpened() ? state.getServerName() : null;
@@ -178,42 +158,39 @@ public class MetaTableLocator {
   }
 
   /**
-   * Gets the meta region location, if available, and waits for up to the
-   * specified timeout if not immediately available.
-   * Given the zookeeper notification could be delayed, we will try to
-   * get the latest data.
-   *
+   * Gets the meta region location, if available, and waits for up to the specified timeout if not
+   * immediately available. Given the zookeeper notification could be delayed, we will try to get
+   * the latest data.
    * @param zkw reference to the {@link ZKWatcher} which also contains configuration and operation
    * @param timeout maximum time to wait, in millis
-   * @return server name for server hosting meta region formatted as per
-   * {@link ServerName}, or null if none available
+   * @return server name for server hosting meta region formatted as per {@link ServerName}, or null
+   *         if none available
    * @throws InterruptedException if interrupted while waiting
    * @throws NotAllMetaRegionsOnlineException if a meta or root region is not online
    */
-  public ServerName waitMetaRegionLocation(ZKWatcher zkw, long timeout)
-    throws InterruptedException, NotAllMetaRegionsOnlineException {
+  public static ServerName waitMetaRegionLocation(ZKWatcher zkw, long timeout)
+      throws InterruptedException, NotAllMetaRegionsOnlineException {
     return waitMetaRegionLocation(zkw, RegionInfo.DEFAULT_REPLICA_ID, timeout);
   }
 
   /**
    * Gets the meta region location, if available, and waits for up to the specified timeout if not
-   * immediately available. Given the zookeeper notification could be delayed, we will try to
-   * get the latest data.
-   *
+   * immediately available. Given the zookeeper notification could be delayed, we will try to get
+   * the latest data.
    * @param zkw reference to the {@link ZKWatcher} which also contains configuration and operation
    * @param replicaId the ID of the replica
    * @param timeout maximum time to wait, in millis
-   * @return server name for server hosting meta region formatted as per
-   * {@link ServerName}, or null if none available
+   * @return server name for server hosting meta region formatted as per {@link ServerName}, or null
+   *         if none available
    * @throws InterruptedException if waiting for the socket operation fails
    * @throws NotAllMetaRegionsOnlineException if a meta or root region is not online
    */
-  public ServerName waitMetaRegionLocation(ZKWatcher zkw, int replicaId, long timeout)
-    throws InterruptedException, NotAllMetaRegionsOnlineException {
+  public static ServerName waitMetaRegionLocation(ZKWatcher zkw, int replicaId, long timeout)
+      throws InterruptedException, NotAllMetaRegionsOnlineException {
     try {
       if (ZKUtil.checkExists(zkw, zkw.getZNodePaths().baseZNode) == -1) {
-        String errorMsg = "Check the value configured in 'zookeeper.znode.parent'. "
-            + "There could be a mismatch with the one configured in the master.";
+        String errorMsg = "Check the value configured in 'zookeeper.znode.parent'. " +
+          "There could be a mismatch with the one configured in the master.";
         LOG.error(errorMsg);
         throw new IllegalArgumentException(errorMsg);
       }
@@ -230,198 +207,6 @@ public class MetaTableLocator {
   }
 
   /**
-   * Waits indefinitely for availability of <code>hbase:meta</code>.  Used during
-   * cluster startup.  Does not verify meta, just that something has been
-   * set up in zk.
-   * @see #waitMetaRegionLocation(ZKWatcher, long)
-   * @throws InterruptedException if interrupted while waiting
-   */
-  public void waitMetaRegionLocation(ZKWatcher zkw) throws InterruptedException {
-    long startTime = System.currentTimeMillis();
-    while (!stopped) {
-      try {
-        if (waitMetaRegionLocation(zkw, 100) != null) {
-          break;
-        }
-
-        long sleepTime = System.currentTimeMillis() - startTime;
-        // +1 in case sleepTime=0
-        if ((sleepTime + 1) % 10000 == 0) {
-          LOG.warn("Have been waiting for meta to be assigned for " + sleepTime + "ms");
-        }
-      } catch (NotAllMetaRegionsOnlineException e) {
-        if (LOG.isTraceEnabled()) {
-          LOG.trace("hbase:meta still not available, sleeping and retrying." +
-            " Reason: " + e.getMessage());
-        }
-      }
-    }
-  }
-
-  /**
-   * Verify <code>hbase:meta</code> is deployed and accessible.
-   *
-   * @param hConnection the connection to use
-   * @param zkw reference to the {@link ZKWatcher} which also contains configuration and operation
-   * @param timeout How long to wait on zk for meta address (passed through to
-   *                the internal call to {@link #getMetaServerConnection}.
-   * @return True if the <code>hbase:meta</code> location is healthy.
-   * @throws IOException if the number of retries for getting the connection is exceeded
-   * @throws InterruptedException if waiting for the socket operation fails
-   */
-  public boolean verifyMetaRegionLocation(ClusterConnection hConnection, ZKWatcher zkw,
-      final long timeout) throws InterruptedException, IOException {
-    return verifyMetaRegionLocation(hConnection, zkw, timeout, RegionInfo.DEFAULT_REPLICA_ID);
-  }
-
-  /**
-   * Verify <code>hbase:meta</code> is deployed and accessible.
-   *
-   * @param connection the connection to use
-   * @param zkw reference to the {@link ZKWatcher} which also contains configuration and operation
-   * @param timeout How long to wait on zk for meta address (passed through to
-   * @param replicaId the ID of the replica
-   * @return True if the <code>hbase:meta</code> location is healthy.
-   * @throws InterruptedException if waiting for the socket operation fails
-   * @throws IOException if the number of retries for getting the connection is exceeded
-   */
-  public boolean verifyMetaRegionLocation(ClusterConnection connection, ZKWatcher zkw,
-      final long timeout, int replicaId) throws InterruptedException, IOException {
-    AdminProtos.AdminService.BlockingInterface service = null;
-    try {
-      service = getMetaServerConnection(connection, zkw, timeout, replicaId);
-    } catch (NotAllMetaRegionsOnlineException e) {
-      // Pass
-    } catch (ServerNotRunningYetException e) {
-      // Pass -- remote server is not up so can't be carrying root
-    } catch (UnknownHostException e) {
-      // Pass -- server name doesn't resolve so it can't be assigned anything.
-    } catch (RegionServerStoppedException e) {
-      // Pass -- server name sends us to a server that is dying or already dead.
-    }
-    return (service != null) && verifyRegionLocation(connection, service,
-            getMetaRegionLocation(zkw, replicaId), RegionReplicaUtil.getRegionInfoForReplica(
-                RegionInfoBuilder.FIRST_META_REGIONINFO, replicaId).getRegionName());
-  }
-
-  /**
-   * Verify we can connect to <code>hostingServer</code> and that its carrying
-   * <code>regionName</code>.
-   * @param hostingServer Interface to the server hosting <code>regionName</code>
-   * @param address The servername that goes with the <code>metaServer</code> interface.
-   *                Used logging.
-   * @param regionName The regionname we are interested in.
-   * @return True if we were able to verify the region located at other side of the interface.
-   */
-  // TODO: We should be able to get the ServerName from the AdminProtocol
-  // rather than have to pass it in.  Its made awkward by the fact that the
-  // HRI is likely a proxy against remote server so the getServerName needs
-  // to be fixed to go to a local method or to a cache before we can do this.
-  private boolean verifyRegionLocation(final ClusterConnection connection,
-      AdminService.BlockingInterface hostingServer, final ServerName address,
-      final byte [] regionName) {
-    if (hostingServer == null) {
-      LOG.info("Passed hostingServer is null");
-      return false;
-    }
-    Throwable t;
-    HBaseRpcController controller = connection.getRpcControllerFactory().newController();
-    try {
-      // Try and get regioninfo from the hosting server.
-      return ProtobufUtil.getRegionInfo(controller, hostingServer, regionName) != null;
-    } catch (ConnectException e) {
-      t = e;
-    } catch (RetriesExhaustedException e) {
-      t = e;
-    } catch (RemoteException e) {
-      IOException ioe = e.unwrapRemoteException();
-      t = ioe;
-    } catch (IOException e) {
-      Throwable cause = e.getCause();
-      if (cause != null && cause instanceof EOFException) {
-        t = cause;
-      } else if (cause != null && cause.getMessage() != null
-          && cause.getMessage().contains("Connection reset")) {
-        t = cause;
-      } else {
-        t = e;
-      }
-    }
-    LOG.info("Failed verification of " + Bytes.toStringBinary(regionName) +
-      " at address=" + address + ", exception=" + t.getMessage());
-    return false;
-  }
-
-  /**
-   * Gets a connection to the server hosting meta, as reported by ZooKeeper, waiting up to the
-   * specified timeout for availability.
-   *
-   * <p>WARNING: Does not retry.  Use an {@link org.apache.hadoop.hbase.client.HTable} instead.
-   *
-   * @param connection the connection to use
-   * @param zkw reference to the {@link ZKWatcher} which also contains configuration and operation
-   * @param timeout How long to wait on meta location
-   * @param replicaId the ID of the replica
-   * @return connection to server hosting meta
-   * @throws InterruptedException if waiting for the socket operation fails
-   * @throws IOException if the number of retries for getting the connection is exceeded
-   */
-  private AdminService.BlockingInterface getMetaServerConnection(ClusterConnection connection,
-      ZKWatcher zkw, long timeout, int replicaId) throws InterruptedException, IOException {
-    return getCachedConnection(connection, waitMetaRegionLocation(zkw, replicaId, timeout));
-  }
-
-  /**
-   * @param sn ServerName to get a connection against.
-   * @return The AdminProtocol we got when we connected to <code>sn</code>
-   *         May have come from cache, may not be good, may have been setup by this invocation, or
-   *         may be null.
-   * @throws IOException if the number of retries for getting the connection is exceeded
-   */
-  private static AdminService.BlockingInterface getCachedConnection(ClusterConnection connection,
-      ServerName sn) throws IOException {
-    if (sn == null) {
-      return null;
-    }
-    AdminService.BlockingInterface service = null;
-    try {
-      service = connection.getAdmin(sn);
-    } catch (RetriesExhaustedException e) {
-      if (e.getCause() != null && e.getCause() instanceof ConnectException) {
-        LOG.debug("Catch this; presume it means the cached connection has gone bad.");
-      } else {
-        throw e;
-      }
-    } catch (SocketTimeoutException e) {
-      LOG.debug("Timed out connecting to " + sn);
-    } catch (NoRouteToHostException e) {
-      LOG.debug("Connecting to " + sn, e);
-    } catch (SocketException e) {
-      LOG.debug("Exception connecting to " + sn);
-    } catch (UnknownHostException e) {
-      LOG.debug("Unknown host exception connecting to  " + sn);
-    } catch (FailedServerException e) {
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Server " + sn + " is in failed server list.");
-      }
-    } catch (IOException ioe) {
-      Throwable cause = ioe.getCause();
-      if (ioe instanceof ConnectException) {
-        LOG.debug("Catch. Connect refused.");
-      } else if (cause != null && cause instanceof EOFException) {
-        LOG.debug("Catch. Other end disconnected us.");
-      } else if (cause != null && cause.getMessage() != null &&
-        cause.getMessage().toLowerCase(Locale.ROOT).contains("connection reset")) {
-        LOG.debug("Catch. Connection reset.");
-      } else {
-        throw ioe;
-      }
-
-    }
-    return service;
-  }
-
-  /**
    * Sets the location of <code>hbase:meta</code> in ZooKeeper to the
    * specified server address.
    * @param zookeeper zookeeper reference
@@ -498,7 +283,7 @@ public class MetaTableLocator {
         try {
           int prefixLen = ProtobufUtil.lengthOfPBMagic();
           ZooKeeperProtos.MetaRegionServer rl =
-            ZooKeeperProtos.MetaRegionServer.PARSER.parseFrom(data, prefixLen,
+            ZooKeeperProtos.MetaRegionServer.parser().parseFrom(data, prefixLen,
                     data.length - prefixLen);
           if (rl.hasState()) {
             state = RegionState.State.convert(rl.getState());
@@ -532,12 +317,12 @@ public class MetaTableLocator {
    * @param zookeeper zookeeper reference
    * @throws KeeperException unexpected zookeeper exception
    */
-  public void deleteMetaLocation(ZKWatcher zookeeper)
+  public static void deleteMetaLocation(ZKWatcher zookeeper)
     throws KeeperException {
     deleteMetaLocation(zookeeper, RegionInfo.DEFAULT_REPLICA_ID);
   }
 
-  public void deleteMetaLocation(ZKWatcher zookeeper, int replicaId)
+  public static void deleteMetaLocation(ZKWatcher zookeeper, int replicaId)
     throws KeeperException {
     if (replicaId == RegionInfo.DEFAULT_REPLICA_ID) {
       LOG.info("Deleting hbase:meta region location in ZooKeeper");
@@ -561,7 +346,7 @@ public class MetaTableLocator {
    * @return ServerName or null if we timed out.
    * @throws InterruptedException if waiting for the socket operation fails
    */
-  public List<ServerName> blockUntilAvailable(final ZKWatcher zkw, final long timeout,
+  public static List<ServerName> blockUntilAvailable(final ZKWatcher zkw, final long timeout,
       Configuration conf) throws InterruptedException {
     int numReplicasConfigured = 1;
 
@@ -596,22 +381,21 @@ public class MetaTableLocator {
    * @return ServerName or null if we timed out.
    * @throws InterruptedException if waiting for the socket operation fails
    */
-  public ServerName blockUntilAvailable(final ZKWatcher zkw, final long timeout)
-          throws InterruptedException {
+  public static ServerName blockUntilAvailable(final ZKWatcher zkw, final long timeout)
+      throws InterruptedException {
     return blockUntilAvailable(zkw, RegionInfo.DEFAULT_REPLICA_ID, timeout);
   }
 
   /**
    * Wait until the meta region is available and is not in transition.
-   *
    * @param zkw reference to the {@link ZKWatcher} which also contains configuration and constants
    * @param replicaId the ID of the replica
    * @param timeout maximum time to wait in millis
    * @return ServerName or null if we timed out.
    * @throws InterruptedException if waiting for the socket operation fails
    */
-  public ServerName blockUntilAvailable(final ZKWatcher zkw, int replicaId, final long timeout)
-          throws InterruptedException {
+  public static ServerName blockUntilAvailable(final ZKWatcher zkw, int replicaId,
+      final long timeout) throws InterruptedException {
     if (timeout < 0) {
       throw new IllegalArgumentException();
     }
@@ -624,23 +408,12 @@ public class MetaTableLocator {
     ServerName sn = null;
     while (true) {
       sn = getMetaRegionLocation(zkw, replicaId);
-      if (sn != null || (System.currentTimeMillis() - startTime)
-          > timeout - HConstants.SOCKET_RETRY_WAIT_MS) {
+      if (sn != null ||
+        (System.currentTimeMillis() - startTime) > timeout - HConstants.SOCKET_RETRY_WAIT_MS) {
         break;
       }
       Thread.sleep(HConstants.SOCKET_RETRY_WAIT_MS);
     }
     return sn;
   }
-
-  /**
-   * Stop working.
-   * Interrupts any ongoing waits.
-   */
-  public void stop() {
-    if (!stopped) {
-      LOG.debug("Stopping MetaTableLocator");
-      stopped = true;
-    }
-  }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/8bf966c8/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java
----------------------------------------------------------------------
diff --git a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java
index 9153191..57c847c 100644
--- a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java
+++ b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java
@@ -34,10 +34,8 @@ import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-
 import javax.security.auth.login.AppConfigurationEntry;
 import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
-
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.AuthUtil;
@@ -75,6 +73,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.hbase.thirdparty.com.google.protobuf.InvalidProtocolBufferException;
+
 import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.ReplicationProtos;
 
@@ -1748,13 +1747,13 @@ public final class ZKUtil {
         sb.append("\n ").append(child);
       }
       sb.append("\nRegion server holding hbase:meta: "
-        + new MetaTableLocator().getMetaRegionLocation(zkw));
+        + MetaTableLocator.getMetaRegionLocation(zkw));
       Configuration conf = HBaseConfiguration.create();
       int numMetaReplicas = conf.getInt(HConstants.META_REPLICAS_NUM,
                HConstants.DEFAULT_META_REPLICA_NUM);
       for (int i = 1; i < numMetaReplicas; i++) {
         sb.append("\nRegion server holding hbase:meta, replicaId " + i + " "
-                    + new MetaTableLocator().getMetaRegionLocation(zkw, i));
+                    + MetaTableLocator.getMetaRegionLocation(zkw, i));
       }
       sb.append("\nRegion servers:");
       for (String child : listChildrenNoWatch(zkw, zkw.getZNodePaths().rsZNode)) {