Merge pull request #71229 from ClickHouse/backport/24.8/71174

Backport #71174 to 24.8: Maybe not GWPAsan by default
This commit is contained in:
robot-ch-test-poll3 2024-10-30 11:32:43 +01:00 committed by GitHub
commit 563a57db09
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 5 additions and 51 deletions

View File

@ -480,7 +480,7 @@ static void sanityChecks(Server & server)
#if defined(OS_LINUX) #if defined(OS_LINUX)
try try
{ {
const std::unordered_set<std::string> fastClockSources = { const std::unordered_set<std::string> fast_clock_sources = {
// ARM clock // ARM clock
"arch_sys_counter", "arch_sys_counter",
// KVM guest clock // KVM guest clock
@ -489,7 +489,7 @@ static void sanityChecks(Server & server)
"tsc", "tsc",
}; };
const char * filename = "/sys/devices/system/clocksource/clocksource0/current_clocksource"; const char * filename = "/sys/devices/system/clocksource/clocksource0/current_clocksource";
if (!fastClockSources.contains(readLine(filename))) if (!fast_clock_sources.contains(readLine(filename)))
server.context()->addWarningMessage("Linux is not using a fast clock source. Performance can be degraded. Check " + String(filename)); server.context()->addWarningMessage("Linux is not using a fast clock source. Performance can be degraded. Check " + String(filename));
} }
catch (...) // NOLINT(bugprone-empty-catch) catch (...) // NOLINT(bugprone-empty-catch)
@ -1776,10 +1776,6 @@ try
if (global_context->isServerCompletelyStarted()) if (global_context->isServerCompletelyStarted())
CannotAllocateThreadFaultInjector::setFaultProbability(new_server_settings.cannot_allocate_thread_fault_injection_probability); CannotAllocateThreadFaultInjector::setFaultProbability(new_server_settings.cannot_allocate_thread_fault_injection_probability);
#if USE_GWP_ASAN
GWPAsan::setForceSampleProbability(new_server_settings.gwp_asan_force_sample_probability);
#endif
ProfileEvents::increment(ProfileEvents::MainConfigLoads); ProfileEvents::increment(ProfileEvents::MainConfigLoads);
/// Must be the last. /// Must be the last.
@ -2234,7 +2230,6 @@ try
#if USE_GWP_ASAN #if USE_GWP_ASAN
GWPAsan::initFinished(); GWPAsan::initFinished();
GWPAsan::setForceSampleProbability(server_settings.gwp_asan_force_sample_probability);
#endif #endif
try try

View File

@ -57,7 +57,7 @@ static bool guarded_alloc_initialized = []
opts.MaxSimultaneousAllocations = 1024; opts.MaxSimultaneousAllocations = 1024;
if (!env_options_raw || !std::string_view{env_options_raw}.contains("SampleRate")) if (!env_options_raw || !std::string_view{env_options_raw}.contains("SampleRate"))
opts.SampleRate = 10000; opts.SampleRate = 0;
const char * collect_stacktraces = std::getenv("GWP_ASAN_COLLECT_STACKTRACES"); // NOLINT(concurrency-mt-unsafe) const char * collect_stacktraces = std::getenv("GWP_ASAN_COLLECT_STACKTRACES"); // NOLINT(concurrency-mt-unsafe)
if (collect_stacktraces && std::string_view{collect_stacktraces} == "1") if (collect_stacktraces && std::string_view{collect_stacktraces} == "1")
@ -224,12 +224,6 @@ void initFinished()
init_finished.store(true, std::memory_order_relaxed); init_finished.store(true, std::memory_order_relaxed);
} }
std::atomic<double> force_sample_probability = 0.0;
void setForceSampleProbability(double value)
{
force_sample_probability.store(value, std::memory_order_relaxed);
}
} }

View File

