Zhiwen Deng created HBASE-28323: ----------------------------------- Summary: When AbstractRpcClient calls getConnection, the status of conn should be checked Key: HBASE-28323 URL: https://issues.apache.org/jira/browse/HBASE-28323 Project: HBase Issue Type: Bug Affects Versions: 2.5.7 Reporter: Zhiwen Deng
h3. 1. Question The connection will only be created when it does not exist. Since the connections in *connections* are cleaned asynchronously and regularly, it is very likely that we will get a closed connection. {code:java} /** * Get a connection from the pool, or create a new one and add it to the pool. Connections to a * given host/port are reused. */ private T getConnection(ConnectionId remoteId) throws IOException { if (failedServers.isFailedServer(remoteId.getAddress())) { if (LOG.isDebugEnabled()) { LOG.debug("Not trying to connect to " + remoteId.getAddress() + " this server is in the failed servers list"); } throw new FailedServerException( "This server is in the failed servers list: " + remoteId.getAddress()); } T conn; synchronized (connections) { if (!running) { throw new StoppedRpcClientException(); } conn = connections.getOrCreate(remoteId, () -> createConnection(remoteId)); conn.setLastTouched(EnvironmentEdgeManager.currentTime()); } return conn; } {code} h3. 2. Solution * When getConnection, we should to check whether the conn is active * Optimize the impl of isActive and increase the judgment of channel status {code:java} @Override public boolean isActive() { return channel != null && channel.isActive(); } {code} I am new to HBase, so my understanding may be wrong. Please correct me. -- This message was sent by Atlassian Jira (v8.20.10#820010)