changed ExternalLoader::getObjectsMap return type [#CLICKHOUSE-3305]

This commit is contained in:
Nikolai Kochetov 2017-10-26 17:26:03 +03:00
parent 092567af39
commit 371e234f01
4 changed files with 18 additions and 8 deletions

View File

@ -27,7 +27,7 @@ void DatabaseDictionary::loadTables(Context & context, ThreadPool * thread_pool,
Tables DatabaseDictionary::loadTables()
{
auto objects_map = external_dictionaries.getObjectsMap();
const auto & dictionaries = std::get<1>(objects_map);
const auto & dictionaries = objects_map.get();
Tables tables;
for (const auto & pair : dictionaries)
@ -52,7 +52,7 @@ bool DatabaseDictionary::isTableExist(
const String & table_name) const
{
auto objects_map = external_dictionaries.getObjectsMap();
const auto & dictionaries = std::get<1>(objects_map);
const auto & dictionaries = objects_map.get();
return dictionaries.count(table_name) && !deleted_tables.count(table_name);
}
@ -61,7 +61,7 @@ StoragePtr DatabaseDictionary::tryGetTable(
const String & table_name)
{
auto objects_map = external_dictionaries.getObjectsMap();
const auto & dictionaries = std::get<1>(objects_map);
const auto & dictionaries = objects_map.get();
if (deleted_tables.count(table_name))
return {};
@ -90,7 +90,7 @@ DatabaseIteratorPtr DatabaseDictionary::getIterator(const Context & context)
bool DatabaseDictionary::empty(const Context & context) const
{
auto objects_map = external_dictionaries.getObjectsMap();
const auto & dictionaries = std::get<1>(objects_map);
const auto & dictionaries = objects_map.get();
for (const auto & pair : dictionaries)
if (pair.second.loadable && !deleted_tables.count(pair.first))
return false;

View File

@ -425,9 +425,9 @@ ExternalLoader::LoadablePtr ExternalLoader::getLoadable(const std::string & name
return it->second.loadable;
}
std::tuple<std::unique_lock<std::mutex>, const ExternalLoader::ObjectsMap &> ExternalLoader::getObjectsMap() const
ExternalLoader::LockedObjectsMap ExternalLoader::getObjectsMap() const
{
return std::make_tuple(std::unique_lock<std::mutex>(map_mutex), std::cref(loadable_objects));
return LockedObjectsMap(map_mutex, loadable_objects);
}
}

View File

@ -101,8 +101,18 @@ protected:
virtual std::unique_ptr<IExternalLoadable> create(const std::string & name, const Configuration & config,
const std::string & config_prefix) = 0;
class LockedObjectsMap
{
public:
LockedObjectsMap(std::mutex & mutex, const ObjectsMap & objectsMap) : lock(mutex), objectsMap(objectsMap) {}
const ObjectsMap & get() { return objectsMap; }
private:
std::unique_lock<std::mutex> lock;
const ObjectsMap & objectsMap;
};
/// Direct access to objects.
std::tuple<std::unique_lock<std::mutex>, const ObjectsMap &> getObjectsMap() const;
LockedObjectsMap getObjectsMap() const;
/// Should be called in derived constructor (to avoid pure virtual call).
void init(bool throw_on_error);

View File

@ -77,7 +77,7 @@ BlockInputStreams StorageSystemDictionaries::read(
const auto & external_dictionaries = context.getExternalDictionaries();
auto objects_map = external_dictionaries.getObjectsMap();
const auto & dictionaries = std::get<1>(objects_map);
const auto & dictionaries = objects_map.get();
for (const auto & dict_info : dictionaries)
{