Uploaded image for project: 'HBase'
  1. HBase
  2. HBASE-4181

HConnectionManager can't find cached HRegionInterface which makes client very slow

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Critical
    • Resolution: Fixed
    • 0.92.0
    • 0.92.0
    • Client
    • Reviewed
    • Use the host and port string as the key of the Map<String, HRegionInterface> servers to avoid cache misses caused by different format of String returned by InetSocketAddress .

    Description

      HRegionInterface getHRegionConnection(final String hostname,
      final int port, final InetSocketAddress isa, final boolean master)
      throws IOException

      /////////////////////////
      String rsName = isa != null ? isa.toString() : Addressing
      .createHostAndPortStr(hostname, port);

      ////here,if isa is null, the Addressing created a address like "node41:60010"
      ////should use "isa.toString():new InetSocketAddress(hostname, port).toString();"
      ////instead of "Addressing.createHostAndPortStr(hostname, port);"

      server = this.servers.get(rsName);
      if (server == null) {
      // create a unique lock for this RS (if necessary)
      this.connectionLock.putIfAbsent(rsName, rsName);
      // get the RS lock
      synchronized (this.connectionLock.get(rsName)) {
      // do one more lookup in case we were stalled above
      server = this.servers.get(rsName);
      if (server == null) {
      try {
      if (clusterId.hasId())

      { conf.set(HConstants.CLUSTER_ID, clusterId.getId()); }

      // Only create isa when we need to.
      InetSocketAddress address = isa != null ? isa
      : new InetSocketAddress(hostname, port);
      // definitely a cache miss. establish an RPC for this RS
      server = (HRegionInterface) HBaseRPC.waitForProxy(
      serverInterfaceClass, HRegionInterface.VERSION, address,
      this.conf, this.maxRPCAttempts, this.rpcTimeout,
      this.rpcTimeout);
      this.servers.put(address.toString(), server);

      ////but here address.toString() send an address like "node41/10.61.2l.171:60010
      ////so this method can never get cached address and make client request very slow due to it's synchronized.

      } catch (RemoteException e)

      { LOG.warn("RemoteException connecting to RS", e); // Throw what the RemoteException was carrying. throw RemoteExceptionHandler.decodeRemoteException(e); }

      }
      }
      ///////////////////////

      Attachments

        1. HBASE-4181.patch
          0.7 kB
          Liu Jia
        2. HBASE-4181-trunk-v2.patch
          1 kB
          Liu Jia
        3. HBASE-4181-trunk-v3.patch
          1 kB
          Liu Jia
        4. HConnectionManager.patch
          0.8 kB
          Liu Jia

        Activity

          People

            liujia_ict Liu Jia
            liujia_ict Liu Jia
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: