summaryrefslogtreecommitdiff
path: root/src/mongo/db/concurrency
diff options
context:
space:
mode:
authorJordi Olivares Provencio <jordi.olivares-provencio@mongodb.com>2022-03-24 15:24:33 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-03-24 17:22:13 +0000
commit25122c60597d66c1901502c1fd1c203392d4963e (patch)
tree999628899ad2948e4a594b2a81e34747ada9696c /src/mongo/db/concurrency
parent40f0364a98fcb7d008a7a834db759dc0aada1e4b (diff)
downloadmongo-25122c60597d66c1901502c1fd1c203392d4963e.tar.gz
SERVER-64170 Move ticket holders from LockManager to TicketHolders
Diffstat (limited to 'src/mongo/db/concurrency')
-rw-r--r--src/mongo/db/concurrency/SConscript1
-rw-r--r--src/mongo/db/concurrency/d_concurrency_test.cpp17
-rw-r--r--src/mongo/db/concurrency/lock_manager.cpp19
-rw-r--r--src/mongo/db/concurrency/lock_manager.h16
-rw-r--r--src/mongo/db/concurrency/lock_state.cpp9
5 files changed, 13 insertions, 49 deletions
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<SemaphoreTicketHolder>(numTickets),
- std::make_unique<SemaphoreTicketHolder>(numTickets));
+ explicit UseGlobalThrottling(OperationContext* opCtx, int numTickets) {
+ auto& ticketHolders = ticketHoldersDecoration(getGlobalServiceContext());
+ ticketHolders.setGlobalThrottling(std::make_unique<SemaphoreTicketHolder>(numTickets),
+ std::make_unique<SemaphoreTicketHolder>(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<LockerId, BSONObj>& lockToClien
_buildLocksArray(lockToClientMap, false, this, &lockInfoArr);
}
-void LockManager::setTicketHolders(std::unique_ptr<TicketHolder> reading,
- std::unique_ptr<TicketHolder> 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<LockerId, BSONObj>& 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<LockerId, BSONObj>& 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<TicketHolder> readTickets,
- std::unique_ptr<TicketHolder> 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<TicketHolder> _readingTicketholder;
- std::unique_ptr<TicketHolder> _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();
}