hbase-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Samarth (JIRA)" <j...@apache.org>
Subject [jira] [Created] (HBASE-10185) HBaseClient retries even though a DoNotRetryException was thrown
Date Tue, 17 Dec 2013 07:56:07 GMT
Samarth created HBASE-10185:
-------------------------------

             Summary: HBaseClient retries even though a DoNotRetryException was thrown
                 Key: HBASE-10185
                 URL: https://issues.apache.org/jira/browse/HBASE-10185
             Project: HBase
          Issue Type: Bug
          Components: IPC/RPC
    Affects Versions: 0.94.12
            Reporter: Samarth


Throwing a DoNotRetryIOException inside  Writable.write(Dataoutput) method doesn't prevent
HBase from retrying. Debugging the code locally, I figured that the bug lies in the way HBaseClient
simply throws an IOException when it sees that a connection has been closed unexpectedly.
 

Method:
public Writable call(Writable param, InetSocketAddress addr,
                       Class<? extends VersionedProtocol> protocol,
                       User ticket, int rpcTimeout)

Excerpt of code where the bug is present:
while (!call.done) {
        if (connection.shouldCloseConnection.get()) {
          throw new IOException("Unexpected closed connection");
        }

Throwing this IOException causes the ServerCallable.translateException(t) to be a no-op resulting
in HBase retrying. 

>From my limited view and understanding of the code, one way I could think of handling
this is by looking at the closeConnection member variable of a connection to determine what
kind of exception should be thrown. 

Specifically, when a connection is closed, the current code does this: 

    protected synchronized void markClosed(IOException e) {
      if (shouldCloseConnection.compareAndSet(false, true)) {
        closeException = e;
        notifyAll();
      }
    }

Within HBaseClient's call method, the code could possibly be modified to:

while (!call.done) {
        if (connection.shouldCloseConnection.get() ) {
                 if(connection.closeException instanceof                   DoNotRetryIOException)
{
throw closeException;
}
          throw new IOException("Unexpected closed connection");
        }




--
This message was sent by Atlassian JIRA
(v6.1.4#6159)

Mime
View raw message