hbase-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Nicolas Liochon (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (HBASE-10185) HBaseClient retries even though a DoNotRetryException was thrown
Date Thu, 06 Feb 2014 15:46:11 GMT

    [ https://issues.apache.org/jira/browse/HBASE-10185?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13893452#comment-13893452

Nicolas Liochon commented on HBASE-10185:

I'm not far from jira hijacking here ;-)
I'm reopening to submit the patch on trunk. I expect the code to be close on .94 actually.
We've got something a little bit similar on trunk, because of the codec: we can imagine a
specific codec that cannot handle some kind of messages. Then it will need to send a doNotRetry,
and we should not need to close the connection, as the tcp connection itself is fine.

> 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, 0.99.0
>            Reporter: Samarth
>             Fix For: 0.99.0
>         Attachments: 10185.v1.patch
> 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

View raw message