mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-04 13:32:13 +00:00
Ignore broken metadata
This commit is contained in:
parent
6f35c28592
commit
362fa745e6
@ -122,10 +122,10 @@ DiskObjectStorage::Metadata DiskObjectStorage::readUpdateAndStoreMetadata(const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DiskObjectStorage::Metadata DiskObjectStorage::readUpdateStoreMetadataAndRemove(const String & path, bool sync, DiskObjectStorage::MetadataUpdater updater)
|
void DiskObjectStorage::readUpdateStoreMetadataAndRemove(const String & path, bool sync, DiskObjectStorage::MetadataUpdater updater)
|
||||||
{
|
{
|
||||||
std::unique_lock lock(metadata_mutex);
|
std::unique_lock lock(metadata_mutex);
|
||||||
return Metadata::readUpdateStoreMetadataAndRemove(remote_fs_root_path, metadata_disk, path, sync, updater);
|
Metadata::readUpdateStoreMetadataAndRemove(remote_fs_root_path, metadata_disk, path, sync, updater);
|
||||||
}
|
}
|
||||||
|
|
||||||
DiskObjectStorage::Metadata DiskObjectStorage::readOrCreateUpdateAndStoreMetadata(const String & path, WriteMode mode, bool sync, DiskObjectStorage::MetadataUpdater updater)
|
DiskObjectStorage::Metadata DiskObjectStorage::readOrCreateUpdateAndStoreMetadata(const String & path, WriteMode mode, bool sync, DiskObjectStorage::MetadataUpdater updater)
|
||||||
@ -174,8 +174,13 @@ void DiskObjectStorage::getRemotePathsRecursive(const String & local_path, std::
|
|||||||
}
|
}
|
||||||
catch (const Exception & e)
|
catch (const Exception & e)
|
||||||
{
|
{
|
||||||
if (e.code() == ErrorCodes::FILE_DOESNT_EXIST)
|
/// Unfortunately in rare cases it can happen when files disappear
|
||||||
|
/// or can be empty in case of operation interruption (like cancelled metadata fetch)
|
||||||
|
if (e.code() == ErrorCodes::FILE_DOESNT_EXIST ||
|
||||||
|
e.code() == ErrorCodes::ATTEMPT_TO_READ_AFTER_EOF ||
|
||||||
|
e.code() == ErrorCodes::CANNOT_READ_ALL_DATA)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -186,6 +191,15 @@ void DiskObjectStorage::getRemotePathsRecursive(const String & local_path, std::
|
|||||||
{
|
{
|
||||||
it = iterateDirectory(local_path);
|
it = iterateDirectory(local_path);
|
||||||
}
|
}
|
||||||
|
catch (const Exception & e)
|
||||||
|
{
|
||||||
|
/// Unfortunately in rare cases it can happen when files disappear
|
||||||
|
/// or can be empty in case of operation interruption (like cancelled metadata fetch)
|
||||||
|
if (e.code() == ErrorCodes::FILE_DOESNT_EXIST ||
|
||||||
|
e.code() == ErrorCodes::ATTEMPT_TO_READ_AFTER_EOF ||
|
||||||
|
e.code() == ErrorCodes::CANNOT_READ_ALL_DATA)
|
||||||
|
return;
|
||||||
|
}
|
||||||
catch (const fs::filesystem_error & e)
|
catch (const fs::filesystem_error & e)
|
||||||
{
|
{
|
||||||
if (e.code() == std::errc::no_such_file_or_directory)
|
if (e.code() == std::errc::no_such_file_or_directory)
|
||||||
|
@ -65,7 +65,7 @@ public:
|
|||||||
Metadata readMetadata(const String & path) const;
|
Metadata readMetadata(const String & path) const;
|
||||||
Metadata readMetadataUnlocked(const String & path, std::shared_lock<std::shared_mutex> &) const;
|
Metadata readMetadataUnlocked(const String & path, std::shared_lock<std::shared_mutex> &) const;
|
||||||
Metadata readUpdateAndStoreMetadata(const String & path, bool sync, MetadataUpdater updater);
|
Metadata readUpdateAndStoreMetadata(const String & path, bool sync, MetadataUpdater updater);
|
||||||
Metadata readUpdateStoreMetadataAndRemove(const String & path, bool sync, MetadataUpdater updater);
|
void readUpdateStoreMetadataAndRemove(const String & path, bool sync, MetadataUpdater updater);
|
||||||
|
|
||||||
Metadata readOrCreateUpdateAndStoreMetadata(const String & path, WriteMode mode, bool sync, MetadataUpdater updater);
|
Metadata readOrCreateUpdateAndStoreMetadata(const String & path, WriteMode mode, bool sync, MetadataUpdater updater);
|
||||||
|
|
||||||
|
@ -10,6 +10,10 @@ namespace ErrorCodes
|
|||||||
{
|
{
|
||||||
extern const int UNKNOWN_FORMAT;
|
extern const int UNKNOWN_FORMAT;
|
||||||
extern const int PATH_ACCESS_DENIED;
|
extern const int PATH_ACCESS_DENIED;
|
||||||
|
extern const int FILE_DOESNT_EXIST;
|
||||||
|
extern const int ATTEMPT_TO_READ_AFTER_EOF;
|
||||||
|
extern const int CANNOT_READ_ALL_DATA;
|
||||||
|
extern const int CANNOT_OPEN_FILE;
|
||||||
}
|
}
|
||||||
|
|
||||||
DiskObjectStorageMetadata DiskObjectStorageMetadata::readMetadata(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_)
|
DiskObjectStorageMetadata DiskObjectStorageMetadata::readMetadata(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_)
|
||||||
@ -44,16 +48,38 @@ DiskObjectStorageMetadata DiskObjectStorageMetadata::createUpdateAndStoreMetadat
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DiskObjectStorageMetadata DiskObjectStorageMetadata::readUpdateStoreMetadataAndRemove(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_, bool sync, DiskObjectStorageMetadataUpdater updater)
|
void DiskObjectStorageMetadata::readUpdateStoreMetadataAndRemove(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_, bool sync, DiskObjectStorageMetadataUpdater updater)
|
||||||
{
|
{
|
||||||
DiskObjectStorageMetadata result(remote_fs_root_path_, metadata_disk_, metadata_file_path_);
|
/// Very often we are deleting metadata from some unfinished operation (like fetch of metadata)
|
||||||
result.load();
|
/// in this case metadata file can be incomplete/empty and so on. It's ok to remove it in this case
|
||||||
if (updater(result))
|
/// because we cannot do anything better.
|
||||||
result.save(sync);
|
try
|
||||||
|
{
|
||||||
|
DiskObjectStorageMetadata metadata(remote_fs_root_path_, metadata_disk_, metadata_file_path_);
|
||||||
|
metadata.load();
|
||||||
|
if (updater(metadata))
|
||||||
|
metadata.save(sync);
|
||||||
|
|
||||||
metadata_disk_->removeFile(metadata_file_path_);
|
metadata_disk_->removeFile(metadata_file_path_);
|
||||||
|
}
|
||||||
|
catch (Exception & ex)
|
||||||
|
{
|
||||||
|
/// If we have some broken half-empty file just remove it
|
||||||
|
if (ex.code() == ErrorCodes::ATTEMPT_TO_READ_AFTER_EOF
|
||||||
|
|| ex.code() == ErrorCodes::CANNOT_READ_ALL_DATA
|
||||||
|
|| ex.code() == ErrorCodes::CANNOT_OPEN_FILE)
|
||||||
|
{
|
||||||
|
LOG_INFO(&Poco::Logger::get("ObjectStorageMetadata"), "Failed to read metadata file {} before removal because it's incomplete or empty. "
|
||||||
|
"It's Ok and can happen after operation interruption (like metadata fetch), so removing as is", metadata_file_path_);
|
||||||
|
metadata_disk_->removeFile(metadata_file_path_);
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
/// If file already removed, than nothing to do
|
||||||
|
if (ex.code() == ErrorCodes::FILE_DOESNT_EXIST)
|
||||||
|
return;
|
||||||
|
|
||||||
|
throw;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DiskObjectStorageMetadata DiskObjectStorageMetadata::createAndStoreMetadataIfNotExists(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_, bool sync, bool overwrite)
|
DiskObjectStorageMetadata DiskObjectStorageMetadata::createAndStoreMetadataIfNotExists(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_, bool sync, bool overwrite)
|
||||||
|
@ -47,7 +47,7 @@ struct DiskObjectStorageMetadata
|
|||||||
|
|
||||||
static DiskObjectStorageMetadata readMetadata(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_);
|
static DiskObjectStorageMetadata readMetadata(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_);
|
||||||
static DiskObjectStorageMetadata readUpdateAndStoreMetadata(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_, bool sync, Updater updater);
|
static DiskObjectStorageMetadata readUpdateAndStoreMetadata(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_, bool sync, Updater updater);
|
||||||
static DiskObjectStorageMetadata readUpdateStoreMetadataAndRemove(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_, bool sync, Updater updater);
|
static void readUpdateStoreMetadataAndRemove(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_, bool sync, Updater updater);
|
||||||
|
|
||||||
static DiskObjectStorageMetadata createAndStoreMetadata(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_, bool sync);
|
static DiskObjectStorageMetadata createAndStoreMetadata(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_, bool sync);
|
||||||
static DiskObjectStorageMetadata createUpdateAndStoreMetadata(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_, bool sync, Updater updater);
|
static DiskObjectStorageMetadata createUpdateAndStoreMetadata(const String & remote_fs_root_path_, DiskPtr metadata_disk_, const String & metadata_file_path_, bool sync, Updater updater);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Tags: no-replicated-database, no-parallel, no-fasttest, no-tsan, no-asan, no-random-settings
|
# Tags: no-replicated-database, no-parallel, no-fasttest, no-tsan, no-asan, no-random-settings, no-s3-storage
|
||||||
# Tag no-fasttest: max_memory_usage_for_user can interfere another queries running concurrently
|
# Tag no-fasttest: max_memory_usage_for_user can interfere another queries running concurrently
|
||||||
|
|
||||||
# Regression for MemoryTracker that had been incorrectly accounted
|
# Regression for MemoryTracker that had been incorrectly accounted
|
||||||
|
Loading…
Reference in New Issue
Block a user