[ 
https://issues.apache.org/jira/browse/HBASE-11479?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

cuijianwei updated HBASE-11479:
-------------------------------

    Description: 
When HBaseClient.stop() is invoked, all cached HBaseClient.Connections will be 
interrupted, marked as closed and then finally closed. HBaseClient.stop() won't 
return before all cached HBaseClient.Connections have been closed. However, 
SecureConnection might not be closed after HBaseClient.stop() is invoked 
because of the following code in SecureClient,setupIOstreams():
{code}
...
try {
     ...
            try {
              continueSasl =
                ticket.runAs(new PrivilegedExceptionAction<Boolean>() {
                  @Override
                  public Boolean run() throws IOException {
                    return setupSaslConnection(in2, out2);
                  }
                });
            } catch (Exception ex) {
              if (rand == null) {
                rand = new Random();
              }
              // == InterruptedException won't be caught ==
              handleSaslConnectionFailure(numRetries++, MAX_RETRIES, ex, rand, 
ticket);
              continue;
              ...
            }
        }
      } catch (IOException e) {
        markClosed(e);
        close();

        throw e;
      }

...
{code}

SecureClient.handleSaslConnectionFailure(...) will throw InterruptedException 
exception(there will be Thread.sleep() in 
SecureClient.handleSaslConnectionFailure(...)) when HBaseClient#stop() is 
invoked. However, this InterruptedException won't be caught, making this 
SecureConnection can't be closed.

This problem might make regionserver can't exit because regionserver will wait 
all SecureConnection closed when exiting. A simple way to fix this bug is to 
catch InterruptedException in SecureClient#setupIOstreams() and close the 
SecureConnection.

  was:
When HBaseClient.stop() is invoked, all cached HBaseClient.Connections will be 
interrupted, marked as closed and then finally closed. HBaseClient.stop() won't 
return before all cached HBaseClient.Connections have been closed. However, 
SecureConnection might not be closed after HBaseClient.stop() is invoked 
because of the following code in SecureClient,setupIOstreams():
{code}
...
try {
     ...
            try {
              continueSasl =
                ticket.runAs(new PrivilegedExceptionAction<Boolean>() {
                  @Override
                  public Boolean run() throws IOException {
                    return setupSaslConnection(in2, out2);
                  }
                });
            } catch (Exception ex) {
              if (rand == null) {
                rand = new Random();
              }
              <font color='red'>handleSaslConnectionFailure(numRetries++, 
MAX_RETRIES, ex, rand, ticket)</font>;
              continue;
              ...
            }
        }
      } catch (IOException e) {
        markClosed(e);
        close();

        throw e;
      }

...
{code}

SecureClient.handleSaslConnectionFailure(...) will throw InterruptedException 
exception(there will be Thread.sleep() in 
SecureClient.handleSaslConnectionFailure(...)) when HBaseClient#stop() is 
invoked. However, this InterruptedException won't be caught, making this 
SecureConnection can't be closed.

This problem might make regionserver can't exit because regionserver will wait 
all SecureConnection closed when exiting. A simple way to fix this bug is to 
catch InterruptedException in SecureClient#setupIOstreams() and close the 
SecureConnection.


> SecureConnection can't be closed when SecureClient is stopping because 
> InterruptedException won't be caught in SecureClient#setupIOstreams()
> --------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: HBASE-11479
>                 URL: https://issues.apache.org/jira/browse/HBASE-11479
>             Project: HBase
>          Issue Type: Bug
>          Components: security
>    Affects Versions: 0.94.20
>            Reporter: cuijianwei
>            Priority: Minor
>
> When HBaseClient.stop() is invoked, all cached HBaseClient.Connections will 
> be interrupted, marked as closed and then finally closed. HBaseClient.stop() 
> won't return before all cached HBaseClient.Connections have been closed. 
> However, SecureConnection might not be closed after HBaseClient.stop() is 
> invoked because of the following code in SecureClient,setupIOstreams():
> {code}
> ...
> try {
>      ...
>             try {
>               continueSasl =
>                 ticket.runAs(new PrivilegedExceptionAction<Boolean>() {
>                   @Override
>                   public Boolean run() throws IOException {
>                     return setupSaslConnection(in2, out2);
>                   }
>                 });
>             } catch (Exception ex) {
>               if (rand == null) {
>                 rand = new Random();
>               }
>               // == InterruptedException won't be caught ==
>               handleSaslConnectionFailure(numRetries++, MAX_RETRIES, ex, 
> rand, ticket);
>               continue;
>               ...
>             }
>         }
>       } catch (IOException e) {
>         markClosed(e);
>         close();
>         throw e;
>       }
> ...
> {code}
> SecureClient.handleSaslConnectionFailure(...) will throw InterruptedException 
> exception(there will be Thread.sleep() in 
> SecureClient.handleSaslConnectionFailure(...)) when HBaseClient#stop() is 
> invoked. However, this InterruptedException won't be caught, making this 
> SecureConnection can't be closed.
> This problem might make regionserver can't exit because regionserver will 
> wait all SecureConnection closed when exiting. A simple way to fix this bug 
> is to catch InterruptedException in SecureClient#setupIOstreams() and close 
> the SecureConnection.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to