[ 
https://issues.apache.org/jira/browse/THRIFT-3768?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15224861#comment-15224861
 ] 

Ted Wang commented on THRIFT-3768:
----------------------------------

>> The onClientConnected() method is documented to require the implementation 
>> to manage the lifetime of the client object

I don't think the server leaf classes are responsible for managing the lifetime 
of the client object because 
onClientDisconnected says that "The implementation must not delete the 
pointer", and I take it to mean that TServerFramework is responsible for its 
lifetime. I take the documentation in onClientConnected to mean that the leaf 
classes must take care not to use the client after onClientDisconnected returns.

>> I'd like to get rid of TThreadedServer however... perhaps we can deprecate 
>> it in 0.10.0? Using a TThreadPoolServer is a better choice.

I'll just say that TThreadedServer and TThreadPoolServer are very similar in 
that one is bounded and another is unbounded. TThreadedServer has a simpler 
implementation, but that simplification seems to be flaky in shutdown cases.

By the way, in one of your earlier edits, I think you are running into this 
problem:
https://issues.apache.org/jira/browse/THRIFT-3753


> TThreadedServer may crash if it is destroyed immediately after it returns 
> from serve()
> --------------------------------------------------------------------------------------
>
>                 Key: THRIFT-3768
>                 URL: https://issues.apache.org/jira/browse/THRIFT-3768
>             Project: Thrift
>          Issue Type: Bug
>          Components: C++ - Library
>    Affects Versions: 0.9.3
>            Reporter: Ted Wang
>            Assignee: James E. King, III
>            Priority: Minor
>
> Here's a sequence that shows the race:
> Thread-1 (Users of TThreadedServer): Calls TThreadedServer::stop(), which 
> calls interruptChildren and initiates the tearing down of client connections.
> Thread-2: In TServerFramework::serve(), broke out of accept, and now blocks 
> in TThreadedServer::serve() waiting to drain all the clients.
> Thread-3 (The connected client thread created by TThreadedServer): In 
> disposeConnectedClient, running because the server is shutting down and the 
> shared_ptr specified this function to be the cleanup function for the client. 
> This thread just returned from onClientDisconnected and now context switches.
> Thread-2: TThreadedServer::serve() is notified that all of the clients have 
> disconnected and completes.
> Thread-1: Joins on Thread-2 and destroys the server object because it is done.
> Thread-3: Finally gets a chance to run, but now encounters undefined behavior 
> because it is still executing a member function of an object that has been 
> destroyed.
> You can force this race in action if you put sleep(1) before 
> onClientDisconnected() in disposeConnectedClient



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to