This commit is contained in:
kssenii 2023-05-16 13:49:32 +02:00
parent 98769bb433
commit d4ea3ea045

View File

@ -1,6 +1,7 @@
#include <Interpreters/Cache/Metadata.h> #include <Interpreters/Cache/Metadata.h>
#include <Interpreters/Cache/FileCache.h> #include <Interpreters/Cache/FileCache.h>
#include <Interpreters/Cache/FileSegment.h> #include <Interpreters/Cache/FileSegment.h>
#include "Common/Exception.h"
#include <Common/logger_useful.h> #include <Common/logger_useful.h>
#include <filesystem> #include <filesystem>
@ -257,8 +258,6 @@ void CacheMetadata::doCleanup()
} }
locked_metadata->markAsRemoved(); locked_metadata->markAsRemoved();
erase(it);
LOG_DEBUG(log, "Key {} is removed from metadata", cleanup_key);
try try
{ {
@ -272,9 +271,17 @@ void CacheMetadata::doCleanup()
} }
catch (...) catch (...)
{ {
tryLogCurrentException(__PRETTY_FUNCTION__); LOG_ERROR(log, "Error while removing key {}: {}", cleanup_key, getCurrentExceptionMessage(false));
chassert(false); chassert(false);
} }
/// Remove key from metadata AFTER deleting key directory, because otherwise key lock is
/// released before we delete directory from fs and there might be a race:
/// a key, which we just removed, can be added back to cache before we start removing key directory,
/// which makes key directory either non-empty (and we get exception in try catch above)
/// or we removed directory while another thread thinks it exists.
erase(it);
LOG_DEBUG(log, "Key {} is removed from metadata", cleanup_key);
} }
} }