mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 16:42:05 +00:00
Properly check the limit for sleepEachRow
function. Add a setting function_sleep_max_microseconds_per_block
This commit is contained in:
parent
cd171bef7d
commit
c9e30d3cf5
@ -633,7 +633,8 @@ class IColumn;
|
|||||||
M(UInt64, limit, 0, "Limit on read rows from the most 'end' result for select query, default 0 means no limit length", 0) \
|
M(UInt64, limit, 0, "Limit on read rows from the most 'end' result for select query, default 0 means no limit length", 0) \
|
||||||
M(UInt64, offset, 0, "Offset on read rows from the most 'end' result for select query", 0) \
|
M(UInt64, offset, 0, "Offset on read rows from the most 'end' result for select query", 0) \
|
||||||
\
|
\
|
||||||
M(UInt64, function_range_max_elements_in_block, 500000000, "Maximum number of values generated by function 'range' per block of data (sum of array sizes for every row in a block, see also 'max_block_size' and 'min_insert_block_size_rows'). It is a safety threshold.", 0) \
|
M(UInt64, function_range_max_elements_in_block, 500000000, "Maximum number of values generated by function `range` per block of data (sum of array sizes for every row in a block, see also 'max_block_size' and 'min_insert_block_size_rows'). It is a safety threshold.", 0) \
|
||||||
|
M(UInt64, function_sleep_max_microseconds_per_block, 3000, "Maximum number of microseconds the function `sleep` is allowed to sleep for each block. If a user called it with a larger value, it throws an exception. It is a safety threshold.", 0) \
|
||||||
M(ShortCircuitFunctionEvaluation, short_circuit_function_evaluation, ShortCircuitFunctionEvaluation::ENABLE, "Setting for short-circuit function evaluation configuration. Possible values: 'enable' - use short-circuit function evaluation for functions that are suitable for it, 'disable' - disable short-circuit function evaluation, 'force_enable' - use short-circuit function evaluation for all functions.", 0) \
|
M(ShortCircuitFunctionEvaluation, short_circuit_function_evaluation, ShortCircuitFunctionEvaluation::ENABLE, "Setting for short-circuit function evaluation configuration. Possible values: 'enable' - use short-circuit function evaluation for functions that are suitable for it, 'disable' - disable short-circuit function evaluation, 'force_enable' - use short-circuit function evaluation for all functions.", 0) \
|
||||||
\
|
\
|
||||||
M(LocalFSReadMethod, storage_file_read_method, LocalFSReadMethod::mmap, "Method of reading data from storage file, one of: read, pread, mmap.", 0) \
|
M(LocalFSReadMethod, storage_file_read_method, LocalFSReadMethod::mmap, "Method of reading data from storage file, one of: read, pread, mmap.", 0) \
|
||||||
|
@ -9,7 +9,8 @@
|
|||||||
#include <Common/assert_cast.h>
|
#include <Common/assert_cast.h>
|
||||||
#include <base/sleep.h>
|
#include <base/sleep.h>
|
||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
#include <Interpreters/Context_fwd.h>
|
#include <Interpreters/Context.h>
|
||||||
|
|
||||||
|
|
||||||
namespace ProfileEvents
|
namespace ProfileEvents
|
||||||
{
|
{
|
||||||
@ -40,11 +41,17 @@ enum class FunctionSleepVariant
|
|||||||
template <FunctionSleepVariant variant>
|
template <FunctionSleepVariant variant>
|
||||||
class FunctionSleep : public IFunction
|
class FunctionSleep : public IFunction
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
UInt64 max_microseconds;
|
||||||
public:
|
public:
|
||||||
static constexpr auto name = variant == FunctionSleepVariant::PerBlock ? "sleep" : "sleepEachRow";
|
static constexpr auto name = variant == FunctionSleepVariant::PerBlock ? "sleep" : "sleepEachRow";
|
||||||
static FunctionPtr create(ContextPtr)
|
static FunctionPtr create(ContextPtr context)
|
||||||
|
{
|
||||||
|
return std::make_shared<FunctionSleep<variant>>(context->getSettingsRef().function_sleep_max_microseconds_per_block);
|
||||||
|
}
|
||||||
|
|
||||||
|
FunctionSleep(UInt64 max_microseconds_) : max_microseconds(max_microseconds_)
|
||||||
{
|
{
|
||||||
return std::make_shared<FunctionSleep<variant>>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the name of the function.
|
/// Get the name of the function.
|
||||||
@ -105,13 +112,19 @@ public:
|
|||||||
if (size > 0)
|
if (size > 0)
|
||||||
{
|
{
|
||||||
/// When sleeping, the query cannot be cancelled. For ability to cancel query, we limit sleep time.
|
/// When sleeping, the query cannot be cancelled. For ability to cancel query, we limit sleep time.
|
||||||
if (seconds > 3.0) /// The choice is arbitrary
|
if (seconds * 1e6 > max_microseconds)
|
||||||
throw Exception(ErrorCodes::TOO_SLOW, "The maximum sleep time is 3 seconds. Requested: {}", toString(seconds));
|
throw Exception(ErrorCodes::TOO_SLOW, "The maximum sleep time is 3 seconds. Requested: {}", toString(seconds));
|
||||||
|
|
||||||
if (!dry_run)
|
if (!dry_run)
|
||||||
{
|
{
|
||||||
UInt64 count = (variant == FunctionSleepVariant::PerBlock ? 1 : size);
|
UInt64 count = (variant == FunctionSleepVariant::PerBlock ? 1 : size);
|
||||||
UInt64 microseconds = static_cast<UInt64>(seconds * count * 1e6);
|
UInt64 microseconds = static_cast<UInt64>(seconds * count * 1e6);
|
||||||
|
|
||||||
|
if (microseconds > max_microseconds)
|
||||||
|
throw Exception(ErrorCodes::TOO_SLOW,
|
||||||
|
"The maximum sleep time is 3 seconds. Requested: {} microseconds per block (of size {})",
|
||||||
|
microseconds, size);
|
||||||
|
|
||||||
sleepForMicroseconds(microseconds);
|
sleepForMicroseconds(microseconds);
|
||||||
ProfileEvents::increment(ProfileEvents::SleepFunctionCalls, count);
|
ProfileEvents::increment(ProfileEvents::SleepFunctionCalls, count);
|
||||||
ProfileEvents::increment(ProfileEvents::SleepFunctionMicroseconds, microseconds);
|
ProfileEvents::increment(ProfileEvents::SleepFunctionMicroseconds, microseconds);
|
||||||
|
1
tests/queries/0_stateless/02725_sleep_max_time.sql
Normal file
1
tests/queries/0_stateless/02725_sleep_max_time.sql
Normal file
@ -0,0 +1 @@
|
|||||||
|
SELECT * FROM system.numbers WHERE sleepEachRow(0.05) LIMIT 10; -- { serverError TOO_SLOW }
|
Loading…
Reference in New Issue
Block a user