Implement user caching to speed up PullPlan (#1109)

This commit is contained in:
andrejtonev 2023-08-01 23:04:35 +02:00 committed by GitHub
parent f0bac53e7b
commit 5bbed6ef9a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 10 additions and 5 deletions

View File

@ -95,12 +95,14 @@ std::unique_ptr<memgraph::query::FineGrainedAuthChecker> AuthChecker::GetFineGra
} }
try { try {
auto locked_auth = auth_->Lock(); auto locked_auth = auth_->Lock();
auto user = locked_auth->GetUser(username); if (username != user_.username()) {
if (!user) { auto maybe_user = locked_auth->GetUser(username);
if (!maybe_user) {
throw memgraph::query::QueryRuntimeException("User '{}' doesn't exist .", username); throw memgraph::query::QueryRuntimeException("User '{}' doesn't exist .", username);
} }
user_ = std::move(*maybe_user);
return std::make_unique<memgraph::glue::FineGrainedAuthChecker>(std::move(*user), dba); }
return std::make_unique<memgraph::glue::FineGrainedAuthChecker>(user_, dba);
} catch (const memgraph::auth::AuthException &e) { } catch (const memgraph::auth::AuthException &e) {
throw memgraph::query::QueryRuntimeException(e.what()); throw memgraph::query::QueryRuntimeException(e.what());

View File

@ -39,6 +39,7 @@ class AuthChecker : public query::AuthChecker {
private: private:
memgraph::utils::Synchronized<memgraph::auth::Auth, memgraph::utils::WritePrioritizedRWLock> *auth_; memgraph::utils::Synchronized<memgraph::auth::Auth, memgraph::utils::WritePrioritizedRWLock> *auth_;
mutable auth::User user_;
}; };
#ifdef MG_ENTERPRISE #ifdef MG_ENTERPRISE
class FineGrainedAuthChecker : public query::FineGrainedAuthChecker { class FineGrainedAuthChecker : public query::FineGrainedAuthChecker {

View File

@ -1221,6 +1221,8 @@ PullPlan::PullPlan(const std::shared_ptr<CachedPlan> plan, const Parameters &par
ctx_.evaluation_context.labels = NamesToLabels(plan->ast_storage().labels_, dba); ctx_.evaluation_context.labels = NamesToLabels(plan->ast_storage().labels_, dba);
#ifdef MG_ENTERPRISE #ifdef MG_ENTERPRISE
if (license::global_license_checker.IsEnterpriseValidFast() && username.has_value() && dba) { if (license::global_license_checker.IsEnterpriseValidFast() && username.has_value() && dba) {
// TODO How can we avoid creating this every time? If we must create it, it would be faster with an auth::User
// instead of the username
auto auth_checker = interpreter_context->auth_checker->GetFineGrainedAuthChecker(*username, dba); auto auth_checker = interpreter_context->auth_checker->GetFineGrainedAuthChecker(*username, dba);
// if the user has global privileges to read, edit and write anything, we don't need to perform authorization // if the user has global privileges to read, edit and write anything, we don't need to perform authorization