mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-23 16:12:01 +00:00
Use one map
This commit is contained in:
parent
d00587202d
commit
64db4c478b
@ -362,7 +362,7 @@ QueryStatus::~QueryStatus()
|
||||
{
|
||||
#if !defined(NDEBUG)
|
||||
/// Check that all executors were invalidated.
|
||||
for (const auto & e : executors)
|
||||
for (const auto & [_, e] : executors)
|
||||
assert(!e->executor);
|
||||
#endif
|
||||
|
||||
@ -400,7 +400,9 @@ CancellationCode QueryStatus::cancelQuery(bool)
|
||||
{
|
||||
/// Create a snapshot of executors under a mutex.
|
||||
std::lock_guard lock(executors_mutex);
|
||||
executors_snapshot = executors;
|
||||
executors_snapshot.reserve(executors.size());
|
||||
for (const auto & [_, e] : executors)
|
||||
executors_snapshot.push_back(e);
|
||||
}
|
||||
|
||||
/// We should call cancel() for each executor with unlocked executors_mutex, because
|
||||
@ -428,9 +430,8 @@ void QueryStatus::addPipelineExecutor(PipelineExecutor * e)
|
||||
throw Exception(ErrorCodes::QUERY_WAS_CANCELLED, "Query was cancelled");
|
||||
|
||||
std::lock_guard lock(executors_mutex);
|
||||
assert(!executor_indexes.contains(e));
|
||||
executors.push_back(std::make_shared<ExecutorHolder>(e));
|
||||
executor_indexes[e] = executors.size() - 1;
|
||||
assert(!executors.contains(e));
|
||||
executors[e] = std::make_shared<ExecutorHolder>(e);
|
||||
}
|
||||
|
||||
void QueryStatus::removePipelineExecutor(PipelineExecutor * e)
|
||||
@ -439,12 +440,12 @@ void QueryStatus::removePipelineExecutor(PipelineExecutor * e)
|
||||
|
||||
{
|
||||
std::lock_guard lock(executors_mutex);
|
||||
assert(executor_indexes.contains(e));
|
||||
executor_holder = executors[executor_indexes[e]];
|
||||
executor_indexes.erase(e);
|
||||
assert(executors.contains(e));
|
||||
executor_holder = executors[e];
|
||||
executors.erase(e);
|
||||
}
|
||||
|
||||
/// Invalidate executor pointer inside holder, but don't remove holder from the executors (to avoid race with cancelQuery)
|
||||
/// Invalidate executor pointer inside holder.
|
||||
/// We should do it with released executors_mutex to avoid possible lock order inversion.
|
||||
executor_holder->remove();
|
||||
}
|
||||
|
@ -133,9 +133,8 @@ protected:
|
||||
|
||||
using ExecutorHolderPtr = std::shared_ptr<ExecutorHolder>;
|
||||
|
||||
/// Array of PipelineExecutors to be cancelled when a cancelQuery is received
|
||||
std::vector<ExecutorHolderPtr> executors;
|
||||
std::unordered_map<PipelineExecutor *, size_t> executor_indexes;
|
||||
/// Container of PipelineExecutors to be cancelled when a cancelQuery is received
|
||||
std::unordered_map<PipelineExecutor *, ExecutorHolderPtr> executors;
|
||||
|
||||
enum QueryStreamsStatus
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user