diff --git a/dbms/src/Interpreters/Context.cpp b/dbms/src/Interpreters/Context.cpp index 9452fb9d5ddd..8239841897de 100644 --- a/dbms/src/Interpreters/Context.cpp +++ b/dbms/src/Interpreters/Context.cpp @@ -897,18 +897,18 @@ StoragePtr Context::executeTableFunction(const ASTPtr & table_expression) } -DDLGuard::DDLGuard(Map & map_, std::mutex & guards_mutex_, std::unique_lock && lock, const String & elem) - : map(map_), guards_mutex(guards_mutex_) +DDLGuard::DDLGuard(Map & map_, std::unique_lock guards_lock_, const String & elem) + : map(map_), guards_lock(std::move(guards_lock_)) { it = map.emplace(elem, Entry{std::make_unique(), 0}).first; ++it->second.counter; - lock.unlock(); + guards_lock.unlock(); table_lock = std::unique_lock(*it->second.mutex); } DDLGuard::~DDLGuard() { - std::lock_guard lock(guards_mutex); + guards_lock.lock(); --it->second.counter; if (!it->second.counter) { @@ -920,7 +920,7 @@ DDLGuard::~DDLGuard() std::unique_ptr Context::getDDLGuard(const String & database, const String & table) const { std::unique_lock lock(shared->ddl_guards_mutex); - return std::make_unique(shared->ddl_guards[database], shared->ddl_guards_mutex, std::move(lock), table); + return std::make_unique(shared->ddl_guards[database], std::move(lock), table); } diff --git a/dbms/src/Interpreters/Context.h b/dbms/src/Interpreters/Context.h index 0237ea804c21..7a4682ef2052 100644 --- a/dbms/src/Interpreters/Context.h +++ b/dbms/src/Interpreters/Context.h @@ -481,13 +481,13 @@ class DDLGuard /// NOTE: using std::map here (and not std::unordered_map) to avoid iterator invalidation on insertion. using Map = std::map; - DDLGuard(Map & map_, std::mutex & guards_mutex_, std::unique_lock && guards_lock, const String & elem); + DDLGuard(Map & map_, std::unique_lock guards_lock_, const String & elem); ~DDLGuard(); private: Map & map; Map::iterator it; - std::mutex & guards_mutex; + std::unique_lock guards_lock; std::unique_lock table_lock; };