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)