@@ -115,7 +115,7 @@ class DatabaseNameHints : public IHints<>
115115 const bool need_to_check_access_for_databases = !access->isGranted (AccessType::SHOW_DATABASES);
116116
117117 Names result;
118- auto databases_list = database_catalog.getDatabases ();
118+ auto databases_list = database_catalog.getDatabases (GetDatabasesOptions{. with_datalake_catalogs = true } );
119119 for (const auto & database_name : databases_list | boost::adaptors::map_keys)
120120 {
121121 if (need_to_check_access_for_databases && !access->isGranted (AccessType::SHOW_DATABASES, database_name))
@@ -341,7 +341,10 @@ void DatabaseCatalog::shutdownImpl(std::function<void()> shutdown_system_logs)
341341 auto it = std::find_if (elem.map .begin (), elem.map .end (), not_empty_mapping);
342342 return it != elem.map .end ();
343343 }) == uuid_map.end ());
344+
344345 databases.clear ();
346+ databases_without_datalake_catalogs.clear ();
347+
345348 referential_dependencies.clear ();
346349 loading_dependencies.clear ();
347350 view_dependencies.clear ();
@@ -576,6 +579,18 @@ void DatabaseCatalog::assertDatabaseExists(const String & database_name) const
576579 }
577580}
578581
582+ bool DatabaseCatalog::hasDatalakeCatalogs () const
583+ {
584+ std::lock_guard lock{databases_mutex};
585+ return databases.size () != databases_without_datalake_catalogs.size ();
586+ }
587+
588+ bool DatabaseCatalog::isDatalakeCatalog (const String & database_name) const
589+ {
590+ std::lock_guard lock{databases_mutex};
591+ return databases.contains (database_name) && !databases_without_datalake_catalogs.contains (database_name);
592+ }
593+
579594void DatabaseCatalog::assertDatabaseDoesntExist (const String & database_name) const
580595{
581596 std::lock_guard lock{databases_mutex};
@@ -594,6 +609,9 @@ void DatabaseCatalog::attachDatabase(const String & database_name, const Databas
594609 std::lock_guard lock{databases_mutex};
595610 assertDatabaseDoesntExistUnlocked (database_name);
596611 databases.emplace (database_name, database);
612+ if (!database->isDatalakeCatalog ())
613+ databases_without_datalake_catalogs.emplace (database_name, database);
614+
597615 NOEXCEPT_SCOPE ({
598616 UUID db_uuid = database->getUUID ();
599617 if (db_uuid != UUIDHelpers::Nil)
@@ -618,8 +636,9 @@ DatabasePtr DatabaseCatalog::detachDatabase(ContextPtr local_context, const Stri
618636 if (db_uuid != UUIDHelpers::Nil)
619637 removeUUIDMapping (db_uuid);
620638 databases.erase (database_name);
621-
622639 }
640+ if (auto it = databases_without_datalake_catalogs.find (database_name); it != databases_without_datalake_catalogs.end ())
641+ databases_without_datalake_catalogs.erase (it);
623642 }
624643 if (!db)
625644 {
@@ -685,7 +704,13 @@ void DatabaseCatalog::updateDatabaseName(const String & old_name, const String &
685704 databases.erase (it);
686705 databases.emplace (new_name, db);
687706
688- // / Update dependencies.
707+ auto no_catalogs_it = databases_without_datalake_catalogs.find (old_name);
708+ if (no_catalogs_it != databases_without_datalake_catalogs.end ())
709+ {
710+ databases_without_datalake_catalogs.erase (no_catalogs_it);
711+ databases_without_datalake_catalogs.emplace (new_name, db);
712+ }
713+
689714 for (const auto & table_name : tables_in_database)
690715 {
691716 auto removed_ref_deps = referential_dependencies.removeDependencies (StorageID{old_name, table_name}, /* remove_isolated_tables= */ true );
@@ -806,10 +831,13 @@ bool DatabaseCatalog::isDatabaseExist(const String & database_name) const
806831 return databases.end () != databases.find (database_name);
807832}
808833
809- Databases DatabaseCatalog::getDatabases () const
834+ Databases DatabaseCatalog::getDatabases (GetDatabasesOptions options ) const
810835{
811836 std::lock_guard lock{databases_mutex};
812- return databases;
837+ if (options.with_datalake_catalogs )
838+ return databases;
839+
840+ return databases_without_datalake_catalogs;
813841}
814842
815843bool DatabaseCatalog::isTableExist (const DB::StorageID & table_id, ContextPtr context_) const
@@ -1075,7 +1103,7 @@ void DatabaseCatalog::loadMarkedAsDroppedTables()
10751103 std::map<String, std::pair<StorageID, DiskPtr>> dropped_metadata;
10761104 String path = fs::path (" metadata_dropped" ) / " " ;
10771105
1078- auto db_map = getDatabases ();
1106+ auto db_map = getDatabases (GetDatabasesOptions{. with_datalake_catalogs = true } );
10791107 std::set<DiskPtr> metadata_disk_list;
10801108 for (const auto & [_, db] : db_map)
10811109 {
@@ -1965,7 +1993,7 @@ void DatabaseCatalog::reloadDisksTask()
19651993 disks.swap (disks_to_reload);
19661994 }
19671995
1968- for (auto & database : getDatabases ())
1996+ for (auto & database : getDatabases (GetDatabasesOptions{. with_datalake_catalogs = false } ))
19691997 {
19701998 // WARNING: In case of `async_load_databases = true` getTablesIterator() call wait for all table in the database to be loaded.
19711999 // WARNING: It means that no database will be able to update configuration until all databases are fully loaded.
@@ -2120,7 +2148,8 @@ std::pair<String, String> TableNameHints::getExtendedHintForTable(const String &
21202148{
21212149 // / load all available databases from the DatabaseCatalog instance
21222150 auto & database_catalog = DatabaseCatalog::instance ();
2123- auto all_databases = database_catalog.getDatabases ();
2151+ // / NOTE Skip datalake catalogs to avoid unnecessary access to remote catalogs (can be expensive)
2152+ auto all_databases = database_catalog.getDatabases (GetDatabasesOptions{.with_datalake_catalogs = false });
21242153
21252154 for (const auto & [db_name, db] : all_databases)
21262155 {
0 commit comments