Jano Svitok created THRIFT-5162:
-----------------------------------

             Summary: ThreadManager tests fail in appveyor
                 Key: THRIFT-5162
                 URL: https://issues.apache.org/jira/browse/THRIFT-5162
             Project: Thrift
          Issue Type: Bug
          Components: C++ - Library
    Affects Versions: 0.14.0
            Reporter: Jano Svitok


Log: 
[https://ci.appveyor.com/project/ApacheSoftwareFoundation/thrift/builds/31898731/job/tec853o3sgg2vkht?fullLog=true#L6166]

Similar happens quite often but not always:

423: ThreadManager benchmark tests...
423: ThreadManager load test: worker count: 2 task count: 2000 delay: 5
423: loaded 2000 tasks to execute
423: activeCount = 2000
423: first start: 1052596 Last end: 1068271 min: 10ms max: 20ms average: 
15.649ms
423: Success! expected time: 5000ms elapsed time: 15675ms
423: ThreadManager load test: worker count: 8 task count: 8000 delay: 5
423: loaded 8000 tasks to execute
423: activeCount = 7984
*423: Assertion failed: delta > 0, file 
c:\projects\thrift\lib\cpp\test\concurrency\ThreadManagerTests.h, line 162*
423/444 Test #423: concurrency_test ...................***Timeout 300.01 sec

I have not reproduced this locally, nor I tried to come up with a fix, 
nevertheless I suspect:

The assertion checks that test task duration was > 0. This calls sleep_ in 
ThreadManagerTest,.h that calls Monitor::wait() and that calls 
[std::condition_variable_any::wait_for(duration)|https://en.cppreference.com/w/cpp/thread/condition_variable_any/wait_for].
 Note to this call says:

Atomically releases lock, blocks the current executing thread, and adds it to 
the list of threads waiting on \*this. The thread will be unblocked when 
notify_all() or notify_one() is executed, or when the relative timeout rel_time 
expires. IT MAY ALSO BE UNBLOCKED SPURIOUSLY. When unblocked, regardless of the 
reason, lock is reacquired and wait_for() exits.

If I am right, then the lib should check which of those three cases happened: 
1. notify() called, 2. timeout elapsed 3. something else. This can be 
implemented using another bool member in Monitor, that is set to true in 
notify, and to false in waitXXX after condition returns true, and passing 
predicate returning this bool value.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to