@ -8,7 +8,6 @@
#include <Common/thread_local_rng.h> #include <Common/thread_local_rng.h>
#include <atomic> #include <atomic>
#include <random>
namespace GWPAsan namespace GWPAsan
{ {
@ -23,10 +22,6 @@ extern std::atomic<bool> init_finished;
void initFinished(); void initFinished();
extern std::atomic<double> force_sample_probability;
void setForceSampleProbability(double value);
/** /**
* We'd like to postpone sampling allocations under the startup is finished. There are mainly * We'd like to postpone sampling allocations under the startup is finished. There are mainly
* two reasons for that: * two reasons for that:
@ -39,14 +34,6 @@ inline bool shouldSample()
return init_finished.load(std::memory_order_relaxed) && GuardedAlloc.shouldSample(); return init_finished.load(std::memory_order_relaxed) && GuardedAlloc.shouldSample();
} }
inline bool shouldForceSample()
{
if (!init_finished.load(std::memory_order_relaxed))
return false;
std::bernoulli_distribution dist(force_sample_probability.load(std::memory_order_relaxed));
return dist(thread_local_rng);
}
} }
#endif #endif

View File

@ -115,11 +115,6 @@ protected:
template <typename ... TAllocatorParams> template <typename ... TAllocatorParams>
void alloc(size_t bytes, TAllocatorParams &&... allocator_params) void alloc(size_t bytes, TAllocatorParams &&... allocator_params)
{ {
#if USE_GWP_ASAN
if (unlikely(GWPAsan::shouldForceSample()))
gwp_asan::getThreadLocals()->NextSampleCounter = 1;
#endif
char * allocated = reinterpret_cast<char *>(TAllocator::alloc(bytes, std::forward<TAllocatorParams>(allocator_params)...)); char * allocated = reinterpret_cast<char *>(TAllocator::alloc(bytes, std::forward<TAllocatorParams>(allocator_params)...));
c_start = allocated + pad_left; c_start = allocated + pad_left;
@ -149,11 +144,6 @@ protected:
return; return;
} }
#if USE_GWP_ASAN
if (unlikely(GWPAsan::shouldForceSample()))
gwp_asan::getThreadLocals()->NextSampleCounter = 1;
#endif
unprotect(); unprotect();
ptrdiff_t end_diff = c_end - c_start; ptrdiff_t end_diff = c_end - c_start;

View File

@ -165,7 +165,6 @@ namespace DB
M(String, merge_workload, "default", "Name of workload to be used to access resources for all merges (may be overridden by a merge tree setting)", 0) \ M(String, merge_workload, "default", "Name of workload to be used to access resources for all merges (may be overridden by a merge tree setting)", 0) \
M(String, mutation_workload, "default", "Name of workload to be used to access resources for all mutations (may be overridden by a merge tree setting)", 0) \ M(String, mutation_workload, "default", "Name of workload to be used to access resources for all mutations (may be overridden by a merge tree setting)", 0) \
M(Bool, prepare_system_log_tables_on_startup, false, "If true, ClickHouse creates all configured `system.*_log` tables before the startup. It can be helpful if some startup scripts depend on these tables.", 0) \ M(Bool, prepare_system_log_tables_on_startup, false, "If true, ClickHouse creates all configured `system.*_log` tables before the startup. It can be helpful if some startup scripts depend on these tables.", 0) \
M(Double, gwp_asan_force_sample_probability, 0.0003, "Probability that an allocation from specific places will be sampled by GWP Asan (i.e. PODArray allocations)", 0) \
M(UInt64, config_reload_interval_ms, 2000, "How often clickhouse will reload config and check for new changes", 0) \ M(UInt64, config_reload_interval_ms, 2000, "How often clickhouse will reload config and check for new changes", 0) \
M(Bool, disable_insertion_and_mutation, false, "Disable all insert/alter/delete queries. This setting will be enabled if someone needs read-only nodes to prevent insertion and mutation affect reading performance.", 0) M(Bool, disable_insertion_and_mutation, false, "Disable all insert/alter/delete queries. This setting will be enabled if someone needs read-only nodes to prevent insertion and mutation affect reading performance.", 0)

View File

@ -44,16 +44,10 @@ struct Memory : boost::noncopyable, Allocator
char * m_data = nullptr; char * m_data = nullptr;
size_t alignment = 0; size_t alignment = 0;
[[maybe_unused]] bool allow_gwp_asan_force_sample{false};
Memory() = default; Memory() = default;
/// If alignment != 0, then allocate memory aligned to specified value. /// If alignment != 0, then allocate memory aligned to specified value.
explicit Memory(size_t size_, size_t alignment_ = 0, bool allow_gwp_asan_force_sample_ = false) explicit Memory(size_t size_, size_t alignment_ = 0) : alignment(alignment_) { alloc(size_); }
: alignment(alignment_), allow_gwp_asan_force_sample(allow_gwp_asan_force_sample_)
{
alloc(size_);
}
~Memory() ~Memory()
{ {
@ -133,11 +127,6 @@ private:
ProfileEvents::increment(ProfileEvents::IOBufferAllocs); ProfileEvents::increment(ProfileEvents::IOBufferAllocs);
ProfileEvents::increment(ProfileEvents::IOBufferAllocBytes, new_capacity); ProfileEvents::increment(ProfileEvents::IOBufferAllocBytes, new_capacity);
#if USE_GWP_ASAN
if (unlikely(allow_gwp_asan_force_sample && GWPAsan::shouldForceSample()))
gwp_asan::getThreadLocals()->NextSampleCounter = 1;
#endif
m_data = static_cast<char *>(Allocator::alloc(new_capacity, alignment)); m_data = static_cast<char *>(Allocator::alloc(new_capacity, alignment));
m_capacity = new_capacity; m_capacity = new_capacity;
m_size = new_size; m_size = new_size;
@ -165,7 +154,7 @@ protected:
public: public:
/// If non-nullptr 'existing_memory' is passed, then buffer will not create its own memory and will use existing_memory without ownership. /// If non-nullptr 'existing_memory' is passed, then buffer will not create its own memory and will use existing_memory without ownership.
explicit BufferWithOwnMemory(size_t size = DBMS_DEFAULT_BUFFER_SIZE, char * existing_memory = nullptr, size_t alignment = 0) explicit BufferWithOwnMemory(size_t size = DBMS_DEFAULT_BUFFER_SIZE, char * existing_memory = nullptr, size_t alignment = 0)
: Base(nullptr, 0), memory(existing_memory ? 0 : size, alignment, /*allow_gwp_asan_force_sample_=*/true) : Base(nullptr, 0), memory(existing_memory ? 0 : size, alignment)
{ {
Base::set(existing_memory ? existing_memory : memory.data(), size); Base::set(existing_memory ? existing_memory : memory.data(), size);
Base::padded = !existing_memory; Base::padded = !existing_memory;