[ 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)