diff --git a/dbms/include/DB/Storages/StorageMergeTree.h b/dbms/include/DB/Storages/StorageMergeTree.h index 30e5864cdc6..75b2223a711 100644 --- a/dbms/include/DB/Storages/StorageMergeTree.h +++ b/dbms/include/DB/Storages/StorageMergeTree.h @@ -110,7 +110,7 @@ private: CurrentlyMergingPartsTagger(const MergeTreeData::DataPartsVector & parts_, size_t total_size, StorageMergeTree & storage_) : parts(parts_), storage(storage_) { - /// Здесь не лочится мьютекс, так как конструктор вызывается внутри mergeThread, где он уже залочен. + /// Здесь не лочится мьютекс, так как конструктор вызывается внутри mergeTask, где он уже залочен. reserved_space = DiskSpaceMonitor::reserve(storage.full_path, total_size); /// Может бросить исключение. for (const auto & part : parts) { diff --git a/dbms/src/Storages/StorageReplicatedMergeTree.cpp b/dbms/src/Storages/StorageReplicatedMergeTree.cpp index 13e2185db20..c35356a4878 100644 --- a/dbms/src/Storages/StorageReplicatedMergeTree.cpp +++ b/dbms/src/Storages/StorageReplicatedMergeTree.cpp @@ -706,6 +706,13 @@ void StorageReplicatedMergeTree::pullLogsToQueue() bool StorageReplicatedMergeTree::shouldExecuteLogEntry(const LogEntry & entry) { + if ((entry.type == LogEntry::MERGE_PARTS || entry.type == LogEntry::GET_PART) &&future_parts.count(entry.new_part_name)) + { + LOG_DEBUG(log, "Not executing log entry for part " << entry.new_part_name << + " because another log entry for the same part is being processed. This shouldn't happen often."); + return false; + } + if (entry.type == LogEntry::MERGE_PARTS) { /** Если какая-то из нужных частей сейчас передается или мерджится, подождем окончания этой операции.