Merge pull request #4369 from yandex/fix-race-condition-merge-tree-clear-old-temporary-directories

Fixed rare race condition on startup of non-replicated MergeTree tables: concurrent attempt to remove a temporary directory [#CLICKHOUSE-4296]
This commit is contained in:
alexey-milovidov 2019-02-12 21:37:48 +03:00 committed by GitHub
commit 48280074c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 7 additions and 3 deletions

View File

@ -53,7 +53,9 @@ public:
return size;
}
/// The task is started immediately.
TaskHandle addTask(const Task & task);
void removeTask(const TaskHandle & task);
~BackgroundProcessingPool();

View File

@ -832,7 +832,7 @@ void MergeTreeData::clearOldTemporaryDirectories(ssize_t custom_directories_life
Poco::DirectoryIterator end;
for (Poco::DirectoryIterator it{full_path}; it != end; ++it)
{
if (startsWith(it.name(), "tmp"))
if (startsWith(it.name(), "tmp_"))
{
Poco::File tmp_dir(full_path + it.name());

View File

@ -87,13 +87,15 @@ StorageMergeTree::StorageMergeTree(
void StorageMergeTree::startup()
{
background_task_handle = background_pool.addTask([this] { return backgroundTask(); });
data.clearOldPartsFromFilesystem();
/// Temporary directories contain incomplete results of merges (after forced restart)
/// and don't allow to reinitialize them, so delete each of them immediately
data.clearOldTemporaryDirectories(0);
/// NOTE background task will also do the above cleanups periodically.
time_after_previous_cleanup.restart();
background_task_handle = background_pool.addTask([this] { return backgroundTask(); });
}