mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-18 12:22:12 +00:00
Backport #72518 to 24.10: Fix data race in ProfileEvents::Counters::setParent().
This commit is contained in:
parent
dd0907fc77
commit
f8fa3557af
@ -950,6 +950,15 @@ Counters::Counters(VariableContext level_, Counters * parent_)
|
|||||||
counters = counters_holder.get();
|
counters = counters_holder.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Counters::Counters(Counters && src) noexcept
|
||||||
|
: counters(std::exchange(src.counters, nullptr))
|
||||||
|
, counters_holder(std::move(src.counters_holder))
|
||||||
|
, parent(src.parent.exchange(nullptr))
|
||||||
|
, trace_profile_events(src.trace_profile_events)
|
||||||
|
, level(src.level)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void Counters::resetCounters()
|
void Counters::resetCounters()
|
||||||
{
|
{
|
||||||
if (counters)
|
if (counters)
|
||||||
@ -961,7 +970,7 @@ void Counters::resetCounters()
|
|||||||
|
|
||||||
void Counters::reset()
|
void Counters::reset()
|
||||||
{
|
{
|
||||||
parent = nullptr;
|
setParent(nullptr);
|
||||||
resetCounters();
|
resetCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ namespace ProfileEvents
|
|||||||
Counter * counters = nullptr;
|
Counter * counters = nullptr;
|
||||||
std::unique_ptr<Counter[]> counters_holder;
|
std::unique_ptr<Counter[]> counters_holder;
|
||||||
/// Used to propagate increments
|
/// Used to propagate increments
|
||||||
Counters * parent = nullptr;
|
std::atomic<Counters *> parent = {};
|
||||||
bool trace_profile_events = false;
|
bool trace_profile_events = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -74,6 +74,8 @@ namespace ProfileEvents
|
|||||||
explicit Counters(Counter * allocated_counters) noexcept
|
explicit Counters(Counter * allocated_counters) noexcept
|
||||||
: counters(allocated_counters), parent(nullptr), level(VariableContext::Global) {}
|
: counters(allocated_counters), parent(nullptr), level(VariableContext::Global) {}
|
||||||
|
|
||||||
|
Counters(Counters && src) noexcept;
|
||||||
|
|
||||||
Counter & operator[] (Event event)
|
Counter & operator[] (Event event)
|
||||||
{
|
{
|
||||||
return counters[event];
|
return counters[event];
|
||||||
@ -114,13 +116,13 @@ namespace ProfileEvents
|
|||||||
/// Get parent (thread unsafe)
|
/// Get parent (thread unsafe)
|
||||||
Counters * getParent()
|
Counters * getParent()
|
||||||
{
|
{
|
||||||
return parent;
|
return parent.load(std::memory_order_relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set parent (thread unsafe)
|
/// Set parent (thread unsafe)
|
||||||
void setParent(Counters * parent_)
|
void setParent(Counters * parent_)
|
||||||
{
|
{
|
||||||
parent = parent_;
|
parent.store(parent_, std::memory_order_relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setTraceProfileEvents(bool value)
|
void setTraceProfileEvents(bool value)
|
||||||
|
Loading…
Reference in New Issue
Block a user