summaryrefslogtreecommitdiff
path: root/src/mongo/db/auth/authorization_manager_impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/auth/authorization_manager_impl.cpp')
-rw-r--r--src/mongo/db/auth/authorization_manager_impl.cpp53
1 files changed, 39 insertions, 14 deletions
diff --git a/src/mongo/db/auth/authorization_manager_impl.cpp b/src/mongo/db/auth/authorization_manager_impl.cpp
index 603cf4c924c..a1314fddee0 100644
--- a/src/mongo/db/auth/authorization_manager_impl.cpp
+++ b/src/mongo/db/auth/authorization_manager_impl.cpp
@@ -285,8 +285,10 @@ Status initializeUserFromPrivilegeDocument(User* user, const BSONObj& privDoc) {
return Status::OK();
}
-std::unique_ptr<AuthorizationManager> authorizationManagerCreateImpl() {
- return std::make_unique<AuthorizationManagerImpl>();
+std::unique_ptr<AuthorizationManager> authorizationManagerCreateImpl(
+ ServiceContext* serviceContext) {
+ return std::make_unique<AuthorizationManagerImpl>(serviceContext,
+ AuthzManagerExternalState::create());
}
auto authorizationManagerCreateRegistration =
@@ -310,17 +312,35 @@ Status AuthorizationManagerPinnedUsersServerParameter::setFromString(const std::
return authorizationManagerPinnedUsers.setFromString(str);
}
-AuthorizationManagerImpl::AuthorizationManagerImpl()
- : AuthorizationManagerImpl(AuthzManagerExternalState::create(),
- InstallMockForTestingOrAuthImpl{}) {}
-
AuthorizationManagerImpl::AuthorizationManagerImpl(
- std::unique_ptr<AuthzManagerExternalState> externalState, InstallMockForTestingOrAuthImpl)
+ ServiceContext* service, std::unique_ptr<AuthzManagerExternalState> externalState)
: _externalState(std::move(externalState)),
- _authSchemaVersionCache(_externalState.get()),
- _userCache(&_authSchemaVersionCache, _externalState.get(), authorizationManagerCacheSize) {}
+ _threadPool([] {
+ ThreadPool::Options options;
+ options.poolName = "AuthorizationManager";
+ options.minThreads = 0;
+ options.maxThreads = ThreadPool::Options::kUnlimited;
+
+ // Ensure all threads have a client
+ options.onCreateThread = [](const std::string& threadName) {
+ Client::initThread(threadName.c_str());
+ };
-AuthorizationManagerImpl::~AuthorizationManagerImpl() {}
+ return options;
+ }()),
+ _authSchemaVersionCache(service, _threadPool, _externalState.get()),
+ _userCache(service,
+ _threadPool,
+ authorizationManagerCacheSize,
+ &_authSchemaVersionCache,
+ _externalState.get()) {
+ _threadPool.startup();
+}
+
+AuthorizationManagerImpl::~AuthorizationManagerImpl() {
+ _threadPool.shutdown();
+ _threadPool.join();
+}
std::unique_ptr<AuthorizationSession> AuthorizationManagerImpl::makeAuthorizationSession() {
return std::make_unique<AuthorizationSessionImpl>(
@@ -593,8 +613,11 @@ std::vector<AuthorizationManager::CachedUserInfo> AuthorizationManagerImpl::getU
}
AuthorizationManagerImpl::AuthSchemaVersionCache::AuthSchemaVersionCache(
+ ServiceContext* service,
+ ThreadPoolInterface& threadPool,
AuthzManagerExternalState* externalState)
- : ReadThroughCache(1, _mutex), _externalState(externalState) {}
+ : ReadThroughCache(_mutex, service, threadPool, 1 /* cacheSize */),
+ _externalState(externalState) {}
boost::optional<int> AuthorizationManagerImpl::AuthSchemaVersionCache::lookup(
OperationContext* opCtx, const int& unusedKey) {
@@ -607,10 +630,12 @@ boost::optional<int> AuthorizationManagerImpl::AuthSchemaVersionCache::lookup(
}
AuthorizationManagerImpl::UserCacheImpl::UserCacheImpl(
+ ServiceContext* service,
+ ThreadPoolInterface& threadPool,
+ int cacheSize,
AuthSchemaVersionCache* authSchemaVersionCache,
- AuthzManagerExternalState* externalState,
- int cacheSize)
- : UserCache(cacheSize, _mutex),
+ AuthzManagerExternalState* externalState)
+ : UserCache(_mutex, service, threadPool, cacheSize),
_authSchemaVersionCache(authSchemaVersionCache),
_externalState(externalState) {}