From 25122c60597d66c1901502c1fd1c203392d4963e Mon Sep 17 00:00:00 2001 From: Jordi Olivares Provencio Date: Thu, 24 Mar 2022 15:24:33 +0000 Subject: SERVER-64170 Move ticket holders from LockManager to TicketHolders --- src/mongo/db/concurrency/SConscript | 1 + src/mongo/db/concurrency/d_concurrency_test.cpp | 17 +++++++---------- src/mongo/db/concurrency/lock_manager.cpp | 19 ------------------- src/mongo/db/concurrency/lock_manager.h | 16 ---------------- src/mongo/db/concurrency/lock_state.cpp | 9 +++++---- 5 files changed, 13 insertions(+), 49 deletions(-) (limited to 'src/mongo/db/concurrency') diff --git a/src/mongo/db/concurrency/SConscript b/src/mongo/db/concurrency/SConscript index 97be34b25aa..848de10e74e 100644 --- a/src/mongo/db/concurrency/SConscript +++ b/src/mongo/db/concurrency/SConscript @@ -62,6 +62,7 @@ env.Library( LIBDEPS=[ '$BUILD_DIR/mongo/base', '$BUILD_DIR/mongo/db/service_context', + '$BUILD_DIR/mongo/db/storage/storage_engine_parameters', '$BUILD_DIR/mongo/util/background_job', '$BUILD_DIR/mongo/util/concurrency/spin_lock', '$BUILD_DIR/mongo/util/concurrency/ticketholder', diff --git a/src/mongo/db/concurrency/d_concurrency_test.cpp b/src/mongo/db/concurrency/d_concurrency_test.cpp index 9b359b9b6c4..905f3c9a366 100644 --- a/src/mongo/db/concurrency/d_concurrency_test.cpp +++ b/src/mongo/db/concurrency/d_concurrency_test.cpp @@ -43,6 +43,7 @@ #include "mongo/db/concurrency/write_conflict_exception.h" #include "mongo/db/service_context_d_test_fixture.h" #include "mongo/db/storage/recovery_unit_noop.h" +#include "mongo/db/storage/ticketholders.h" #include "mongo/logv2/log.h" #include "mongo/stdx/future.h" #include "mongo/stdx/thread.h" @@ -69,19 +70,15 @@ const auto kMaxClockJitterMillis = Milliseconds(0); */ class UseGlobalThrottling { public: - explicit UseGlobalThrottling(OperationContext* opCtx, int numTickets) : _opCtx(opCtx) { - auto lockManager = LockManager::get(_opCtx); - lockManager->setTicketHolders(std::make_unique(numTickets), - std::make_unique(numTickets)); + explicit UseGlobalThrottling(OperationContext* opCtx, int numTickets) { + auto& ticketHolders = ticketHoldersDecoration(getGlobalServiceContext()); + ticketHolders.setGlobalThrottling(std::make_unique(numTickets), + std::make_unique(numTickets)); } ~UseGlobalThrottling() noexcept(false) { - // Reset the global setting as we're about to destroy the ticket holder. - auto lockManager = LockManager::get(_opCtx); - lockManager->setTicketHolders(nullptr, nullptr); + auto& ticketHolders = ticketHoldersDecoration(getGlobalServiceContext()); + ticketHolders.setGlobalThrottling(nullptr, nullptr); } - -private: - OperationContext* _opCtx; }; diff --git a/src/mongo/db/concurrency/lock_manager.cpp b/src/mongo/db/concurrency/lock_manager.cpp index 5650d282ee6..0737febeb25 100644 --- a/src/mongo/db/concurrency/lock_manager.cpp +++ b/src/mongo/db/concurrency/lock_manager.cpp @@ -47,7 +47,6 @@ #include "mongo/db/service_context.h" #include "mongo/logv2/log.h" #include "mongo/util/assert_util.h" -#include "mongo/util/concurrency/ticketholder.h" #include "mongo/util/decorable.h" #include "mongo/util/str.h" #include "mongo/util/timer.h" @@ -879,24 +878,6 @@ void LockManager::getLockInfoBSON(const std::map& lockToClien _buildLocksArray(lockToClientMap, false, this, &lockInfoArr); } -void LockManager::setTicketHolders(std::unique_ptr reading, - std::unique_ptr writing) { - _readingTicketholder = std::move(reading); - _writingTicketholder = std::move(writing); -} - -TicketHolder* LockManager::getTicketHolder(LockMode mode) { - switch (mode) { - case MODE_IS: - case MODE_S: - return _readingTicketholder.get(); - case MODE_IX: - return _writingTicketholder.get(); - default: - return nullptr; - } -} - void LockManager::_buildLocksArray(const std::map& lockToClientMap, bool forLogging, LockManager* mutableThis, diff --git a/src/mongo/db/concurrency/lock_manager.h b/src/mongo/db/concurrency/lock_manager.h index 594e42057b8..e54524489c1 100644 --- a/src/mongo/db/concurrency/lock_manager.h +++ b/src/mongo/db/concurrency/lock_manager.h @@ -49,7 +49,6 @@ namespace mongo { class OperationContext; class ServiceContext; -class TicketHolder; /** * Entry point for the lock manager scheduling functionality. Don't use it directly, but @@ -168,18 +167,6 @@ public: void getLockInfoBSON(const std::map& lockToClientMap, BSONObjBuilder* result); - /** - * Sets the TicketHolder implementation to use to obtain tickets from 'reading' (for MODE_S and - * MODE_IS), and from 'writing' (for MODE_IX) in order to throttle database access. There is no - * throttling for MODE_X, as there can only ever be a single locker using this mode. The - * throttling is intended to defend against large drops in throughput under high load due to too - * much concurrency. - */ - void setTicketHolders(std::unique_ptr readTickets, - std::unique_ptr writeTickets); - - TicketHolder* getTicketHolder(LockMode mode); - private: // The lockheads need access to the partitions friend struct LockHead; @@ -250,8 +237,5 @@ private: static const unsigned _numPartitions; Partition* _partitions; - - std::unique_ptr _readingTicketholder; - std::unique_ptr _writingTicketholder; }; } // namespace mongo diff --git a/src/mongo/db/concurrency/lock_state.cpp b/src/mongo/db/concurrency/lock_state.cpp index d1f6059ea6c..2675b35759e 100644 --- a/src/mongo/db/concurrency/lock_state.cpp +++ b/src/mongo/db/concurrency/lock_state.cpp @@ -41,6 +41,7 @@ #include "mongo/db/namespace_string.h" #include "mongo/db/service_context.h" #include "mongo/db/storage/flow_control.h" +#include "mongo/db/storage/ticketholders.h" #include "mongo/logv2/log.h" #include "mongo/platform/compiler.h" #include "mongo/stdx/new.h" @@ -359,8 +360,8 @@ void LockerImpl::reacquireTicket(OperationContext* opCtx) { bool LockerImpl::_acquireTicket(OperationContext* opCtx, LockMode mode, Date_t deadline) { const bool reader = isSharedLockMode(mode); - auto lockManager = getGlobalLockManager(); - auto holder = shouldAcquireTicket() ? lockManager->getTicketHolder(mode) : nullptr; + auto& ticketHolders = ticketHoldersDecoration(getGlobalServiceContext()); + auto holder = shouldAcquireTicket() ? ticketHolders.getTicketHolder(mode) : nullptr; if (holder) { _clientState.store(reader ? kQueuedReader : kQueuedWriter); @@ -1069,8 +1070,8 @@ void LockerImpl::releaseTicket() { } void LockerImpl::_releaseTicket() { - auto ticketManager = getGlobalLockManager(); - auto holder = shouldAcquireTicket() ? ticketManager->getTicketHolder(_modeForTicket) : nullptr; + auto& ticketHolders = ticketHoldersDecoration(getGlobalServiceContext()); + auto holder = shouldAcquireTicket() ? ticketHolders.getTicketHolder(_modeForTicket) : nullptr; if (holder) { holder->release(); } -- cgit v1.2.1