diff options
author | Andy Schwerin <schwerin@mongodb.com> | 2016-05-02 10:55:01 -0400 |
---|---|---|
committer | Andy Schwerin <schwerin@mongodb.com> | 2016-05-23 10:28:31 -0400 |
commit | 2e627487ef0475c46143b5f57d3e7c3d3027d5dc (patch) | |
tree | 7ad552be9a3cae113bc3cfd9df0faea78aa50e24 /src/mongo/db/s | |
parent | c9aac9d6eaba6ef2eb8903f07e997b594e88addc (diff) | |
download | mongo-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.cpp | 10 | ||||
-rw-r--r-- | src/mongo/db/s/sharding_state.cpp | 21 | ||||
-rw-r--r-- | src/mongo/db/s/sharding_state_test.cpp | 2 |
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"); |