mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-22 17:50:47 +00:00
Merge
This commit is contained in:
parent
74b2a209c6
commit
219e3ca3c6
@ -129,6 +129,7 @@ public:
|
|||||||
e.code == ZCONNECTIONLOSS)
|
e.code == ZCONNECTIONLOSS)
|
||||||
{
|
{
|
||||||
transaction.commit();
|
transaction.commit();
|
||||||
|
storage.enqueuePartForCheck(part->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw;
|
throw;
|
||||||
|
@ -649,14 +649,12 @@ void StorageReplicatedMergeTree::clearOldBlocks()
|
|||||||
ops.push_back(new zkutil::Op::Remove(zookeeper_path + "/blocks/" + timed_blocks[i].second + "/columns", -1));
|
ops.push_back(new zkutil::Op::Remove(zookeeper_path + "/blocks/" + timed_blocks[i].second + "/columns", -1));
|
||||||
ops.push_back(new zkutil::Op::Remove(zookeeper_path + "/blocks/" + timed_blocks[i].second + "/checksums", -1));
|
ops.push_back(new zkutil::Op::Remove(zookeeper_path + "/blocks/" + timed_blocks[i].second + "/checksums", -1));
|
||||||
ops.push_back(new zkutil::Op::Remove(zookeeper_path + "/blocks/" + timed_blocks[i].second, -1));
|
ops.push_back(new zkutil::Op::Remove(zookeeper_path + "/blocks/" + timed_blocks[i].second, -1));
|
||||||
if (ops.size() > 400)
|
if (ops.size() > 400 || i + 1 == timed_blocks.size())
|
||||||
{
|
{
|
||||||
zookeeper->multi(ops);
|
zookeeper->multi(ops);
|
||||||
ops.clear();
|
ops.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!ops.empty())
|
|
||||||
zookeeper->multi(ops);
|
|
||||||
|
|
||||||
LOG_TRACE(log, "Cleared " << blocks.size() - data.settings.replicated_deduplication_window << " old blocks from ZooKeeper");
|
LOG_TRACE(log, "Cleared " << blocks.size() - data.settings.replicated_deduplication_window << " old blocks from ZooKeeper");
|
||||||
}
|
}
|
||||||
@ -1384,11 +1382,7 @@ void StorageReplicatedMergeTree::partCheckThread()
|
|||||||
* Для кусков, полученных в результате слияния такая проверка была бы некорректной,
|
* Для кусков, полученных в результате слияния такая проверка была бы некорректной,
|
||||||
* потому что слитого куска может еще ни у кого не быть.
|
* потому что слитого куска может еще ни у кого не быть.
|
||||||
*/
|
*/
|
||||||
if (part_info.left != part_info.right)
|
if (part_info.left == part_info.right)
|
||||||
{
|
|
||||||
LOG_WARNING(log, "Not checking if part " << part_name << " is lost because it is a result of a merge.");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
LOG_WARNING(log, "Checking if anyone has part covering " << part_name << ".");
|
LOG_WARNING(log, "Checking if anyone has part covering " << part_name << ".");
|
||||||
|
|
||||||
@ -1412,13 +1406,7 @@ void StorageReplicatedMergeTree::partCheckThread()
|
|||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
/** Такая ситуация возможна при нормальной работе, без потери данных, например, так:
|
LOG_ERROR(log, "No replica has part covering " << part_name);
|
||||||
* ReplicatedMergeTreeBlockOutputStream записал кусок, попытался добавить его в ZK,
|
|
||||||
* получил operation timeout, удалил локальный кусок и бросил исключение,
|
|
||||||
* а на самом деле, кусок добавился в ZK.
|
|
||||||
*/
|
|
||||||
LOG_ERROR(log, "No replica has part covering " << part_name << ". This part is lost forever. "
|
|
||||||
<< "There might or might not be a data loss.");
|
|
||||||
ProfileEvents::increment(ProfileEvents::ReplicatedPartChecksFailed);
|
ProfileEvents::increment(ProfileEvents::ReplicatedPartChecksFailed);
|
||||||
|
|
||||||
/** Если ни у кого нет такого куска, удалим его из нашей очереди.
|
/** Если ни у кого нет такого куска, удалим его из нашей очереди.
|
||||||
@ -1429,6 +1417,8 @@ void StorageReplicatedMergeTree::partCheckThread()
|
|||||||
* TODO: можно это исправить, сделав две директории block_numbers: для автоинкрементных и ручных нод.
|
* TODO: можно это исправить, сделав две директории block_numbers: для автоинкрементных и ручных нод.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
bool was_in_queue = false;
|
||||||
|
|
||||||
{
|
{
|
||||||
Poco::ScopedLock<Poco::FastMutex> lock(queue_mutex);
|
Poco::ScopedLock<Poco::FastMutex> lock(queue_mutex);
|
||||||
|
|
||||||
@ -1442,6 +1432,7 @@ void StorageReplicatedMergeTree::partCheckThread()
|
|||||||
{
|
{
|
||||||
zookeeper->remove(replica_path + "/queue/" + it->znode_name);
|
zookeeper->remove(replica_path + "/queue/" + it->znode_name);
|
||||||
queue.erase(it++);
|
queue.erase(it++);
|
||||||
|
was_in_queue = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1449,6 +1440,12 @@ void StorageReplicatedMergeTree::partCheckThread()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (was_in_queue)
|
||||||
|
/** Такая ситуация возможна, если на всех репликах, где был кусок, он испортился.
|
||||||
|
* Например, у реплики, которая только что его записала, отключили питание, и данные не записались из кеша на диск.
|
||||||
|
*/
|
||||||
|
LOG_ERROR(log, "Part " << part_name << " is lost forever. Say goodbye to a piece of data!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user