From d172cb1fc23d2183ba403f06373da0e6bdd5fd73 Mon Sep 17 00:00:00 2001 From: Vladimir Chebotarev Date: Thu, 15 Dec 2016 17:32:47 +0300 Subject: [PATCH] StorageReplicatedMergeTree: Correct taking /quorum/last_part into account when merging. [#METR-23826] --- dbms/src/Storages/StorageReplicatedMergeTree.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/dbms/src/Storages/StorageReplicatedMergeTree.cpp b/dbms/src/Storages/StorageReplicatedMergeTree.cpp index c9d7d2ad563..4eedaaf3bc0 100644 --- a/dbms/src/Storages/StorageReplicatedMergeTree.cpp +++ b/dbms/src/Storages/StorageReplicatedMergeTree.cpp @@ -1632,6 +1632,21 @@ bool StorageReplicatedMergeTree::canMergeParts( return false; } + /// Won't merge last_part even if quorum is satisfied, because we gonna check if replica has this part + /// on SELECT execution. + String quorum_last_part; + if (zookeeper->tryGet(zookeeper_path + "/quorum/last_part", quorum_last_part) && quorum_last_part.empty() == false) + { + ActiveDataPartSet::Part part_info; + ActiveDataPartSet::parsePartName(quorum_last_part, part_info); + + if (part_info.left != part_info.right) + throw Exception("Logical error: part written with quorum covers more than one block numbers", ErrorCodes::LOGICAL_ERROR); + + if (left->right <= part_info.left && right->left >= part_info.right) + return false; + } + /// Можно слить куски, если все номера между ними заброшены - не соответствуют никаким блокам. for (Int64 number = left->right + 1; number <= right->left - 1; ++number) {