diff options
author | Jonathan Reams <jbreams@mongodb.com> | 2017-02-17 16:10:58 -0500 |
---|---|---|
committer | Jonathan Reams <jbreams@mongodb.com> | 2017-03-06 13:04:59 -0500 |
commit | 65bc8f25d7e76e23e7380f81ee033537ba9e8866 (patch) | |
tree | 7282dc295adead074e53e58bf35a675ca7fd51d5 | |
parent | 634d4d14de76491e5e0a4ab27922e55e89ceafe7 (diff) | |
download | mongo-65bc8f25d7e76e23e7380f81ee033537ba9e8866.tar.gz |
SERVER-27863 Reschedule early alarms in NetworkInterfaceASIO
(cherry picked from commit f725e5137561ba5a521d0f5eb6a60bdeebf34c24)
-rw-r--r-- | src/mongo/executor/network_interface_asio.cpp | 12 | ||||
-rw-r--r-- | src/mongo/executor/thread_pool_task_executor.cpp | 1 |
2 files changed, 11 insertions, 2 deletions
diff --git a/src/mongo/executor/network_interface_asio.cpp b/src/mongo/executor/network_interface_asio.cpp index 1fec733704d..6b3ad4fc687 100644 --- a/src/mongo/executor/network_interface_asio.cpp +++ b/src/mongo/executor/network_interface_asio.cpp @@ -477,7 +477,17 @@ Status NetworkInterfaceASIO::setAlarm(Date_t when, const stdx::function<void()>& return exceptionToStatus(); } - alarm->async_wait([alarm, this, action](std::error_code ec) { + alarm->async_wait([alarm, this, action, when](std::error_code ec) { + const auto nowValue = now(); + if (nowValue < when) { + warning() << "ASIO alarm returned early. Expected at: " << when + << ", fired at: " << nowValue; + const auto status = setAlarm(when, action); + if ((!status.isOK()) && (status.code() != ErrorCodes::ShutdownInProgress)) { + fassertFailedWithStatus(40383, status); + } + return; + } if (!ec) { return action(); } else if (ec != asio::error::operation_aborted) { diff --git a/src/mongo/executor/thread_pool_task_executor.cpp b/src/mongo/executor/thread_pool_task_executor.cpp index 7916c316a82..f1f990df41b 100644 --- a/src/mongo/executor/thread_pool_task_executor.cpp +++ b/src/mongo/executor/thread_pool_task_executor.cpp @@ -292,7 +292,6 @@ StatusWith<TaskExecutor::CallbackHandle> ThreadPoolTaskExecutor::scheduleWorkAt( if (cbState->canceled.load()) { return; } - invariant(now() >= when); stdx::unique_lock<stdx::mutex> lk(_mutex); if (cbState->canceled.load()) { return; |