mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 17:12:03 +00:00
dbms: attempt to fix an error [#METR-19866].
This commit is contained in:
parent
f8ddee2443
commit
48a1fe182d
@ -95,6 +95,22 @@ private:
|
||||
/// Обновить времена insert-ов в ZooKeeper.
|
||||
void updateTimesInZooKeeper(zkutil::ZooKeeperPtr zookeeper, bool min_unprocessed_insert_time_changed, bool max_processed_insert_time_changed);
|
||||
|
||||
|
||||
/// Помечает элемент очереди как выполняющийся.
|
||||
class CurrentlyExecuting
|
||||
{
|
||||
private:
|
||||
ReplicatedMergeTreeQueue::LogEntryPtr & entry;
|
||||
ReplicatedMergeTreeQueue & queue;
|
||||
|
||||
friend class ReplicatedMergeTreeQueue;
|
||||
|
||||
/// Создаётся только в функции selectEntryToProcess. Вызывается под mutex-ом.
|
||||
CurrentlyExecuting(ReplicatedMergeTreeQueue::LogEntryPtr & entry, ReplicatedMergeTreeQueue & queue);
|
||||
public:
|
||||
~CurrentlyExecuting();
|
||||
};
|
||||
|
||||
public:
|
||||
ReplicatedMergeTreeQueue() {}
|
||||
|
||||
@ -132,7 +148,8 @@ public:
|
||||
/** Выбрать следующее действие для обработки.
|
||||
* merger используется только чтобы проверить, не приостановлены ли мерджи.
|
||||
*/
|
||||
LogEntryPtr selectEntryToProcess(MergeTreeDataMerger & merger);
|
||||
using SelectedEntry = std::pair<ReplicatedMergeTreeQueue::LogEntryPtr, std::unique_ptr<CurrentlyExecuting>>;
|
||||
SelectedEntry selectEntryToProcess(MergeTreeDataMerger & merger);
|
||||
|
||||
/** Выполнить функцию func для обработки действия.
|
||||
* При этом, на время выполнения, отметить элемент очереди как выполняющийся
|
||||
|
@ -449,7 +449,7 @@ void ReplicatedMergeTreeQueue::removeGetsAndMergesInRange(zkutil::ZooKeeperPtr z
|
||||
|
||||
bool ReplicatedMergeTreeQueue::shouldExecuteLogEntry(const LogEntry & entry, String & out_postpone_reason, MergeTreeDataMerger & merger)
|
||||
{
|
||||
/// queue_mutex уже захвачен. Функция вызывается только из selectEntryToProcess.
|
||||
/// mutex уже захвачен. Функция вызывается только из selectEntryToProcess.
|
||||
|
||||
if (entry.type == LogEntry::MERGE_PARTS || entry.type == LogEntry::GET_PART || entry.type == LogEntry::ATTACH_PART)
|
||||
{
|
||||
@ -522,7 +522,30 @@ bool ReplicatedMergeTreeQueue::shouldExecuteLogEntry(const LogEntry & entry, Str
|
||||
}
|
||||
|
||||
|
||||
ReplicatedMergeTreeQueue::LogEntryPtr ReplicatedMergeTreeQueue::selectEntryToProcess(MergeTreeDataMerger & merger)
|
||||
ReplicatedMergeTreeQueue::CurrentlyExecuting::CurrentlyExecuting(ReplicatedMergeTreeQueue::LogEntryPtr & entry, ReplicatedMergeTreeQueue & queue)
|
||||
: entry(entry), queue(queue)
|
||||
{
|
||||
entry->currently_executing = true;
|
||||
++entry->num_tries;
|
||||
entry->last_attempt_time = time(0);
|
||||
|
||||
if (!queue.future_parts.insert(entry->new_part_name).second)
|
||||
throw Exception("Tagging already tagged future part " + entry->new_part_name + ". This is a bug.", ErrorCodes::LOGICAL_ERROR);
|
||||
}
|
||||
|
||||
ReplicatedMergeTreeQueue::CurrentlyExecuting::~CurrentlyExecuting()
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(queue.mutex);
|
||||
|
||||
entry->currently_executing = false;
|
||||
entry->execution_complete.notify_all();
|
||||
|
||||
if (!queue.future_parts.erase(entry->new_part_name))
|
||||
LOG_ERROR(queue.log, "Untagging already untagged future part " + entry->new_part_name + ". This is a bug.");
|
||||
}
|
||||
|
||||
|
||||
ReplicatedMergeTreeQueue::SelectedEntry ReplicatedMergeTreeQueue::selectEntryToProcess(MergeTreeDataMerger & merger)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex);
|
||||
|
||||
@ -546,47 +569,15 @@ ReplicatedMergeTreeQueue::LogEntryPtr ReplicatedMergeTreeQueue::selectEntryToPro
|
||||
}
|
||||
}
|
||||
|
||||
return entry;
|
||||
if (entry)
|
||||
return { entry, std::unique_ptr<CurrentlyExecuting>{ new CurrentlyExecuting(entry, *this) } };
|
||||
else
|
||||
return {};
|
||||
}
|
||||
|
||||
|
||||
class CurrentlyExecuting
|
||||
{
|
||||
private:
|
||||
ReplicatedMergeTreeQueue::LogEntryPtr & entry;
|
||||
ReplicatedMergeTreeQueue & queue;
|
||||
|
||||
public:
|
||||
CurrentlyExecuting(ReplicatedMergeTreeQueue::LogEntryPtr & entry, ReplicatedMergeTreeQueue & queue)
|
||||
: entry(entry), queue(queue)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(queue.mutex);
|
||||
|
||||
entry->currently_executing = true;
|
||||
++entry->num_tries;
|
||||
entry->last_attempt_time = time(0);
|
||||
|
||||
if (!queue.future_parts.insert(entry->new_part_name).second)
|
||||
throw Exception("Tagging already tagged future part " + entry->new_part_name + ". This is a bug.", ErrorCodes::LOGICAL_ERROR);
|
||||
}
|
||||
|
||||
~CurrentlyExecuting()
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(queue.mutex);
|
||||
|
||||
entry->currently_executing = false;
|
||||
entry->execution_complete.notify_all();
|
||||
|
||||
if (!queue.future_parts.erase(entry->new_part_name))
|
||||
LOG_ERROR(queue.log, "Untagging already untagged future part " + entry->new_part_name + ". This is a bug.");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
bool ReplicatedMergeTreeQueue::processEntry(zkutil::ZooKeeperPtr zookeeper, LogEntryPtr & entry, const std::function<bool(LogEntryPtr &)> func)
|
||||
{
|
||||
CurrentlyExecuting guard(entry, *this);
|
||||
|
||||
std::exception_ptr saved_exception;
|
||||
|
||||
try
|
||||
|
@ -1370,17 +1370,20 @@ void StorageReplicatedMergeTree::queueUpdatingThread()
|
||||
|
||||
bool StorageReplicatedMergeTree::queueTask(BackgroundProcessingPool::Context & pool_context)
|
||||
{
|
||||
LogEntryPtr entry;
|
||||
/// Этот объект будет помечать элемент очереди как выполняющийся.
|
||||
ReplicatedMergeTreeQueue::SelectedEntry selected;
|
||||
|
||||
try
|
||||
{
|
||||
entry = queue.selectEntryToProcess(merger);
|
||||
selected = queue.selectEntryToProcess(merger);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
tryLogCurrentException(__PRETTY_FUNCTION__);
|
||||
}
|
||||
|
||||
LogEntryPtr & entry = selected.first;
|
||||
|
||||
if (!entry)
|
||||
return false;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user