mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-12 17:32:32 +00:00
Add some assertions
This commit is contained in:
parent
55b2e42150
commit
79c14c89ee
@ -48,12 +48,12 @@ const String & FileCache::getBasePath() const
|
|||||||
|
|
||||||
String FileCache::getPathInLocalCache(const Key & key, size_t offset, FileSegmentKind segment_kind) const
|
String FileCache::getPathInLocalCache(const Key & key, size_t offset, FileSegmentKind segment_kind) const
|
||||||
{
|
{
|
||||||
return metadata.getPathInLocalCache(key, offset, segment_kind);
|
return metadata.getPathForFileSegment(key, offset, segment_kind);
|
||||||
}
|
}
|
||||||
|
|
||||||
String FileCache::getPathInLocalCache(const Key & key) const
|
String FileCache::getPathInLocalCache(const Key & key) const
|
||||||
{
|
{
|
||||||
return metadata.getPathInLocalCache(key);
|
return metadata.getPathForKey(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileCache::assertInitialized() const
|
void FileCache::assertInitialized() const
|
||||||
@ -1019,7 +1019,7 @@ std::vector<String> FileCache::tryGetCachePaths(const Key & key)
|
|||||||
for (const auto & [offset, file_segment_metadata] : *locked_key->getKeyMetadata())
|
for (const auto & [offset, file_segment_metadata] : *locked_key->getKeyMetadata())
|
||||||
{
|
{
|
||||||
if (file_segment_metadata->file_segment->state() == FileSegment::State::DOWNLOADED)
|
if (file_segment_metadata->file_segment->state() == FileSegment::State::DOWNLOADED)
|
||||||
cache_paths.push_back(metadata.getPathInLocalCache(key, offset, file_segment_metadata->file_segment->getKind()));
|
cache_paths.push_back(metadata.getPathForFileSegment(key, offset, file_segment_metadata->file_segment->getKind()));
|
||||||
}
|
}
|
||||||
return cache_paths;
|
return cache_paths;
|
||||||
}
|
}
|
||||||
|
@ -313,6 +313,13 @@ void FileSegment::write(const char * from, size_t size, size_t offset)
|
|||||||
if (!size)
|
if (!size)
|
||||||
throw Exception(ErrorCodes::LOGICAL_ERROR, "Writing zero size is not allowed");
|
throw Exception(ErrorCodes::LOGICAL_ERROR, "Writing zero size is not allowed");
|
||||||
|
|
||||||
|
auto file_segment_path = getPathInLocalCache();
|
||||||
|
if (offset == range().left && fs::exists(file_segment_path))
|
||||||
|
{
|
||||||
|
fs::remove(file_segment_path);
|
||||||
|
chassert(false);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
auto lock = segment_guard.lock();
|
auto lock = segment_guard.lock();
|
||||||
|
|
||||||
@ -365,7 +372,7 @@ void FileSegment::write(const char * from, size_t size, size_t offset)
|
|||||||
|
|
||||||
downloaded_size += size;
|
downloaded_size += size;
|
||||||
|
|
||||||
chassert(std::filesystem::file_size(getPathInLocalCache()) == downloaded_size);
|
chassert(std::filesystem::file_size(file_segment_path) == downloaded_size);
|
||||||
}
|
}
|
||||||
catch (ErrnoException & e)
|
catch (ErrnoException & e)
|
||||||
{
|
{
|
||||||
@ -375,7 +382,7 @@ void FileSegment::write(const char * from, size_t size, size_t offset)
|
|||||||
int code = e.getErrno();
|
int code = e.getErrno();
|
||||||
if (code == /* No space left on device */28 || code == /* Quota exceeded */122)
|
if (code == /* No space left on device */28 || code == /* Quota exceeded */122)
|
||||||
{
|
{
|
||||||
const auto file_size = fs::file_size(getPathInLocalCache());
|
const auto file_size = fs::file_size(file_segment_path);
|
||||||
chassert(downloaded_size <= file_size);
|
chassert(downloaded_size <= file_size);
|
||||||
chassert(reserved_size >= file_size);
|
chassert(reserved_size >= file_size);
|
||||||
if (downloaded_size != file_size)
|
if (downloaded_size != file_size)
|
||||||
@ -520,8 +527,8 @@ void FileSegment::setDownloadedUnlocked(const FileSegmentGuard::Lock &)
|
|||||||
remote_file_reader.reset();
|
remote_file_reader.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
chassert(getDownloadedSize(false) > 0);
|
chassert(downloaded_size > 0);
|
||||||
chassert(fs::file_size(getPathInLocalCache()) > 0);
|
chassert(fs::file_size(getPathInLocalCache()) == downloaded_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileSegment::setDownloadFailedUnlocked(const FileSegmentGuard::Lock & lock)
|
void FileSegment::setDownloadFailedUnlocked(const FileSegmentGuard::Lock & lock)
|
||||||
@ -845,6 +852,7 @@ void FileSegment::detach(const FileSegmentGuard::Lock & lock, const LockedKey &)
|
|||||||
if (download_state == State::DETACHED)
|
if (download_state == State::DETACHED)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!downloader_id.empty())
|
||||||
resetDownloaderUnlocked(lock);
|
resetDownloaderUnlocked(lock);
|
||||||
setDetachedState(lock);
|
setDetachedState(lock);
|
||||||
}
|
}
|
||||||
|
@ -145,15 +145,12 @@ String CacheMetadata::getFileNameForFileSegment(size_t offset, FileSegmentKind s
|
|||||||
return std::to_string(offset) + file_suffix;
|
return std::to_string(offset) + file_suffix;
|
||||||
}
|
}
|
||||||
|
|
||||||
String CacheMetadata::getPathInLocalCache(const Key & key, size_t offset, FileSegmentKind segment_kind) const
|
String CacheMetadata::getPathForFileSegment(const Key & key, size_t offset, FileSegmentKind segment_kind) const
|
||||||
{
|
{
|
||||||
String file_suffix;
|
return fs::path(getPathForKey(key)) / getFileNameForFileSegment(offset, segment_kind);
|
||||||
|
|
||||||
const auto key_str = key.toString();
|
|
||||||
return fs::path(path) / key_str.substr(0, 3) / key_str / getFileNameForFileSegment(offset, segment_kind);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String CacheMetadata::getPathInLocalCache(const Key & key) const
|
String CacheMetadata::getPathForKey(const Key & key) const
|
||||||
{
|
{
|
||||||
const auto key_str = key.toString();
|
const auto key_str = key.toString();
|
||||||
return fs::path(path) / key_str.substr(0, 3) / key_str;
|
return fs::path(path) / key_str.substr(0, 3) / key_str;
|
||||||
@ -178,7 +175,7 @@ LockedKeyPtr CacheMetadata::lockKeyMetadata(
|
|||||||
|
|
||||||
it = emplace(
|
it = emplace(
|
||||||
key, std::make_shared<KeyMetadata>(
|
key, std::make_shared<KeyMetadata>(
|
||||||
key, getPathInLocalCache(key), *cleanup_queue, is_initial_load)).first;
|
key, getPathForKey(key), *cleanup_queue, is_initial_load)).first;
|
||||||
}
|
}
|
||||||
|
|
||||||
key_metadata = it->second;
|
key_metadata = it->second;
|
||||||
@ -260,7 +257,7 @@ void CacheMetadata::doCleanup()
|
|||||||
erase(it);
|
erase(it);
|
||||||
LOG_DEBUG(log, "Key {} is removed from metadata", cleanup_key);
|
LOG_DEBUG(log, "Key {} is removed from metadata", cleanup_key);
|
||||||
|
|
||||||
const fs::path key_directory = getPathInLocalCache(cleanup_key);
|
const fs::path key_directory = getPathForKey(cleanup_key);
|
||||||
const fs::path key_prefix_directory = key_directory.parent_path();
|
const fs::path key_prefix_directory = key_directory.parent_path();
|
||||||
|
|
||||||
try
|
try
|
||||||
@ -370,8 +367,14 @@ KeyMetadata::iterator LockedKey::removeFileSegment(size_t offset, const FileSegm
|
|||||||
file_segment->queue_iterator->annul();
|
file_segment->queue_iterator->annul();
|
||||||
|
|
||||||
const auto path = key_metadata->getFileSegmentPath(*file_segment);
|
const auto path = key_metadata->getFileSegmentPath(*file_segment);
|
||||||
if (fs::exists(path))
|
bool exists = fs::exists(path);
|
||||||
|
if (exists)
|
||||||
|
{
|
||||||
|
LOG_TEST(log, "Removed file segment at path: {}", path);
|
||||||
fs::remove(path);
|
fs::remove(path);
|
||||||
|
}
|
||||||
|
else if (file_segment->downloaded_size)
|
||||||
|
throw Exception(ErrorCodes::LOGICAL_ERROR, "Expected path {} to exist");
|
||||||
|
|
||||||
file_segment->detach(segment_lock, *this);
|
file_segment->detach(segment_lock, *this);
|
||||||
return key_metadata->erase(it);
|
return key_metadata->erase(it);
|
||||||
|
@ -85,12 +85,12 @@ public:
|
|||||||
|
|
||||||
const String & getBaseDirectory() const { return path; }
|
const String & getBaseDirectory() const { return path; }
|
||||||
|
|
||||||
String getPathInLocalCache(
|
String getPathForFileSegment(
|
||||||
const Key & key,
|
const Key & key,
|
||||||
size_t offset,
|
size_t offset,
|
||||||
FileSegmentKind segment_kind) const;
|
FileSegmentKind segment_kind) const;
|
||||||
|
|
||||||
String getPathInLocalCache(const Key & key) const;
|
String getPathForKey(const Key & key) const;
|
||||||
static String getFileNameForFileSegment(size_t offset, FileSegmentKind segment_kind);
|
static String getFileNameForFileSegment(size_t offset, FileSegmentKind segment_kind);
|
||||||
|
|
||||||
void iterate(IterateCacheMetadataFunc && func);
|
void iterate(IterateCacheMetadataFunc && func);
|
||||||
|
Loading…
Reference in New Issue
Block a user