Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions src/Interpreters/Context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1390,20 +1390,21 @@ String Context::getFilesystemCacheUser() const
return shared->filesystem_cache_user;
}

DatabaseAndTable Context::getOrCacheStorage(const StorageID & id, std::function<DatabaseAndTable()> storage_getter, std::optional<Exception> * exception) const
DatabaseAndTable Context::getOrCacheStorage(const StorageID & id, std::function<DatabaseAndTable()> storage_getter) const
{
auto & shard = storage_cache.shards[StorageCache::shardIndex(id)];
std::lock_guard lock(shard.mutex);

if (auto it = shard.set.find(id); it != shard.set.end())
{
DatabaseAndTable storage = DatabaseCatalog::instance().tryGetByUUID(it->uuid);
if (exception && !storage.second)
exception->emplace(Exception(
ErrorCodes::UNKNOWN_TABLE,
"Table {} does not exist anymore - maybe it was dropped",
id.getNameForLogs()));
return storage;
if (storage.second)
return storage;

/// The table was cached but no longer exists by its UUID
/// (e.g. refreshable materialized view's inner table was dropped and recreated).
/// Remove the stale entry and fall through to a fresh lookup by name.
shard.set.erase(it);
Comment on lines +1404 to +1407
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we remove Context::getOrCacheStorage completely then? AFAIR, the reason why it was introduced is specifically to avoid this situation when we use 2 different storages while executing a single query

}

auto storage = storage_getter();
Expand Down
2 changes: 1 addition & 1 deletion src/Interpreters/Context.h
Original file line number Diff line number Diff line change
Expand Up @@ -725,7 +725,7 @@ class Context: public ContextData, public std::enable_shared_from_this<Context>
String getFilesystemCachesPath() const;
String getFilesystemCacheUser() const;

DatabaseAndTable getOrCacheStorage(const StorageID & id, std::function<DatabaseAndTable()> storage_getter, std::optional<Exception> * exception) const;
DatabaseAndTable getOrCacheStorage(const StorageID & id, std::function<DatabaseAndTable()> storage_getter) const;

// Get the disk used by databases to store metadata files.
std::shared_ptr<IDisk> getDatabaseDisk() const;
Expand Down
8 changes: 4 additions & 4 deletions src/Interpreters/DatabaseCatalog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1082,7 +1082,7 @@ StoragePtr DatabaseCatalog::getTable(const StorageID & table_id, ContextPtr loca
{
std::optional<Exception> exc;
auto table = local_context->hasQueryContext() ?
local_context->getQueryContext()->getOrCacheStorage(table_id, [&](){ return getTableImpl(table_id, local_context, &exc); }, &exc).second :
local_context->getQueryContext()->getOrCacheStorage(table_id, [&](){ return getTableImpl(table_id, local_context, &exc); }).second :
getTableImpl(table_id, local_context, &exc).second;
if (!table)
throw Exception(*exc);
Expand All @@ -1092,15 +1092,15 @@ StoragePtr DatabaseCatalog::getTable(const StorageID & table_id, ContextPtr loca
StoragePtr DatabaseCatalog::tryGetTable(const StorageID & table_id, ContextPtr local_context) const
{
return local_context->hasQueryContext() ?
local_context->getQueryContext()->getOrCacheStorage(table_id, [&](){ return getTableImpl(table_id, local_context, nullptr); }, nullptr).second :
local_context->getQueryContext()->getOrCacheStorage(table_id, [&](){ return getTableImpl(table_id, local_context, nullptr); }).second :
getTableImpl(table_id, local_context, nullptr).second;
}

DatabaseAndTable DatabaseCatalog::getDatabaseAndTable(const StorageID & table_id, ContextPtr local_context) const
{
std::optional<Exception> exc;
auto res = local_context->hasQueryContext() ?
local_context->getQueryContext()->getOrCacheStorage(table_id, [&](){ return getTableImpl(table_id, local_context, &exc); }, &exc) :
local_context->getQueryContext()->getOrCacheStorage(table_id, [&](){ return getTableImpl(table_id, local_context, &exc); }) :
getTableImpl(table_id, local_context, &exc);
if (!res.second)
throw Exception(*exc);
Expand All @@ -1110,7 +1110,7 @@ DatabaseAndTable DatabaseCatalog::getDatabaseAndTable(const StorageID & table_id
DatabaseAndTable DatabaseCatalog::tryGetDatabaseAndTable(const StorageID & table_id, ContextPtr local_context) const
{
return local_context->hasQueryContext() ?
local_context->getQueryContext()->getOrCacheStorage(table_id, [&](){ return getTableImpl(table_id, local_context, nullptr); }, nullptr) :
local_context->getQueryContext()->getOrCacheStorage(table_id, [&](){ return getTableImpl(table_id, local_context, nullptr); }) :
getTableImpl(table_id, local_context, nullptr);
}

Expand Down
Loading