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

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

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

    https://github.com/apache/thrift/pull/1196#discussion_r102025979
  
    --- Diff: lib/cpp/src/thrift/server/TNonblockingServer.cpp ---
    @@ -1566,24 +1562,26 @@ void 
TNonblockingIOThread::setCurrentThreadHighPriority(bool value) {
     }
     
     void TNonblockingIOThread::run() {
    -  if (eventBase_ == NULL)
    +  if (eventBase_ == NULL) {
         registerEvents();
    -
    -  GlobalOutput.printf("TNonblockingServer: IO thread #%d entering 
loop...", number_);
    -
    +  }
       if (useHighPriority_) {
         setCurrentThreadHighPriority(true);
       }
     
    -  // Run libevent engine, never returns, invokes calls to eventHandler
    -  event_base_loop(eventBase_, 0);
    +  if (eventBase_ != NULL)
    +  {
    +    GlobalOutput.printf("TNonblockingServer: IO thread #%d entering 
loop...", number_);
    +    // Run libevent engine, never returns, invokes calls to eventHandler
    +    event_base_loop(eventBase_, 0);
     
    -  if (useHighPriority_) {
    -    setCurrentThreadHighPriority(false);
    -  }
    +    if (useHighPriority_) {
    +      setCurrentThreadHighPriority(false);
    +    }
     
    -  // cleans up our registered events
    -  cleanupEvents();
    +    // cleans up our registered events
    +    cleanupEvents();
    +  }
     
       GlobalOutput.printf("TNonblockingServer: IO thread #%d run() done!", 
number_);
    --- End diff --
    
    All of these messages were already in the implementation and they do not 
appear to have any discrimination as to the severity.  My assumption is they 
are all meant for "printf style debugging".


> TNonblockingServer configured with more than one IO threads does not always 
> return from serve() upon stop()
> -----------------------------------------------------------------------------------------------------------
>
>                 Key: THRIFT-3891
>                 URL: https://issues.apache.org/jira/browse/THRIFT-3891
>             Project: Thrift
>          Issue Type: Bug
>          Components: C++ - Library
>    Affects Versions: 0.9.3
>            Reporter: Buğra Gedik
>            Assignee: James E. King, III
>            Priority: Minor
>         Attachments: patch.diff
>
>
> Using {{TNonblockingServer}}, when the number of IO threads is > 1, there is 
> race condition in which {{stop()}} does not properly unblock {{serve()}}. 
> The problem manifests itself when {{stop()}} is called (obviously from a 
> different thread) soon after {{serve()}}. 
> The core issue is that, {{event_base_loopbreak()}} is called within the 
> {{stop()}} sequence without checking whether the IO thread has actually 
> entered its event loop. The documentation of {{event_base_loopbreak()}} says 
> (http://www.wangafu.net/~nickm/libevent-book/Ref3_eventloop.html)
> {quote}
> Note also that event_base_loopexit(base,NULL) and event_base_loopbreak(base) 
> act differently when no event loop is running: loopexit schedules the next 
> instance of the event loop to stop right after the next round of callbacks 
> are run (as if it had been invoked with EVLOOP_ONCE) whereas loopbreak only 
> stops a currently running loop, and has no effect if the event loop isn’t 
> running.
> {quote}
> Attached is a patch (against the released 0.9.3 version of the codebase).



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to