bharathv commented on a change in pull request #2280: URL: https://github.com/apache/hbase/pull/2280#discussion_r487440011
########## File path: hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetricsConnection.java ########## @@ -56,6 +56,7 @@ /** Set this key to {@code true} to enable metrics collection of client requests. */ public static final String CLIENT_SIDE_METRICS_ENABLED_KEY = "hbase.client.metrics.enable"; + private static final String CNT_BASE = "rpcCount_"; Review comment: This landed as a part of #2130 (HBASE-24765). Nick suggested that we should have a way of accounting all RPCs that happen from a client perspective and this seemed like a good and clean way to me. Given this already was already clubbed with HBASE-24765 in master, you still want to separate it here? ########## File path: hbase-client/src/main/java/org/apache/hadoop/hbase/client/MasterRegistry.java ########## @@ -0,0 +1,266 @@ +/* + * + * 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 + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase.client; + +import static org.apache.hadoop.hbase.util.DNS.getMasterHostname; +import com.google.common.base.Preconditions; +import com.google.common.base.Strings; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.net.HostAndPort; +import com.google.protobuf.Message; +import com.google.protobuf.RpcController; +import java.io.IOException; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.HBaseIOException; +import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.HRegionLocation; +import org.apache.hadoop.hbase.RegionLocations; +import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.classification.InterfaceAudience; +import org.apache.hadoop.hbase.exceptions.ClientExceptionsUtil; +import org.apache.hadoop.hbase.exceptions.MasterRegistryFetchException; +import org.apache.hadoop.hbase.ipc.BlockingRpcCallback; +import org.apache.hadoop.hbase.ipc.HBaseRpcController; +import org.apache.hadoop.hbase.ipc.RpcClient; +import org.apache.hadoop.hbase.ipc.RpcClientFactory; +import org.apache.hadoop.hbase.ipc.RpcControllerFactory; +import org.apache.hadoop.hbase.protobuf.ProtobufUtil; +import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos; +import org.apache.hadoop.hbase.security.User; + +import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.ClientMetaService; +import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.GetClusterIdRequest; +import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.GetClusterIdResponse; +import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.GetMastersRequest; +import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.GetMastersResponse; +import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.GetMastersResponseEntry; +import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.GetMetaRegionLocationsRequest; +import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.GetMetaRegionLocationsResponse; +import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.GetNumLiveRSRequest; +import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.GetNumLiveRSResponse; + +/** + * Master based registry implementation. Makes RPCs to the configured master addresses from config + * {@value org.apache.hadoop.hbase.HConstants#MASTER_ADDRS_KEY}. All the registry methods are + * blocking unlike implementations in other branches. + */ +@InterfaceAudience.Private +public class MasterRegistry implements ConnectionRegistry { + private static final String MASTER_ADDRS_CONF_SEPARATOR = ","; + + private volatile ImmutableMap<String, ClientMetaService.Interface> masterAddr2Stub; + + // RPC client used to talk to the masters. + private RpcClient rpcClient; + private RpcControllerFactory rpcControllerFactory; + private int rpcTimeoutMs; + + protected MasterAddressRefresher masterAddressRefresher; + + @Override + public void init(Connection connection) throws IOException { + Configuration conf = connection.getConfiguration(); + rpcTimeoutMs = (int) Math.min(Integer.MAX_VALUE, + conf.getLong(HConstants.HBASE_RPC_TIMEOUT_KEY, HConstants.DEFAULT_HBASE_RPC_TIMEOUT)); + // XXX: we pass cluster id as null here since we do not have a cluster id yet, we have to fetch Review comment: Let me create a jira for this. It's like a chicken and egg problem at this point. I'm studying digest based auth to see if there is a way to move away from cluster ID (I don't fully understand it now). Currently this limitation exists in all branches. ########## File path: hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java ########## @@ -1571,43 +1573,31 @@ boolean isMasterRunning() throws ServiceException { * @throws KeeperException * @throws ServiceException */ - private Object makeStubNoRetries() throws IOException, KeeperException, ServiceException { - ZooKeeperKeepAliveConnection zkw; - try { - zkw = getKeepAliveZooKeeperWatcher(); - } catch (IOException e) { - ExceptionUtil.rethrowIfInterrupt(e); - throw new ZooKeeperConnectionException("Can't connect to ZooKeeper", e); - } - try { - checkIfBaseNodeAvailable(zkw); - ServerName sn = MasterAddressTracker.getMasterAddress(zkw); - if (sn == null) { - String msg = "ZooKeeper available but no active master location found"; - LOG.info(msg); - throw new MasterNotRunningException(msg); - } - if (isDeadServer(sn)) { - throw new MasterNotRunningException(sn + " is dead."); + private Object makeStubNoRetries() throws IOException, ServiceException { + ServerName sn = registry.getActiveMaster(); + if (sn == null) { + String msg = "ZooKeeper available but no active master location found"; Review comment: Fixed. ########## File path: hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetricsConnection.java ########## @@ -466,6 +468,9 @@ public void updateRpc(MethodDescriptor method, Message param, CallStats stats) { if (callsPerServer > 0) { concurrentCallsPerServerHist.update(callsPerServer); } + // Update the counter that tracks RPCs by type. + final String methodName = method.getService().getName() + "_" + method.getName(); Review comment: Responded above. Let me know if you still think it should be a separate change, I'll do it. ---------------------------------------------------------------- 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. For queries about this service, please contact Infrastructure at: us...@infra.apache.org