Race condition causes CancelledKeyException in TAsyncClientManager
------------------------------------------------------------------

                 Key: THRIFT-836
                 URL: https://issues.apache.org/jira/browse/THRIFT-836
             Project: Thrift
          Issue Type: Bug
          Components: Compiler (Java)
            Reporter: Ning Liang


Currently, TAsyncClientMethod cancels its selection key on a successful method 
call. The current model assumes the key goes away and the client gets a new key 
on the next Selector registration, which is incorrect - the cancelled key can 
hang around, with the implication that the developer needs to check 
key.isValid() on the next selector action, which TAsyncClientMethod currently 
does. However, if the developer re-uses the client for another call, you can 
get a CancelledKeyException from the Selector#register call, which crashes the 
SelectorThread. This occurs once you have sufficient concurrency on the 
Selector - cancelled key cleanup takes longer, so we hit this condition.

Attached is a patch with fix and regression test. Summary of fix:

1) Don't cancel() the key after a successful method call.
2) Catch CancelledKeyException in the SelectorThread, so the manager can't die.
3) Add an onError method to TAsyncMethodCall, so that the SelectorThread can 
notify the client of an error on selector registration.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to