summaryrefslogtreecommitdiff
path: root/src/mongo/db/s
diff options
context:
space:
mode:
authorAndy Schwerin <schwerin@mongodb.com>2016-05-02 10:55:01 -0400
committerAndy Schwerin <schwerin@mongodb.com>2016-05-23 10:28:31 -0400
commit2e627487ef0475c46143b5f57d3e7c3d3027d5dc (patch)
tree7ad552be9a3cae113bc3cfd9df0faea78aa50e24 /src/mongo/db/s
parentc9aac9d6eaba6ef2eb8903f07e997b594e88addc (diff)
downloadmongo-2e627487ef0475c46143b5f57d3e7c3d3027d5dc.tar.gz
SERVER-18277 Track elapsed time on cursors using microsecond resolution on OperationContext.
This completes the mechanics of moving max-time tracking to OperationContext and switching the checkForInterrupt checks to use the service context's fast clock source, while tracking the amount of execution time remaining on a cursor with microsecond granularity to ensure that remaining execution time always declines, even for very brief operations on cursors. This patch does not complete the transition from wait_for waiting to wait_until waiting in all places that do waiting based on operation deadlines.
Diffstat (limited to 'src/mongo/db/s')
-rw-r--r--src/mongo/db/s/operation_sharding_state.cpp10
-rw-r--r--src/mongo/db/s/sharding_state.cpp21
-rw-r--r--src/mongo/db/s/sharding_state_test.cpp2
3 files changed, 9 insertions, 24 deletions
diff --git a/src/mongo/db/s/operation_sharding_state.cpp b/src/mongo/db/s/operation_sharding_state.cpp
index 01a0132df07..c6fe82ff6d0 100644
--- a/src/mongo/db/s/operation_sharding_state.cpp
+++ b/src/mongo/db/s/operation_sharding_state.cpp
@@ -40,7 +40,7 @@ const OperationContext::Decoration<OperationShardingState> shardingMetadataDecor
OperationContext::declareDecoration<OperationShardingState>();
// Max time to wait for the migration critical section to complete
-const Minutes kMaxWaitForMigrationCriticalSection(5);
+const Microseconds kMaxWaitForMigrationCriticalSection = Minutes(5);
} // namespace mongo
@@ -101,12 +101,10 @@ bool OperationShardingState::waitForMigrationCriticalSection(OperationContext* t
invariant(!txn->lockState()->isLocked());
if (_migrationCriticalSection) {
- const Microseconds operationRemainingTime(
- Microseconds(static_cast<int64_t>(txn->getRemainingMaxTimeMicros())));
_migrationCriticalSection->waitUntilOutOfCriticalSection(
- durationCount<Microseconds>(operationRemainingTime)
- ? operationRemainingTime
- : Microseconds{kMaxWaitForMigrationCriticalSection});
+ txn->hasDeadline()
+ ? std::min(txn->getRemainingMaxTimeMicros(), kMaxWaitForMigrationCriticalSection)
+ : kMaxWaitForMigrationCriticalSection);
_migrationCriticalSection = nullptr;
return true;
}
diff --git a/src/mongo/db/s/sharding_state.cpp b/src/mongo/db/s/sharding_state.cpp
index 0d89f81f678..c69fe446a90 100644
--- a/src/mongo/db/s/sharding_state.cpp
+++ b/src/mongo/db/s/sharding_state.cpp
@@ -122,20 +122,6 @@ VersionChoice chooseNewestVersion(ChunkVersion prevLocalVersion,
return VersionChoice::Remote;
}
-Date_t getDeadlineFromMaxTimeMS(OperationContext* txn) {
- auto remainingTime = txn->getRemainingMaxTimeMicros();
- if (remainingTime == 0) {
- return Date_t::max();
- }
-
- if (remainingTime == 1) {
- // 1 means maxTimeMS has exceeded.
- return Date_t::now();
- }
-
- return Date_t::now() + Microseconds(static_cast<int64_t>(remainingTime));
-}
-
/**
* Updates the config server field of the shardIdentity document with the given connection string
* if setName is equal to the config server replica set name.
@@ -401,7 +387,7 @@ void ShardingState::initializeFromConfigConnString(OperationContext* txn, const
}
}
- uassertStatusOK(_waitForInitialization(getDeadlineFromMaxTimeMS(txn)));
+ uassertStatusOK(_waitForInitialization(txn->getDeadline()));
uassertStatusOK(reloadShardRegistryUntilSuccess(txn));
updateConfigServerOpTimeFromMetadata(txn);
}
@@ -432,8 +418,7 @@ Status ShardingState::initializeFromShardIdentity(OperationContext* txn) {
return parseStatus.getStatus();
}
- auto status =
- initializeFromShardIdentity(parseStatus.getValue(), getDeadlineFromMaxTimeMS(txn));
+ auto status = initializeFromShardIdentity(parseStatus.getValue(), txn->getDeadline());
if (!status.isOK()) {
return status;
}
@@ -636,7 +621,7 @@ Status ShardingState::_refreshMetadata(OperationContext* txn,
ChunkVersion* latestShardVersion) {
invariant(!txn->lockState()->isLocked());
- Status status = _waitForInitialization(getDeadlineFromMaxTimeMS(txn));
+ Status status = _waitForInitialization(txn->getDeadline());
if (!status.isOK())
return status;
diff --git a/src/mongo/db/s/sharding_state_test.cpp b/src/mongo/db/s/sharding_state_test.cpp
index 1f5eecf6f21..44d5cb7de24 100644
--- a/src/mongo/db/s/sharding_state_test.cpp
+++ b/src/mongo/db/s/sharding_state_test.cpp
@@ -52,6 +52,7 @@
#include "mongo/s/query/cluster_cursor_manager.h"
#include "mongo/unittest/unittest.h"
#include "mongo/util/clock_source_mock.h"
+#include "mongo/util/tick_source_mock.h"
namespace mongo {
@@ -117,6 +118,7 @@ public:
void setUp() override {
_service.setFastClockSource(stdx::make_unique<ClockSourceMock>());
_service.setPreciseClockSource(stdx::make_unique<ClockSourceMock>());
+ _service.setTickSource(stdx::make_unique<TickSourceMock>());
serverGlobalParams.clusterRole = ClusterRole::ShardServer;
_client = _service.makeClient("ShardingStateTest");