diff --git a/dbms/include/DB/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.h b/dbms/include/DB/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.h index 56c074a8ae6ccc28797035b75b321c631e086ab5..c024002593981e06362ad88b66d6d9772f185eed 100644 --- a/dbms/include/DB/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.h +++ b/dbms/include/DB/Storages/MergeTree/ReplicatedMergeTreeCleanupThread.h @@ -41,6 +41,7 @@ private: void clearOldBlocks(); /// TODO Удаление старых quorum/failed_parts + /// TODO Удаление старых nonincrement_block_numbers }; diff --git a/dbms/src/Storages/StorageReplicatedMergeTree.cpp b/dbms/src/Storages/StorageReplicatedMergeTree.cpp index dc19b0ddaf389f1836ed57b1cbfe3fae98cc028a..376b255e6a1ad2e1a7ba2083872c6e7324dc6459 100644 --- a/dbms/src/Storages/StorageReplicatedMergeTree.cpp +++ b/dbms/src/Storages/StorageReplicatedMergeTree.cpp @@ -2060,7 +2060,25 @@ void StorageReplicatedMergeTree::searchForMissingPart(const String & part_name) * Специально из-за этого приходится отдельно иметь nonincrement_block_numbers. * * Кстати, если мы здесь сдохнем, то слияния не будут делаться сквозь эти отсутствующие куски. + * + * А ещё, не будем добавлять, если: + * - потребовалось бы создать слишком много (больше 1000) узлов; + * - кусок является первым в партиции или был при-ATTACH-ен. + * NOTE Возможно, добавить также условие, если запись в очереди очень старая. */ + + if (part_length_in_blocks > 1000) + { + LOG_ERROR(log, "Won't add nonincrement_block_numbers because part spans too much blocks (" << part_length_in_blocks << ")"); + return; + } + + if (part_info.left <= RESERVED_BLOCK_NUMBERS) + { + LOG_ERROR(log, "Won't add nonincrement_block_numbers because part is one of first in partition"); + return; + } + const auto partition_str = part_name.substr(0, 6); for (auto i = part_info.left; i <= part_info.right; ++i) {