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

Liang Xie updated HBASE-10088:
------------------------------

    Status: Patch Available  (was: Open)

Kick off QA robot:)

> SecureClient will hang when access secure-disabled cluster
> ----------------------------------------------------------
>
>                 Key: HBASE-10088
>                 URL: https://issues.apache.org/jira/browse/HBASE-10088
>             Project: HBase
>          Issue Type: Improvement
>          Components: Client, security
>    Affects Versions: 0.94.14
>            Reporter: cuijianwei
>            Assignee: cuijianwei
>         Attachments: HBASE-10088-0.94-v1.patch, HBASE-10088-0.94-v2.patch, 
> HBASE-10088-0.94-v2.patch
>
>
> When I misuse a secure hbase client to access a secure-disabled hbase server, 
> I found the client will hang. The reason is that client will firstly invoke 
> rpc method "getProtocolVersion", and the response from a secure-disabled 
> server won't contain necessary fields processed by SecureClient. SecureClient 
> will process the response as follows : (from SecureClient.receiveResponse()):
> {code}
> if (state == Status.SUCCESS.state) {
>           Writable value = ReflectionUtils.newInstance(valueClass, conf);
>           value.readFields(in);                 // read value
>           if (LOG.isDebugEnabled()) {
>             LOG.debug("call #"+id+", response is:\n"+value.toString());
>           }
>           // it's possible that this call may have been cleaned up due to a 
> RPC
>           // timeout, so check if it still exists before setting the value.
>           if (call != null) {
>             call.setValue(value);
>           }
>         } else if (state == Status.ERROR.state) {
>           if (call != null) {
>             call.setException(new 
> RemoteException(WritableUtils.readString(in), WritableUtils
>                 .readString(in)));
>           }
>         } else if (state == Status.FATAL.state) {
>           RemoteException exception = new 
> RemoteException(WritableUtils.readString(in),
>               WritableUtils.readString(in));
>           // the call will be removed from call map, we must set Exception 
> here to notify
>           // the thread waited on the call
>           if (call != null) {
>             call.setException(exception);
>           }
>           // Close the connection
>           markClosed(exception);
>         }
>         calls.remove(id);
> {code}
> As the above code, SecureClient need to read 'state' field from response. If 
> the response is from a secure-disabled server, there will no 'state' field in 
> response and SecureClient will get an illegal 'state', then the call will be 
> removed from cached calls without notifying waiting thread. This will make 
> the invoker waiting all the time. Although we should not use secure client to 
> access secure-disabled server, users might encounter this situation because 
> of misusing or error configuration. If the client will hang in this 
> situation, users might not know the error quickly. Maybe, it is better to 
> report an error in this situation so that users will know what happens 
> quickly.



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to