From cf2843d22c49675382a9b06a4a1d345bd8c424ec Mon Sep 17 00:00:00 2001 From: Michael Kolupaev Date: Tue, 27 May 2014 14:03:13 +0400 Subject: [PATCH] Merge --- .../DB/Storages/MergeTree/MergeTreeData.h | 8 ++++---- dbms/src/Storages/MergeTree/MergeTreeData.cpp | 16 +++++++++++----- dbms/src/Storages/StorageReplicatedMergeTree.cpp | 4 ++-- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/dbms/include/DB/Storages/MergeTree/MergeTreeData.h b/dbms/include/DB/Storages/MergeTree/MergeTreeData.h index cf8b5806151..bce5be35394 100644 --- a/dbms/include/DB/Storages/MergeTree/MergeTreeData.h +++ b/dbms/include/DB/Storages/MergeTree/MergeTreeData.h @@ -403,10 +403,10 @@ public: */ void delayInsertIfNeeded(); - /** Возвращает кусок с указанным именем или кусок, покрывающий его. Если такого нет, возвращает nullptr. - * Если including_inactive, просматриваются также неактивные куски (all_data_parts). - * При including_inactive, нахождение куска гарантируется только если есть кусок, совпадающий с part_name; - * строго покрывающий кусок в некоторых случаях может не найтись. + /** Если !including_inactive: + * Возвращает активный кусок с указанным именем или кусок, покрывающий его. Если такого нет, возвращает nullptr. + * Если including_inactive: + * Если среди all_data_parts есть кусок с именем part_name, возвращает его. Иначе делает то же, что при !including_inactive. */ DataPartPtr getContainingPart(const String & part_name, bool including_inactive = false); diff --git a/dbms/src/Storages/MergeTree/MergeTreeData.cpp b/dbms/src/Storages/MergeTree/MergeTreeData.cpp index 3991c57cab5..1f8e4826565 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeData.cpp +++ b/dbms/src/Storages/MergeTree/MergeTreeData.cpp @@ -697,14 +697,20 @@ MergeTreeData::DataPartPtr MergeTreeData::getContainingPart(const String & part_ MutableDataPartPtr tmp_part(new DataPart(*this)); ActiveDataPartSet::parsePartName(part_name, *tmp_part); - Poco::ScopedLock lock(including_inactive ? all_data_parts_mutex : data_parts_mutex); + Poco::ScopedLock lock(data_parts_mutex); - DataParts & parts = including_inactive ? all_data_parts : data_parts; + if (including_inactive) + { + Poco::ScopedLock lock(all_data_parts_mutex); + DataParts::iterator it = all_data_parts.lower_bound(tmp_part); + if (it != all_data_parts.end() && (*it)->name == part_name) + return *it; + } /// Кусок может покрываться только предыдущим или следующим в data_parts. - DataParts::iterator it = parts.lower_bound(tmp_part); + DataParts::iterator it = data_parts.lower_bound(tmp_part); - if (it != parts.end()) + if (it != data_parts.end()) { if ((*it)->name == part_name) return *it; @@ -712,7 +718,7 @@ MergeTreeData::DataPartPtr MergeTreeData::getContainingPart(const String & part_ return *it; } - if (it != parts.begin()) + if (it != data_parts.begin()) { --it; if ((*it)->contains(*tmp_part)) diff --git a/dbms/src/Storages/StorageReplicatedMergeTree.cpp b/dbms/src/Storages/StorageReplicatedMergeTree.cpp index 7c5ca66eed2..0ffb41409f7 100644 --- a/dbms/src/Storages/StorageReplicatedMergeTree.cpp +++ b/dbms/src/Storages/StorageReplicatedMergeTree.cpp @@ -725,7 +725,7 @@ void StorageReplicatedMergeTree::executeLogEntry(const LogEntry & entry) entry.type == LogEntry::MERGE_PARTS) { /// Если у нас уже есть этот кусок или покрывающий его кусок, ничего делать не нужно. - MergeTreeData::DataPartPtr containing_part = data.getContainingPart(entry.new_part_name); + MergeTreeData::DataPartPtr containing_part = data.getContainingPart(entry.new_part_name, true); /// Даже если кусок есть локально, его (в исключительных случаях) может не быть в zookeeper. if (containing_part && zookeeper->exists(replica_path + "/parts/" + containing_part->name)) @@ -737,7 +737,7 @@ void StorageReplicatedMergeTree::executeLogEntry(const LogEntry & entry) } if (entry.type == LogEntry::GET_PART && entry.source_replica == replica_name) - LOG_ERROR(log, "Part " << entry.new_part_name << " from own log doesn't exist."); + LOG_WARNING(log, "Part " << entry.new_part_name << " from own log doesn't exist."); bool do_fetch = false;