mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 01:22:04 +00:00
Fixed error #3230
This commit is contained in:
parent
80faec76e8
commit
64c7e357e8
@ -73,7 +73,7 @@ void MemoryTracker::alloc(Int64 size)
|
|||||||
*/
|
*/
|
||||||
Int64 will_be = size + amount.fetch_add(size, std::memory_order_relaxed);
|
Int64 will_be = size + amount.fetch_add(size, std::memory_order_relaxed);
|
||||||
|
|
||||||
if (!parent.load(std::memory_order_relaxed))
|
if (metric != CurrentMetrics::end())
|
||||||
CurrentMetrics::add(metric, size);
|
CurrentMetrics::add(metric, size);
|
||||||
|
|
||||||
Int64 current_limit = limit.load(std::memory_order_relaxed);
|
Int64 current_limit = limit.load(std::memory_order_relaxed);
|
||||||
@ -153,7 +153,8 @@ void MemoryTracker::free(Int64 size)
|
|||||||
|
|
||||||
if (auto loaded_next = parent.load(std::memory_order_relaxed))
|
if (auto loaded_next = parent.load(std::memory_order_relaxed))
|
||||||
loaded_next->free(size);
|
loaded_next->free(size);
|
||||||
else
|
|
||||||
|
if (metric != CurrentMetrics::end())
|
||||||
CurrentMetrics::sub(metric, size);
|
CurrentMetrics::sub(metric, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,12 +7,6 @@
|
|||||||
#include <Common/VariableContext.h>
|
#include <Common/VariableContext.h>
|
||||||
|
|
||||||
|
|
||||||
namespace CurrentMetrics
|
|
||||||
{
|
|
||||||
extern const Metric MemoryTracking;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Tracks memory consumption.
|
/** Tracks memory consumption.
|
||||||
* It throws an exception if amount of consumed memory become greater than certain limit.
|
* It throws an exception if amount of consumed memory become greater than certain limit.
|
||||||
* The same memory tracker could be simultaneously used in different threads.
|
* The same memory tracker could be simultaneously used in different threads.
|
||||||
@ -31,7 +25,7 @@ class MemoryTracker
|
|||||||
std::atomic<MemoryTracker *> parent {};
|
std::atomic<MemoryTracker *> parent {};
|
||||||
|
|
||||||
/// You could specify custom metric to track memory usage.
|
/// You could specify custom metric to track memory usage.
|
||||||
CurrentMetrics::Metric metric = CurrentMetrics::MemoryTracking;
|
CurrentMetrics::Metric metric = CurrentMetrics::end();
|
||||||
|
|
||||||
/// This description will be used as prefix into log messages (if isn't nullptr)
|
/// This description will be used as prefix into log messages (if isn't nullptr)
|
||||||
const char * description = nullptr;
|
const char * description = nullptr;
|
||||||
|
@ -14,6 +14,11 @@
|
|||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
|
|
||||||
|
namespace CurrentMetrics
|
||||||
|
{
|
||||||
|
extern const Metric MemoryTracking;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
@ -74,6 +79,13 @@ static bool isUnlimitedQuery(const IAST * ast)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ProcessList::ProcessList(size_t max_size_)
|
||||||
|
: max_size(max_size_)
|
||||||
|
{
|
||||||
|
total_memory_tracker.setMetric(CurrentMetrics::MemoryTracking);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ProcessList::EntryPtr ProcessList::insert(const String & query_, const IAST * ast, Context & query_context)
|
ProcessList::EntryPtr ProcessList::insert(const String & query_, const IAST * ast, Context & query_context)
|
||||||
{
|
{
|
||||||
EntryPtr res;
|
EntryPtr res;
|
||||||
@ -207,7 +219,7 @@ ProcessListEntry::~ProcessListEntry()
|
|||||||
/// Destroy all streams to avoid long lock of ProcessList
|
/// Destroy all streams to avoid long lock of ProcessList
|
||||||
it->releaseQueryStreams();
|
it->releaseQueryStreams();
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lock(parent.mutex);
|
std::lock_guard lock(parent.mutex);
|
||||||
|
|
||||||
String user = it->getClientInfo().current_user;
|
String user = it->getClientInfo().current_user;
|
||||||
String query_id = it->getClientInfo().current_query_id;
|
String query_id = it->getClientInfo().current_query_id;
|
||||||
|
@ -287,7 +287,7 @@ protected:
|
|||||||
QueryStatus * tryGetProcessListElement(const String & current_query_id, const String & current_user);
|
QueryStatus * tryGetProcessListElement(const String & current_query_id, const String & current_user);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ProcessList(size_t max_size_ = 0) : max_size(max_size_) {}
|
ProcessList(size_t max_size_ = 0);
|
||||||
|
|
||||||
using EntryPtr = std::shared_ptr<ProcessListEntry>;
|
using EntryPtr = std::shared_ptr<ProcessListEntry>;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user