提交 524f376b 编写于 作者: M Michael Kolupaev

Merge

上级 f5d56e38
......@@ -342,6 +342,7 @@ public:
/** Возвращает копию списка, чтобы снаружи можно было не заботиться о блокировках.
*/
DataParts getDataParts();
DataParts getAllDataParts();
/** Возвращает кусок с указанным именем или кусок, покрывающий его. Если такого нет, возвращает nullptr.
* Если including_inactive, просматриваются также неактивные куски (all_data_parts).
......
......@@ -736,9 +736,9 @@ void MergeTreeData::renameAndDetachPart(DataPartPtr part, const String & prefix)
{
Poco::ScopedLock<Poco::FastMutex> lock(data_parts_mutex);
Poco::ScopedLock<Poco::FastMutex> lock_all(all_data_parts_mutex);
all_data_parts.erase(part);
if (!data_parts.erase(part))
if (!all_data_parts.erase(part))
throw Exception("No such data part", ErrorCodes::NO_SUCH_DATA_PART);
data_parts.erase(part);
part->renameAddPrefix(prefix);
}
......@@ -749,6 +749,13 @@ MergeTreeData::DataParts MergeTreeData::getDataParts()
return data_parts;
}
MergeTreeData::DataParts MergeTreeData::getAllDataParts()
{
Poco::ScopedLock<Poco::FastMutex> lock(all_data_parts_mutex);
return all_data_parts;
}
MergeTreeData::DataPartPtr MergeTreeData::getContainingPart(const String & part_name, bool including_inactive)
{
MutableDataPartPtr tmp_part(new DataPart(*this));
......
......@@ -225,7 +225,7 @@ void StorageReplicatedMergeTree::checkParts()
Strings expected_parts_vec = zookeeper.getChildren(replica_path + "/parts");
NameSet expected_parts(expected_parts_vec.begin(), expected_parts_vec.end());
MergeTreeData::DataParts parts = data.getDataParts();
MergeTreeData::DataParts parts = data.getAllDataParts();
MergeTreeData::DataParts unexpected_parts;
for (const auto & part : parts)
......@@ -249,6 +249,7 @@ void StorageReplicatedMergeTree::checkParts()
throw Exception("Not found " + toString(expected_parts.size())
+ " parts (including " + missing_name + ") in table " + data.getTableName(),
ErrorCodes::NOT_FOUND_EXPECTED_DATA_PART);
LOG_ERROR(log, "Ignoring missing local part " << missing_name << " because part " << containing->name << " exists");
if (unexpected_parts.count(containing))
{
parts_to_add.push_back(containing);
......@@ -261,7 +262,7 @@ void StorageReplicatedMergeTree::checkParts()
expected_parts.size() > 20)
{
throw Exception("The local set of parts of table " + data.getTableName() + " doesn't look like the set of parts in ZooKeeper."
"There are " + toString(unexpected_parts.size()) + " unexpected parts, "
" There are " + toString(unexpected_parts.size()) + " unexpected parts, "
+ toString(parts_to_add.size()) + " unexpectedly merged parts, "
+ toString(expected_parts.size()) + " unexpectedly obsolete parts",
ErrorCodes::TOO_MANY_UNEXPECTED_DATA_PARTS);
......@@ -270,6 +271,7 @@ void StorageReplicatedMergeTree::checkParts()
/// Добавим в ZK информацию о кусках, покрывающих недостающие куски.
for (MergeTreeData::DataPartPtr part : parts_to_add)
{
LOG_ERROR(log, "Adding unexpected local part to ZooKeeper: " << part->name);
zkutil::Ops ops;
checkPartAndAddToZooKeeper(part, ops);
zookeeper.multi(ops);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册