You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Lars Hofhansl (JIRA)" <ji...@apache.org> on 2013/12/17 19:20:07 UTC
[jira] [Commented] (HBASE-10185) HBaseClient retries even though a
DoNotRetryException was thrown
[ https://issues.apache.org/jira/browse/HBASE-10185?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13850738#comment-13850738 ]
Lars Hofhansl commented on HBASE-10185:
---------------------------------------
Would have to think through threading issues to make sure the calling thread does not see an Exception that is not yet fully constructed. Let's do that in 0.94.16.
> 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
> Fix For: 0.94.16
>
>
> 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)