summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Reams <jbreams@mongodb.com>2017-02-17 16:10:58 -0500
committerJonathan Reams <jbreams@mongodb.com>2017-03-06 13:04:59 -0500
commit65bc8f25d7e76e23e7380f81ee033537ba9e8866 (patch)
tree7282dc295adead074e53e58bf35a675ca7fd51d5
parent634d4d14de76491e5e0a4ab27922e55e89ceafe7 (diff)
downloadmongo-65bc8f25d7e76e23e7380f81ee033537ba9e8866.tar.gz
SERVER-27863 Reschedule early alarms in NetworkInterfaceASIO
(cherry picked from commit f725e5137561ba5a521d0f5eb6a60bdeebf34c24)
-rw-r--r--src/mongo/executor/network_interface_asio.cpp12
-rw-r--r--src/mongo/executor/thread_pool_task_executor.cpp1
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;