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

ASF GitHub Bot commented on THRIFT-3768:
----------------------------------------

Github user jeking3 commented on a diff in the pull request:

    https://github.com/apache/thrift/pull/977#discussion_r58481087
  
    --- Diff: lib/cpp/src/thrift/server/TThreadedServer.cpp ---
    @@ -77,44 +83,29 @@ TThreadedServer::TThreadedServer(const 
shared_ptr<TProcessor>& processor,
                                      const shared_ptr<TProtocolFactory>& 
inputProtocolFactory,
                                      const shared_ptr<TProtocolFactory>& 
outputProtocolFactory,
                                      const shared_ptr<ThreadFactory>& 
threadFactory)
    -  : TServerFramework(processor,
    -                     serverTransport,
    -                     inputTransportFactory,
    -                     outputTransportFactory,
    -                     inputProtocolFactory,
    -                     outputProtocolFactory),
    -    threadFactory_(threadFactory) {
    +  : TThreadPoolServer(processor,
    +                      serverTransport,
    +                      inputTransportFactory,
    +                      outputTransportFactory,
    +                      inputProtocolFactory,
    +                      outputProtocolFactory,
    +                      
apache::thrift::concurrency::ThreadManager::newSimpleThreadManager(0, 0)) {
    +    threadManager_->threadFactory(threadFactory);
    +    threadManager_->start();
     }
     
     TThreadedServer::~TThreadedServer() {
     }
     
    -void TThreadedServer::serve() {
    -  TServerFramework::serve();
    -
    -  // Drain all clients - no more will arrive
    -  try {
    -    Synchronized s(clientsMonitor_);
    -    while (getConcurrentClientCount() > 0) {
    -      clientsMonitor_.wait();
    -    }
    -  } catch (TException& tx) {
    -    string errStr = string("TThreadedServer: Exception joining workers: ") 
+ tx.what();
    -    GlobalOutput(errStr.c_str());
    +void TThreadedServer::onClientConnected(const 
shared_ptr<TConnectedClient>& pClient) {
    +  if (!threadManager_->idleWorkerCount())
    --- End diff --
    
    As submitted the number of threads will grow to the maximum number of 
concurrent connections and will not shrink.  Additional work is needed to allow 
ThreadManager::removeWorker() to do the right thing when many threads arrive at 
it at the same time.  In gdb I found that workerCount_ was 10 but 
workerMaxCount_ was 0; the stop behavior for ThreadManager calls 
removeWorker(workerCount_) and gets an exception, which eventually causes a 
core.  This is why, for this submission, I left it as stated.  


> 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