THRIFT-3932 fixed ThreadManager concurrency issues, added more tests in that area, did a little refactoring and prettying up along the way
Client: C++
This closes #1103
diff --git a/lib/cpp/test/concurrency/ThreadFactoryTests.h b/lib/cpp/test/concurrency/ThreadFactoryTests.h
index 3ad14ca..4fc688c 100644
--- a/lib/cpp/test/concurrency/ThreadFactoryTests.h
+++ b/lib/cpp/test/concurrency/ThreadFactoryTests.h
@@ -43,36 +43,6 @@
class ThreadFactoryTests {
public:
- static const double TEST_TOLERANCE;
-
- class Task : public Runnable {
-
- public:
- Task() {}
-
- void run() { std::cout << "\t\t\tHello World" << std::endl; }
- };
-
- /**
- * Hello world test
- */
- bool helloWorldTest() {
-
- PlatformThreadFactory threadFactory = PlatformThreadFactory();
-
- shared_ptr<Task> task = shared_ptr<Task>(new ThreadFactoryTests::Task());
-
- shared_ptr<Thread> thread = threadFactory.newThread(task);
-
- thread->start();
-
- thread->join();
-
- std::cout << "\t\t\tSuccess!" << std::endl;
-
- return true;
- }
-
/**
* Reap N threads
*/
@@ -244,15 +214,22 @@
return true;
}
- /** See how accurate monitor timeout is. */
+ /**
+ * The only guarantee a monitor timeout can give you is that
+ * it will take "at least" as long as the timeout, no less.
+ * There is absolutely no guarantee around regaining execution
+ * near the timeout. On a busy system (like inside a third party
+ * CI environment) it could take quite a bit longer than the
+ * requested timeout, and that's ok.
+ */
- bool monitorTimeoutTest(size_t count = 1000, int64_t timeout = 10) {
+ bool monitorTimeoutTest(int64_t count = 1000, int64_t timeout = 2) {
Monitor monitor;
int64_t startTime = Util::currentTime();
- for (size_t ix = 0; ix < count; ix++) {
+ for (int64_t ix = 0; ix < count; ix++) {
{
Synchronized s(monitor);
try {
@@ -264,18 +241,11 @@
int64_t endTime = Util::currentTime();
- double error = ((endTime - startTime) - (count * timeout)) / (double)(count * timeout);
-
- if (error < 0.0) {
-
- error *= 1.0;
- }
-
- bool success = error < ThreadFactoryTests::TEST_TOLERANCE;
+ bool success = (endTime - startTime) >= (count * timeout);
std::cout << "\t\t\t" << (success ? "Success" : "Failure")
- << "! expected time: " << count * timeout
- << "ms elapsed time: " << endTime - startTime << "ms error%: " << error * 100.0
+ << ": minimum required time to elapse " << count * timeout
+ << "ms; actual elapsed time " << endTime - startTime << "ms"
<< std::endl;
return success;
@@ -285,17 +255,15 @@
public:
FloodTask(const size_t id) : _id(id) {}
~FloodTask() {
- if (_id % 1000 == 0) {
+ if (_id % 10000 == 0) {
std::cout << "\t\tthread " << _id << " done" << std::endl;
}
}
void run() {
- if (_id % 1000 == 0) {
+ if (_id % 10000 == 0) {
std::cout << "\t\tthread " << _id << " started" << std::endl;
}
-
- THRIFT_SLEEP_USEC(1);
}
const size_t _id;
};
@@ -321,8 +289,6 @@
thread->start();
- THRIFT_SLEEP_USEC(1);
-
} catch (TException& e) {
std::cout << "\t\t\tfailed to start " << lix* count + tix << " thread " << e.what()
@@ -341,7 +307,6 @@
}
};
-const double ThreadFactoryTests::TEST_TOLERANCE = .20;
}
}
}