mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 23:52:03 +00:00
Merge branch 'master' into try-to-change-signal-for-integration-rests
This commit is contained in:
commit
04adc58ba1
6
.gitmodules
vendored
6
.gitmodules
vendored
@ -210,9 +210,6 @@
|
|||||||
[submodule "contrib/fast_float"]
|
[submodule "contrib/fast_float"]
|
||||||
path = contrib/fast_float
|
path = contrib/fast_float
|
||||||
url = https://github.com/fastfloat/fast_float
|
url = https://github.com/fastfloat/fast_float
|
||||||
[submodule "contrib/libpqxx"]
|
|
||||||
path = contrib/libpqxx
|
|
||||||
url = https://github.com/jtv/libpqxx
|
|
||||||
[submodule "contrib/libpq"]
|
[submodule "contrib/libpq"]
|
||||||
path = contrib/libpq
|
path = contrib/libpq
|
||||||
url = https://github.com/ClickHouse-Extras/libpq
|
url = https://github.com/ClickHouse-Extras/libpq
|
||||||
@ -231,3 +228,6 @@
|
|||||||
[submodule "contrib/yaml-cpp"]
|
[submodule "contrib/yaml-cpp"]
|
||||||
path = contrib/yaml-cpp
|
path = contrib/yaml-cpp
|
||||||
url = https://github.com/ClickHouse-Extras/yaml-cpp.git
|
url = https://github.com/ClickHouse-Extras/yaml-cpp.git
|
||||||
|
[submodule "contrib/libpqxx"]
|
||||||
|
path = contrib/libpqxx
|
||||||
|
url = https://github.com/ClickHouse-Extras/libpqxx.git
|
||||||
|
@ -1,14 +1,22 @@
|
|||||||
#include "IBridge.h"
|
#include "IBridge.h"
|
||||||
|
|
||||||
#include <IO/ReadHelpers.h>
|
|
||||||
#include <boost/program_options.hpp>
|
#include <boost/program_options.hpp>
|
||||||
#include <Poco/Net/NetException.h>
|
#include <Poco/Net/NetException.h>
|
||||||
#include <Poco/Util/HelpFormatter.h>
|
#include <Poco/Util/HelpFormatter.h>
|
||||||
#include <Common/StringUtils/StringUtils.h>
|
|
||||||
#include <Formats/registerFormats.h>
|
|
||||||
#include <common/logger_useful.h>
|
#include <common/logger_useful.h>
|
||||||
|
#include <common/range.h>
|
||||||
|
|
||||||
|
#include <Common/StringUtils/StringUtils.h>
|
||||||
#include <Common/SensitiveDataMasker.h>
|
#include <Common/SensitiveDataMasker.h>
|
||||||
|
#include <common/errnoToString.h>
|
||||||
|
#include <IO/ReadHelpers.h>
|
||||||
|
#include <Formats/registerFormats.h>
|
||||||
#include <Server/HTTP/HTTPServer.h>
|
#include <Server/HTTP/HTTPServer.h>
|
||||||
|
#include <IO/WriteBufferFromFile.h>
|
||||||
|
#include <IO/WriteHelpers.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
|
|
||||||
#if USE_ODBC
|
#if USE_ODBC
|
||||||
# include <Poco/Data/ODBC/Connector.h>
|
# include <Poco/Data/ODBC/Connector.h>
|
||||||
@ -163,6 +171,31 @@ void IBridge::initialize(Application & self)
|
|||||||
max_server_connections = config().getUInt("max-server-connections", 1024);
|
max_server_connections = config().getUInt("max-server-connections", 1024);
|
||||||
keep_alive_timeout = config().getUInt64("keep-alive-timeout", 10);
|
keep_alive_timeout = config().getUInt64("keep-alive-timeout", 10);
|
||||||
|
|
||||||
|
struct rlimit limit;
|
||||||
|
const UInt64 gb = 1024 * 1024 * 1024;
|
||||||
|
|
||||||
|
/// Set maximum RSS to 1 GiB.
|
||||||
|
limit.rlim_max = limit.rlim_cur = gb;
|
||||||
|
if (setrlimit(RLIMIT_RSS, &limit))
|
||||||
|
LOG_WARNING(log, "Unable to set maximum RSS to 1GB: {} (current rlim_cur={}, rlim_max={})",
|
||||||
|
errnoToString(errno), limit.rlim_cur, limit.rlim_max);
|
||||||
|
|
||||||
|
if (!getrlimit(RLIMIT_RSS, &limit))
|
||||||
|
LOG_INFO(log, "RSS limit: cur={}, max={}", limit.rlim_cur, limit.rlim_max);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const auto oom_score = toString(config().getUInt64("bridge_oom_score", 500));
|
||||||
|
WriteBufferFromFile buf("/proc/self/oom_score_adj");
|
||||||
|
buf.write(oom_score.data(), oom_score.size());
|
||||||
|
buf.close();
|
||||||
|
LOG_INFO(log, "OOM score is set to {}", oom_score);
|
||||||
|
}
|
||||||
|
catch (const Exception & e)
|
||||||
|
{
|
||||||
|
LOG_WARNING(log, "Failed to set OOM score, error: {}", e.what());
|
||||||
|
}
|
||||||
|
|
||||||
initializeTerminationAndSignalProcessing();
|
initializeTerminationAndSignalProcessing();
|
||||||
|
|
||||||
ServerApplication::initialize(self); // NOLINT
|
ServerApplication::initialize(self); // NOLINT
|
||||||
@ -214,7 +247,7 @@ int IBridge::main(const std::vector<std::string> & /*args*/)
|
|||||||
|
|
||||||
server.stop();
|
server.stop();
|
||||||
|
|
||||||
for (size_t count : ext::range(1, 6))
|
for (size_t count : collections::range(1, 6))
|
||||||
{
|
{
|
||||||
if (server.currentConnections() == 0)
|
if (server.currentConnections() == 0)
|
||||||
break;
|
break;
|
||||||
|
@ -91,10 +91,12 @@ struct DecomposedFloat
|
|||||||
|
|
||||||
|
|
||||||
/// Compare float with integer of arbitrary width (both signed and unsigned are supported). Assuming two's complement arithmetic.
|
/// Compare float with integer of arbitrary width (both signed and unsigned are supported). Assuming two's complement arithmetic.
|
||||||
|
/// This function is generic, big integers (128, 256 bit) are supported as well.
|
||||||
/// Infinities are compared correctly. NaNs are treat similarly to infinities, so they can be less than all numbers.
|
/// Infinities are compared correctly. NaNs are treat similarly to infinities, so they can be less than all numbers.
|
||||||
/// (note that we need total order)
|
/// (note that we need total order)
|
||||||
|
/// Returns -1, 0 or 1.
|
||||||
template <typename Int>
|
template <typename Int>
|
||||||
int compare(Int rhs)
|
int compare(Int rhs) const
|
||||||
{
|
{
|
||||||
if (rhs == 0)
|
if (rhs == 0)
|
||||||
return sign();
|
return sign();
|
||||||
@ -137,10 +139,11 @@ struct DecomposedFloat
|
|||||||
if (normalized_exponent() >= static_cast<int16_t>(8 * sizeof(Int) - is_signed_v<Int>))
|
if (normalized_exponent() >= static_cast<int16_t>(8 * sizeof(Int) - is_signed_v<Int>))
|
||||||
return is_negative() ? -1 : 1;
|
return is_negative() ? -1 : 1;
|
||||||
|
|
||||||
using UInt = make_unsigned_t<Int>;
|
using UInt = std::conditional_t<(sizeof(Int) > sizeof(typename Traits::UInt)), make_unsigned_t<Int>, typename Traits::UInt>;
|
||||||
UInt uint_rhs = rhs < 0 ? -rhs : rhs;
|
UInt uint_rhs = rhs < 0 ? -rhs : rhs;
|
||||||
|
|
||||||
/// Smaller octave: abs(rhs) < abs(float)
|
/// Smaller octave: abs(rhs) < abs(float)
|
||||||
|
/// FYI, TIL: octave is also called "binade", https://en.wikipedia.org/wiki/Binade
|
||||||
if (uint_rhs < (static_cast<UInt>(1) << normalized_exponent()))
|
if (uint_rhs < (static_cast<UInt>(1) << normalized_exponent()))
|
||||||
return is_negative() ? -1 : 1;
|
return is_negative() ? -1 : 1;
|
||||||
|
|
||||||
@ -154,11 +157,11 @@ struct DecomposedFloat
|
|||||||
|
|
||||||
bool large_and_always_integer = normalized_exponent() >= static_cast<int16_t>(Traits::mantissa_bits);
|
bool large_and_always_integer = normalized_exponent() >= static_cast<int16_t>(Traits::mantissa_bits);
|
||||||
|
|
||||||
typename Traits::UInt a = large_and_always_integer
|
UInt a = large_and_always_integer
|
||||||
? mantissa() << (normalized_exponent() - Traits::mantissa_bits)
|
? static_cast<UInt>(mantissa()) << (normalized_exponent() - Traits::mantissa_bits)
|
||||||
: mantissa() >> (Traits::mantissa_bits - normalized_exponent());
|
: static_cast<UInt>(mantissa()) >> (Traits::mantissa_bits - normalized_exponent());
|
||||||
|
|
||||||
typename Traits::UInt b = uint_rhs - (static_cast<UInt>(1) << normalized_exponent());
|
UInt b = uint_rhs - (static_cast<UInt>(1) << normalized_exponent());
|
||||||
|
|
||||||
if (a < b)
|
if (a < b)
|
||||||
return is_negative() ? 1 : -1;
|
return is_negative() ? 1 : -1;
|
||||||
@ -175,37 +178,37 @@ struct DecomposedFloat
|
|||||||
|
|
||||||
|
|
||||||
template <typename Int>
|
template <typename Int>
|
||||||
bool equals(Int rhs)
|
bool equals(Int rhs) const
|
||||||
{
|
{
|
||||||
return compare(rhs) == 0;
|
return compare(rhs) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Int>
|
template <typename Int>
|
||||||
bool notEquals(Int rhs)
|
bool notEquals(Int rhs) const
|
||||||
{
|
{
|
||||||
return compare(rhs) != 0;
|
return compare(rhs) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Int>
|
template <typename Int>
|
||||||
bool less(Int rhs)
|
bool less(Int rhs) const
|
||||||
{
|
{
|
||||||
return compare(rhs) < 0;
|
return compare(rhs) < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Int>
|
template <typename Int>
|
||||||
bool greater(Int rhs)
|
bool greater(Int rhs) const
|
||||||
{
|
{
|
||||||
return compare(rhs) > 0;
|
return compare(rhs) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Int>
|
template <typename Int>
|
||||||
bool lessOrEquals(Int rhs)
|
bool lessOrEquals(Int rhs) const
|
||||||
{
|
{
|
||||||
return compare(rhs) <= 0;
|
return compare(rhs) <= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Int>
|
template <typename Int>
|
||||||
bool greaterOrEquals(Int rhs)
|
bool greaterOrEquals(Int rhs) const
|
||||||
{
|
{
|
||||||
return compare(rhs) >= 0;
|
return compare(rhs) >= 0;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#include <common/ReadlineLineReader.h>
|
#include <common/ReadlineLineReader.h>
|
||||||
#include <common/errnoToString.h>
|
#include <common/errnoToString.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <ext/function_traits.h>
|
#include <common/function_traits.h>
|
||||||
|
|
||||||
|
|
||||||
/** The simplest cache for a free function.
|
/** The simplest cache for a free function.
|
||||||
|
7
base/common/arraySize.h
Normal file
7
base/common/arraySize.h
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
/** \brief Returns number of elements in an automatic array. */
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
constexpr size_t arraySize(const T (&)[N]) noexcept { return N; }
|
27
base/common/bit_cast.h
Normal file
27
base/common/bit_cast.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Returns value `from` converted to type `To` while retaining bit representation.
|
||||||
|
* `To` and `From` must satisfy `CopyConstructible`.
|
||||||
|
*/
|
||||||
|
template <typename To, typename From>
|
||||||
|
std::decay_t<To> bit_cast(const From & from)
|
||||||
|
{
|
||||||
|
To res {};
|
||||||
|
memcpy(static_cast<void*>(&res), &from, std::min(sizeof(res), sizeof(from)));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Returns value `from` converted to type `To` while retaining bit representation.
|
||||||
|
* `To` and `From` must satisfy `CopyConstructible`.
|
||||||
|
*/
|
||||||
|
template <typename To, typename From>
|
||||||
|
std::decay_t<To> safe_bit_cast(const From & from)
|
||||||
|
{
|
||||||
|
static_assert(sizeof(To) == sizeof(From), "bit cast on types of different width");
|
||||||
|
return bit_cast<To, From>(from);
|
||||||
|
}
|
46
base/common/chrono_io.h
Normal file
46
base/common/chrono_io.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
#include <cctz/time_zone.h>
|
||||||
|
|
||||||
|
|
||||||
|
inline std::string to_string(const std::time_t & time)
|
||||||
|
{
|
||||||
|
return cctz::format("%Y-%m-%d %H:%M:%S", std::chrono::system_clock::from_time_t(time), cctz::local_time_zone());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Clock, typename Duration = typename Clock::duration>
|
||||||
|
std::string to_string(const std::chrono::time_point<Clock, Duration> & tp)
|
||||||
|
{
|
||||||
|
// Don't use DateLUT because it shows weird characters for
|
||||||
|
// TimePoint::max(). I wish we could use C++20 format, but it's not
|
||||||
|
// there yet.
|
||||||
|
// return DateLUT::instance().timeToString(std::chrono::system_clock::to_time_t(tp));
|
||||||
|
|
||||||
|
auto in_time_t = std::chrono::system_clock::to_time_t(tp);
|
||||||
|
return to_string(in_time_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Rep, typename Period = std::ratio<1>>
|
||||||
|
std::string to_string(const std::chrono::duration<Rep, Period> & duration)
|
||||||
|
{
|
||||||
|
auto seconds_as_int = std::chrono::duration_cast<std::chrono::seconds>(duration);
|
||||||
|
if (seconds_as_int == duration)
|
||||||
|
return std::to_string(seconds_as_int.count()) + "s";
|
||||||
|
auto seconds_as_double = std::chrono::duration_cast<std::chrono::duration<double>>(duration);
|
||||||
|
return std::to_string(seconds_as_double.count()) + "s";
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Clock, typename Duration = typename Clock::duration>
|
||||||
|
std::ostream & operator<<(std::ostream & o, const std::chrono::time_point<Clock, Duration> & tp)
|
||||||
|
{
|
||||||
|
return o << to_string(tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Rep, typename Period = std::ratio<1>>
|
||||||
|
std::ostream & operator<<(std::ostream & o, const std::chrono::duration<Rep, Period> & duration)
|
||||||
|
{
|
||||||
|
return o << to_string(duration);
|
||||||
|
}
|
52
base/common/map.h
Normal file
52
base/common/map.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
#include <boost/iterator/transform_iterator.hpp>
|
||||||
|
|
||||||
|
namespace collections
|
||||||
|
{
|
||||||
|
|
||||||
|
/// \brief Strip type off top level reference and cv-qualifiers thus allowing storage in containers
|
||||||
|
template <typename T>
|
||||||
|
using unqualified_t = std::remove_cv_t<std::remove_reference_t<T>>;
|
||||||
|
|
||||||
|
/** \brief Returns collection of the same container-type as the input collection,
|
||||||
|
* with each element transformed by the application of `mapper`.
|
||||||
|
*/
|
||||||
|
template <template <typename...> class Collection, typename... Params, typename Mapper>
|
||||||
|
auto map(const Collection<Params...> & collection, Mapper && mapper)
|
||||||
|
{
|
||||||
|
using value_type = unqualified_t<decltype(mapper(*std::begin(collection)))>;
|
||||||
|
|
||||||
|
return Collection<value_type>(
|
||||||
|
boost::make_transform_iterator(std::begin(collection), std::forward<Mapper>(mapper)),
|
||||||
|
boost::make_transform_iterator(std::end(collection), std::forward<Mapper>(mapper)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Returns collection of specified container-type,
|
||||||
|
* with each element transformed by the application of `mapper`.
|
||||||
|
* Allows conversion between different container-types, e.g. std::vector to std::list
|
||||||
|
*/
|
||||||
|
template <template <typename...> class ResultCollection, typename Collection, typename Mapper>
|
||||||
|
auto map(const Collection & collection, Mapper && mapper)
|
||||||
|
{
|
||||||
|
using value_type = unqualified_t<decltype(mapper(*std::begin(collection)))>;
|
||||||
|
|
||||||
|
return ResultCollection<value_type>(
|
||||||
|
boost::make_transform_iterator(std::begin(collection), std::forward<Mapper>(mapper)),
|
||||||
|
boost::make_transform_iterator(std::end(collection), std::forward<Mapper>(mapper)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Returns collection of specified type,
|
||||||
|
* with each element transformed by the application of `mapper`.
|
||||||
|
* Allows leveraging implicit conversion between the result of applying `mapper` and R::value_type.
|
||||||
|
*/
|
||||||
|
template <typename ResultCollection, typename Collection, typename Mapper>
|
||||||
|
auto map(const Collection & collection, Mapper && mapper)
|
||||||
|
{
|
||||||
|
return ResultCollection(
|
||||||
|
boost::make_transform_iterator(std::begin(collection), std::forward<Mapper>(mapper)),
|
||||||
|
boost::make_transform_iterator(std::end(collection), std::forward<Mapper>(mapper)));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,9 +4,9 @@
|
|||||||
#include <boost/range/adaptor/transformed.hpp>
|
#include <boost/range/adaptor/transformed.hpp>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
|
namespace collections
|
||||||
namespace ext
|
|
||||||
{
|
{
|
||||||
|
|
||||||
namespace internal
|
namespace internal
|
||||||
{
|
{
|
||||||
template <typename ResultType, typename CountingType, typename BeginType, typename EndType>
|
template <typename ResultType, typename CountingType, typename BeginType, typename EndType>
|
||||||
@ -24,11 +24,11 @@ namespace internal
|
|||||||
/// For loop adaptor which is used to iterate through a half-closed interval [begin, end).
|
/// For loop adaptor which is used to iterate through a half-closed interval [begin, end).
|
||||||
/// The parameters `begin` and `end` can have any integral or enum types.
|
/// The parameters `begin` and `end` can have any integral or enum types.
|
||||||
template <typename BeginType,
|
template <typename BeginType,
|
||||||
typename EndType,
|
typename EndType,
|
||||||
typename = std::enable_if_t<
|
typename = std::enable_if_t<
|
||||||
(std::is_integral_v<BeginType> || std::is_enum_v<BeginType>) &&
|
(std::is_integral_v<BeginType> || std::is_enum_v<BeginType>) &&
|
||||||
(std::is_integral_v<EndType> || std::is_enum_v<EndType>) &&
|
(std::is_integral_v<EndType> || std::is_enum_v<EndType>) &&
|
||||||
(!std::is_enum_v<BeginType> || !std::is_enum_v<EndType> || std::is_same_v<BeginType, EndType>), void>>
|
(!std::is_enum_v<BeginType> || !std::is_enum_v<EndType> || std::is_same_v<BeginType, EndType>), void>>
|
||||||
inline auto range(BeginType begin, EndType end)
|
inline auto range(BeginType begin, EndType end)
|
||||||
{
|
{
|
||||||
if constexpr (std::is_integral_v<BeginType> && std::is_integral_v<EndType>)
|
if constexpr (std::is_integral_v<BeginType> && std::is_integral_v<EndType>)
|
||||||
@ -51,7 +51,7 @@ inline auto range(BeginType begin, EndType end)
|
|||||||
/// The parameter `end` can have any integral or enum type.
|
/// The parameter `end` can have any integral or enum type.
|
||||||
/// The same as range(0, end).
|
/// The same as range(0, end).
|
||||||
template <typename Type,
|
template <typename Type,
|
||||||
typename = std::enable_if_t<std::is_integral_v<Type> || std::is_enum_v<Type>, void>>
|
typename = std::enable_if_t<std::is_integral_v<Type> || std::is_enum_v<Type>, void>>
|
||||||
inline auto range(Type end)
|
inline auto range(Type end)
|
||||||
{
|
{
|
||||||
if constexpr (std::is_integral_v<Type>)
|
if constexpr (std::is_integral_v<Type>)
|
||||||
@ -59,4 +59,5 @@ inline auto range(Type end)
|
|||||||
else
|
else
|
||||||
return internal::rangeImpl<Type, std::underlying_type_t<Type>>(0, end);
|
return internal::rangeImpl<Type, std::underlying_type_t<Type>>(0, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -4,9 +4,6 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
|
||||||
namespace ext
|
|
||||||
{
|
|
||||||
template <class F>
|
template <class F>
|
||||||
class [[nodiscard]] basic_scope_guard
|
class [[nodiscard]] basic_scope_guard
|
||||||
{
|
{
|
||||||
@ -105,10 +102,9 @@ using scope_guard = basic_scope_guard<std::function<void(void)>>;
|
|||||||
|
|
||||||
template <class F>
|
template <class F>
|
||||||
inline basic_scope_guard<F> make_scope_guard(F && function_) { return std::forward<F>(function_); }
|
inline basic_scope_guard<F> make_scope_guard(F && function_) { return std::forward<F>(function_); }
|
||||||
}
|
|
||||||
|
|
||||||
#define SCOPE_EXIT_CONCAT(n, ...) \
|
#define SCOPE_EXIT_CONCAT(n, ...) \
|
||||||
const auto scope_exit##n = ext::make_scope_guard([&] { __VA_ARGS__; })
|
const auto scope_exit##n = make_scope_guard([&] { __VA_ARGS__; })
|
||||||
#define SCOPE_EXIT_FWD(n, ...) SCOPE_EXIT_CONCAT(n, __VA_ARGS__)
|
#define SCOPE_EXIT_FWD(n, ...) SCOPE_EXIT_CONCAT(n, __VA_ARGS__)
|
||||||
#define SCOPE_EXIT(...) SCOPE_EXIT_FWD(__LINE__, __VA_ARGS__)
|
#define SCOPE_EXIT(...) SCOPE_EXIT_FWD(__LINE__, __VA_ARGS__)
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <common/logger_useful.h>
|
#include <common/logger_useful.h>
|
||||||
#include <Common/MemoryTracker.h>
|
#include <Common/MemoryTracker.h>
|
||||||
|
|
@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace ext
|
|
||||||
{
|
|
||||||
|
|
||||||
/** Allows to make std::shared_ptr from T with protected constructor.
|
/** Allows to make std::shared_ptr from T with protected constructor.
|
||||||
*
|
*
|
||||||
@ -36,4 +34,3 @@ struct is_shared_ptr<std::shared_ptr<T>>
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline constexpr bool is_shared_ptr_v = is_shared_ptr<T>::value;
|
inline constexpr bool is_shared_ptr_v = is_shared_ptr<T>::value;
|
||||||
}
|
|
@ -109,10 +109,7 @@ public:
|
|||||||
|
|
||||||
constexpr explicit operator bool() const noexcept;
|
constexpr explicit operator bool() const noexcept;
|
||||||
|
|
||||||
template <class T>
|
template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>, T>>
|
||||||
using _integral_not_wide_integer_class = typename std::enable_if<std::is_arithmetic<T>::value, T>::type;
|
|
||||||
|
|
||||||
template <class T, class = _integral_not_wide_integer_class<T>>
|
|
||||||
constexpr operator T() const noexcept;
|
constexpr operator T() const noexcept;
|
||||||
|
|
||||||
constexpr operator long double() const noexcept;
|
constexpr operator long double() const noexcept;
|
||||||
|
@ -255,13 +255,13 @@ struct integer<Bits, Signed>::_impl
|
|||||||
set_multiplier<double>(self, alpha);
|
set_multiplier<double>(self, alpha);
|
||||||
|
|
||||||
self *= max_int;
|
self *= max_int;
|
||||||
self += static_cast<uint64_t>(t - alpha * static_cast<T>(max_int)); // += b_i
|
self += static_cast<uint64_t>(t - floor(alpha) * static_cast<T>(max_int)); // += b_i
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr static void wide_integer_from_builtin(integer<Bits, Signed>& self, double rhs) noexcept
|
constexpr static void wide_integer_from_builtin(integer<Bits, Signed> & self, double rhs) noexcept
|
||||||
{
|
{
|
||||||
constexpr int64_t max_int = std::numeric_limits<int64_t>::max();
|
constexpr int64_t max_int = std::numeric_limits<int64_t>::max();
|
||||||
constexpr int64_t min_int = std::numeric_limits<int64_t>::min();
|
constexpr int64_t min_int = std::numeric_limits<int64_t>::lowest();
|
||||||
|
|
||||||
/// There are values in int64 that have more than 53 significant bits (in terms of double
|
/// There are values in int64 that have more than 53 significant bits (in terms of double
|
||||||
/// representation). Such values, being promoted to double, are rounded up or down. If they are rounded up,
|
/// representation). Such values, being promoted to double, are rounded up or down. If they are rounded up,
|
||||||
@ -271,14 +271,14 @@ struct integer<Bits, Signed>::_impl
|
|||||||
/// The necessary check here is that long double has enough significant (mantissa) bits to store the
|
/// The necessary check here is that long double has enough significant (mantissa) bits to store the
|
||||||
/// int64_t max value precisely.
|
/// int64_t max value precisely.
|
||||||
|
|
||||||
//TODO Be compatible with Apple aarch64
|
// TODO Be compatible with Apple aarch64
|
||||||
#if not (defined(__APPLE__) && defined(__aarch64__))
|
#if not (defined(__APPLE__) && defined(__aarch64__))
|
||||||
static_assert(LDBL_MANT_DIG >= 64,
|
static_assert(LDBL_MANT_DIG >= 64,
|
||||||
"On your system long double has less than 64 precision bits,"
|
"On your system long double has less than 64 precision bits, "
|
||||||
"which may result in UB when initializing double from int64_t");
|
"which may result in UB when initializing double from int64_t");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((rhs > 0 && rhs < static_cast<long double>(max_int)) || (rhs < 0 && rhs > static_cast<long double>(min_int)))
|
if (rhs > static_cast<long double>(min_int) && rhs < static_cast<long double>(max_int))
|
||||||
{
|
{
|
||||||
self = static_cast<int64_t>(rhs);
|
self = static_cast<int64_t>(rhs);
|
||||||
return;
|
return;
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
|
|
||||||
#include <Poco/Observer.h>
|
#include <Poco/Observer.h>
|
||||||
#include <Poco/AutoPtr.h>
|
#include <Poco/AutoPtr.h>
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <algorithm>
|
|
||||||
#include <type_traits>
|
|
||||||
|
|
||||||
|
|
||||||
namespace ext
|
|
||||||
{
|
|
||||||
/** \brief Returns value `from` converted to type `To` while retaining bit representation.
|
|
||||||
* `To` and `From` must satisfy `CopyConstructible`.
|
|
||||||
*/
|
|
||||||
template <typename To, typename From>
|
|
||||||
std::decay_t<To> bit_cast(const From & from)
|
|
||||||
{
|
|
||||||
To res {};
|
|
||||||
memcpy(static_cast<void*>(&res), &from, std::min(sizeof(res), sizeof(from)));
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Returns value `from` converted to type `To` while retaining bit representation.
|
|
||||||
* `To` and `From` must satisfy `CopyConstructible`.
|
|
||||||
*/
|
|
||||||
template <typename To, typename From>
|
|
||||||
std::decay_t<To> safe_bit_cast(const From & from)
|
|
||||||
{
|
|
||||||
static_assert(sizeof(To) == sizeof(From), "bit cast on types of different width");
|
|
||||||
return bit_cast<To, From>(from);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <chrono>
|
|
||||||
#include <string>
|
|
||||||
#include <sstream>
|
|
||||||
#include <cctz/time_zone.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace ext
|
|
||||||
{
|
|
||||||
inline std::string to_string(const std::time_t & time)
|
|
||||||
{
|
|
||||||
return cctz::format("%Y-%m-%d %H:%M:%S", std::chrono::system_clock::from_time_t(time), cctz::local_time_zone());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Clock, typename Duration = typename Clock::duration>
|
|
||||||
std::string to_string(const std::chrono::time_point<Clock, Duration> & tp)
|
|
||||||
{
|
|
||||||
// Don't use DateLUT because it shows weird characters for
|
|
||||||
// TimePoint::max(). I wish we could use C++20 format, but it's not
|
|
||||||
// there yet.
|
|
||||||
// return DateLUT::instance().timeToString(std::chrono::system_clock::to_time_t(tp));
|
|
||||||
|
|
||||||
auto in_time_t = std::chrono::system_clock::to_time_t(tp);
|
|
||||||
return to_string(in_time_t);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Rep, typename Period = std::ratio<1>>
|
|
||||||
std::string to_string(const std::chrono::duration<Rep, Period> & duration)
|
|
||||||
{
|
|
||||||
auto seconds_as_int = std::chrono::duration_cast<std::chrono::seconds>(duration);
|
|
||||||
if (seconds_as_int == duration)
|
|
||||||
return std::to_string(seconds_as_int.count()) + "s";
|
|
||||||
auto seconds_as_double = std::chrono::duration_cast<std::chrono::duration<double>>(duration);
|
|
||||||
return std::to_string(seconds_as_double.count()) + "s";
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Clock, typename Duration = typename Clock::duration>
|
|
||||||
std::ostream & operator<<(std::ostream & o, const std::chrono::time_point<Clock, Duration> & tp)
|
|
||||||
{
|
|
||||||
return o << to_string(tp);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Rep, typename Period = std::ratio<1>>
|
|
||||||
std::ostream & operator<<(std::ostream & o, const std::chrono::duration<Rep, Period> & duration)
|
|
||||||
{
|
|
||||||
return o << to_string(duration);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <iterator>
|
|
||||||
|
|
||||||
namespace ext
|
|
||||||
{
|
|
||||||
/** \brief Returns collection of specified container-type.
|
|
||||||
* Retains stored value_type, constructs resulting collection using iterator range. */
|
|
||||||
template <template <typename...> class ResultCollection, typename Collection>
|
|
||||||
auto collection_cast(const Collection & collection)
|
|
||||||
{
|
|
||||||
using value_type = typename Collection::value_type;
|
|
||||||
|
|
||||||
return ResultCollection<value_type>(std::begin(collection), std::end(collection));
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Returns collection of specified type.
|
|
||||||
* Performs implicit conversion of between source and result value_type, if available and required. */
|
|
||||||
template <typename ResultCollection, typename Collection>
|
|
||||||
auto collection_cast(const Collection & collection)
|
|
||||||
{
|
|
||||||
return ResultCollection(std::begin(collection), std::end(collection));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,60 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <ext/size.h>
|
|
||||||
#include <type_traits>
|
|
||||||
#include <utility>
|
|
||||||
#include <iterator>
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Provides a wrapper view around a container, allowing to iterate over it's elements and indices.
|
|
||||||
* Allow writing code like shown below:
|
|
||||||
*
|
|
||||||
* std::vector<T> v = getVector();
|
|
||||||
* for (const std::pair<const std::size_t, T &> index_and_value : ext::enumerate(v))
|
|
||||||
* std::cout << "element " << index_and_value.first << " is " << index_and_value.second << std::endl;
|
|
||||||
*/
|
|
||||||
namespace ext
|
|
||||||
{
|
|
||||||
template <typename It> struct enumerate_iterator
|
|
||||||
{
|
|
||||||
using traits = typename std::iterator_traits<It>;
|
|
||||||
using iterator_category = typename traits::iterator_category;
|
|
||||||
using value_type = std::pair<const std::size_t, typename traits::value_type>;
|
|
||||||
using difference_type = typename traits::difference_type;
|
|
||||||
using reference = std::pair<const std::size_t, typename traits::reference>;
|
|
||||||
|
|
||||||
std::size_t idx;
|
|
||||||
It it;
|
|
||||||
|
|
||||||
enumerate_iterator(const std::size_t idx_, It it_) : idx{idx_}, it{it_} {}
|
|
||||||
|
|
||||||
auto operator*() const { return reference(idx, *it); }
|
|
||||||
|
|
||||||
bool operator!=(const enumerate_iterator & other) const { return it != other.it; }
|
|
||||||
|
|
||||||
enumerate_iterator & operator++() { return ++idx, ++it, *this; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Collection> struct enumerate_wrapper
|
|
||||||
{
|
|
||||||
using underlying_iterator = decltype(std::begin(std::declval<Collection &>()));
|
|
||||||
using iterator = enumerate_iterator<underlying_iterator>;
|
|
||||||
|
|
||||||
Collection & collection;
|
|
||||||
|
|
||||||
enumerate_wrapper(Collection & collection_) : collection(collection_) {}
|
|
||||||
|
|
||||||
auto begin() { return iterator(0, std::begin(collection)); }
|
|
||||||
auto end() { return iterator(ext::size(collection), std::end(collection)); }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Collection> auto enumerate(Collection & collection)
|
|
||||||
{
|
|
||||||
return enumerate_wrapper<Collection>{collection};
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Collection> auto enumerate(const Collection & collection)
|
|
||||||
{
|
|
||||||
return enumerate_wrapper<const Collection>{collection};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
namespace ext
|
|
||||||
{
|
|
||||||
/// \brief Identity function for use with other algorithms as a pass-through.
|
|
||||||
class identity
|
|
||||||
{
|
|
||||||
/** \brief Function pointer type template for converting identity to a function pointer.
|
|
||||||
* Presumably useless, provided for completeness. */
|
|
||||||
template <typename T> using function_ptr_t = T &&(*)(T &&);
|
|
||||||
|
|
||||||
/** \brief Implementation of identity as a non-instance member function for taking function pointer. */
|
|
||||||
template <typename T> static T && invoke(T && t) { return std::forward<T>(t); }
|
|
||||||
|
|
||||||
public:
|
|
||||||
/** \brief Returns the value passed as a sole argument using perfect forwarding. */
|
|
||||||
template <typename T> T && operator()(T && t) const { return std::forward<T>(t); }
|
|
||||||
|
|
||||||
/** \brief Allows conversion of identity instance to a function pointer. */
|
|
||||||
template <typename T> operator function_ptr_t<T>() const { return &invoke; };
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <utility>
|
|
||||||
#include <type_traits>
|
|
||||||
#include <array>
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Produces std::array of specified size, containing copies of provided object.
|
|
||||||
* Copy is performed N-1 times, and the last element is being moved.
|
|
||||||
* This helper allows to initialize std::array in place.
|
|
||||||
*/
|
|
||||||
namespace ext
|
|
||||||
{
|
|
||||||
namespace detail
|
|
||||||
{
|
|
||||||
|
|
||||||
template<std::size_t size, typename T, std::size_t... indexes>
|
|
||||||
constexpr auto make_array_n_impl(T && value, std::index_sequence<indexes...>)
|
|
||||||
{
|
|
||||||
/// Comma is used to make N-1 copies of value
|
|
||||||
return std::array<std::decay_t<T>, size>{ (static_cast<void>(indexes), value)..., std::forward<T>(value) };
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
constexpr auto make_array_n(std::integral_constant<std::size_t, 0>, T &&)
|
|
||||||
{
|
|
||||||
return std::array<std::decay_t<T>, 0>{};
|
|
||||||
}
|
|
||||||
|
|
||||||
template<std::size_t size, typename T>
|
|
||||||
constexpr auto make_array_n(std::integral_constant<std::size_t, size>, T && value)
|
|
||||||
{
|
|
||||||
return detail::make_array_n_impl<size>(std::forward<T>(value), std::make_index_sequence<size - 1>{});
|
|
||||||
}
|
|
||||||
|
|
||||||
template<std::size_t size, typename T>
|
|
||||||
constexpr auto make_array_n(T && value)
|
|
||||||
{
|
|
||||||
return make_array_n(std::integral_constant<std::size_t, size>{}, std::forward<T>(value));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <type_traits>
|
|
||||||
#include <boost/iterator/transform_iterator.hpp>
|
|
||||||
|
|
||||||
|
|
||||||
namespace ext
|
|
||||||
{
|
|
||||||
/// \brief Strip type off top level reference and cv-qualifiers thus allowing storage in containers
|
|
||||||
template <typename T>
|
|
||||||
using unqualified_t = std::remove_cv_t<std::remove_reference_t<T>>;
|
|
||||||
|
|
||||||
/** \brief Returns collection of the same container-type as the input collection,
|
|
||||||
* with each element transformed by the application of `mapper`.
|
|
||||||
*/
|
|
||||||
template <template <typename...> class Collection, typename... Params, typename Mapper>
|
|
||||||
auto map(const Collection<Params...> & collection, Mapper && mapper)
|
|
||||||
{
|
|
||||||
using value_type = unqualified_t<decltype(mapper(*std::begin(collection)))>;
|
|
||||||
|
|
||||||
return Collection<value_type>(
|
|
||||||
boost::make_transform_iterator(std::begin(collection), std::forward<Mapper>(mapper)),
|
|
||||||
boost::make_transform_iterator(std::end(collection), std::forward<Mapper>(mapper)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Returns collection of specified container-type,
|
|
||||||
* with each element transformed by the application of `mapper`.
|
|
||||||
* Allows conversion between different container-types, e.g. std::vector to std::list
|
|
||||||
*/
|
|
||||||
template <template <typename...> class ResultCollection, typename Collection, typename Mapper>
|
|
||||||
auto map(const Collection & collection, Mapper && mapper)
|
|
||||||
{
|
|
||||||
using value_type = unqualified_t<decltype(mapper(*std::begin(collection)))>;
|
|
||||||
|
|
||||||
return ResultCollection<value_type>(
|
|
||||||
boost::make_transform_iterator(std::begin(collection), std::forward<Mapper>(mapper)),
|
|
||||||
boost::make_transform_iterator(std::end(collection), std::forward<Mapper>(mapper)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Returns collection of specified type,
|
|
||||||
* with each element transformed by the application of `mapper`.
|
|
||||||
* Allows leveraging implicit conversion between the result of applying `mapper` and R::value_type.
|
|
||||||
*/
|
|
||||||
template <typename ResultCollection, typename Collection, typename Mapper>
|
|
||||||
auto map(const Collection & collection, Mapper && mapper)
|
|
||||||
{
|
|
||||||
return ResultCollection(
|
|
||||||
boost::make_transform_iterator(std::begin(collection), std::forward<Mapper>(mapper)),
|
|
||||||
boost::make_transform_iterator(std::end(collection), std::forward<Mapper>(mapper)));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace ext
|
|
||||||
{
|
|
||||||
|
|
||||||
/// Moves all arguments starting from the second to the end of the vector.
|
|
||||||
/// For example, `push_back(vec, a1, a2, a3)` is a more compact way to write
|
|
||||||
/// `vec.push_back(a1); vec.push_back(a2); vec.push_back(a3);`
|
|
||||||
/// This function is like boost::range::push_back() but works for noncopyable types too.
|
|
||||||
template <typename T>
|
|
||||||
void push_back(std::vector<T> &)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename FirstArg, typename... OtherArgs>
|
|
||||||
void push_back(std::vector<T> & vec, FirstArg && first, OtherArgs &&... other)
|
|
||||||
{
|
|
||||||
vec.reserve(vec.size() + sizeof...(other) + 1);
|
|
||||||
vec.emplace_back(std::move(first));
|
|
||||||
push_back(vec, std::move(other)...);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
|
|
||||||
|
|
||||||
namespace ext
|
|
||||||
{
|
|
||||||
/** \brief Returns number of elements in an automatic array. */
|
|
||||||
template <typename T, std::size_t N>
|
|
||||||
constexpr std::size_t size(const T (&)[N]) noexcept { return N; }
|
|
||||||
|
|
||||||
/** \brief Returns number of in a container providing size() member function. */
|
|
||||||
template <typename T> constexpr auto size(const T & t) { return t.size(); }
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
namespace ext
|
|
||||||
{
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
class unlock_guard
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
unlock_guard(T & mutex_) : mutex(mutex_)
|
|
||||||
{
|
|
||||||
mutex.unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
~unlock_guard()
|
|
||||||
{
|
|
||||||
mutex.lock();
|
|
||||||
}
|
|
||||||
|
|
||||||
unlock_guard(const unlock_guard &) = delete;
|
|
||||||
unlock_guard & operator=(const unlock_guard &) = delete;
|
|
||||||
|
|
||||||
private:
|
|
||||||
T & mutex;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
2
contrib/libpqxx
vendored
2
contrib/libpqxx
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 58d2a028d1600225ac3a478d6b3a06ba2f0c01f6
|
Subproject commit 357608d11b7a1961c3fb7db2ef9a5dbb2e87da77
|
@ -64,7 +64,7 @@ set (HDRS
|
|||||||
add_library(libpqxx ${SRCS} ${HDRS})
|
add_library(libpqxx ${SRCS} ${HDRS})
|
||||||
|
|
||||||
target_link_libraries(libpqxx PUBLIC ${LIBPQ_LIBRARY})
|
target_link_libraries(libpqxx PUBLIC ${LIBPQ_LIBRARY})
|
||||||
target_include_directories (libpqxx PRIVATE "${LIBRARY_DIR}/include")
|
target_include_directories (libpqxx SYSTEM PRIVATE "${LIBRARY_DIR}/include")
|
||||||
|
|
||||||
# crutch
|
# crutch
|
||||||
set(CM_CONFIG_H_IN "${LIBRARY_DIR}/include/pqxx/config.h.in")
|
set(CM_CONFIG_H_IN "${LIBRARY_DIR}/include/pqxx/config.h.in")
|
||||||
|
@ -200,7 +200,7 @@ continue
|
|||||||
# The server has died.
|
# The server has died.
|
||||||
task_exit_code=210
|
task_exit_code=210
|
||||||
echo "failure" > status.txt
|
echo "failure" > status.txt
|
||||||
if ! grep -ao "Received signal.*\|Logical error.*\|Assertion.*failed\|Failed assertion.*\|.*runtime error: .*\|.*is located.*\|SUMMARY: AddressSanitizer:.*\|SUMMARY: MemorySanitizer:.*\|SUMMARY: ThreadSanitizer:.*\|.*_LIBCPP_ASSERT.*" server.log > description.txt
|
if ! grep --text -ao "Received signal.*\|Logical error.*\|Assertion.*failed\|Failed assertion.*\|.*runtime error: .*\|.*is located.*\|SUMMARY: AddressSanitizer:.*\|SUMMARY: MemorySanitizer:.*\|SUMMARY: ThreadSanitizer:.*\|.*_LIBCPP_ASSERT.*" server.log > description.txt
|
||||||
then
|
then
|
||||||
echo "Lost connection to server. See the logs." > description.txt
|
echo "Lost connection to server. See the logs." > description.txt
|
||||||
fi
|
fi
|
||||||
@ -220,8 +220,8 @@ continue
|
|||||||
# which is confusing.
|
# which is confusing.
|
||||||
task_exit_code=$fuzzer_exit_code
|
task_exit_code=$fuzzer_exit_code
|
||||||
echo "failure" > status.txt
|
echo "failure" > status.txt
|
||||||
{ grep -o "Found error:.*" fuzzer.log \
|
{ grep --text -o "Found error:.*" fuzzer.log \
|
||||||
|| grep -o "Exception.*" fuzzer.log \
|
|| grep --text -o "Exception.*" fuzzer.log \
|
||||||
|| echo "Fuzzer failed ($fuzzer_exit_code). See the logs." ; } \
|
|| echo "Fuzzer failed ($fuzzer_exit_code). See the logs." ; } \
|
||||||
| tail -1 > description.txt
|
| tail -1 > description.txt
|
||||||
fi
|
fi
|
||||||
|
@ -112,12 +112,15 @@ timeout "$MAX_RUN_TIME" bash -c run_tests ||:
|
|||||||
|
|
||||||
./process_functional_tests_result.py || echo -e "failure\tCannot parse results" > /test_output/check_status.tsv
|
./process_functional_tests_result.py || echo -e "failure\tCannot parse results" > /test_output/check_status.tsv
|
||||||
|
|
||||||
|
grep -Fa "Fatal" /var/log/clickhouse-server/clickhouse-server.log ||:
|
||||||
pigz < /var/log/clickhouse-server/clickhouse-server.log > /test_output/clickhouse-server.log.gz ||:
|
pigz < /var/log/clickhouse-server/clickhouse-server.log > /test_output/clickhouse-server.log.gz ||:
|
||||||
mv /var/log/clickhouse-server/stderr.log /test_output/ ||:
|
mv /var/log/clickhouse-server/stderr.log /test_output/ ||:
|
||||||
if [[ -n "$WITH_COVERAGE" ]] && [[ "$WITH_COVERAGE" -eq 1 ]]; then
|
if [[ -n "$WITH_COVERAGE" ]] && [[ "$WITH_COVERAGE" -eq 1 ]]; then
|
||||||
tar -chf /test_output/clickhouse_coverage.tar.gz /profraw ||:
|
tar -chf /test_output/clickhouse_coverage.tar.gz /profraw ||:
|
||||||
fi
|
fi
|
||||||
if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then
|
if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then
|
||||||
|
grep -Fa "Fatal" /var/log/clickhouse-server/clickhouse-server1.log ||:
|
||||||
|
grep -Fa "Fatal" /var/log/clickhouse-server/clickhouse-server2.log ||:
|
||||||
pigz < /var/log/clickhouse-server/clickhouse-server1.log > /test_output/clickhouse-server1.log.gz ||:
|
pigz < /var/log/clickhouse-server/clickhouse-server1.log > /test_output/clickhouse-server1.log.gz ||:
|
||||||
pigz < /var/log/clickhouse-server/clickhouse-server2.log > /test_output/clickhouse-server2.log.gz ||:
|
pigz < /var/log/clickhouse-server/clickhouse-server2.log > /test_output/clickhouse-server2.log.gz ||:
|
||||||
mv /var/log/clickhouse-server/stderr1.log /test_output/ ||:
|
mv /var/log/clickhouse-server/stderr1.log /test_output/ ||:
|
||||||
|
@ -14,6 +14,8 @@ HUNG_SIGN = "Found hung queries in processlist"
|
|||||||
|
|
||||||
NO_TASK_TIMEOUT_SIGN = "All tests have finished"
|
NO_TASK_TIMEOUT_SIGN = "All tests have finished"
|
||||||
|
|
||||||
|
RETRIES_SIGN = "Some tests were restarted"
|
||||||
|
|
||||||
def process_test_log(log_path):
|
def process_test_log(log_path):
|
||||||
total = 0
|
total = 0
|
||||||
skipped = 0
|
skipped = 0
|
||||||
@ -21,6 +23,7 @@ def process_test_log(log_path):
|
|||||||
failed = 0
|
failed = 0
|
||||||
success = 0
|
success = 0
|
||||||
hung = False
|
hung = False
|
||||||
|
retries = False
|
||||||
task_timeout = True
|
task_timeout = True
|
||||||
test_results = []
|
test_results = []
|
||||||
with open(log_path, 'r') as test_file:
|
with open(log_path, 'r') as test_file:
|
||||||
@ -30,6 +33,8 @@ def process_test_log(log_path):
|
|||||||
task_timeout = False
|
task_timeout = False
|
||||||
if HUNG_SIGN in line:
|
if HUNG_SIGN in line:
|
||||||
hung = True
|
hung = True
|
||||||
|
if RETRIES_SIGN in line:
|
||||||
|
retries = True
|
||||||
if any(sign in line for sign in (OK_SIGN, FAIL_SIGN, UNKNOWN_SIGN, SKIPPED_SIGN)):
|
if any(sign in line for sign in (OK_SIGN, FAIL_SIGN, UNKNOWN_SIGN, SKIPPED_SIGN)):
|
||||||
test_name = line.split(' ')[2].split(':')[0]
|
test_name = line.split(' ')[2].split(':')[0]
|
||||||
|
|
||||||
@ -57,7 +62,7 @@ def process_test_log(log_path):
|
|||||||
else:
|
else:
|
||||||
success += int(OK_SIGN in line)
|
success += int(OK_SIGN in line)
|
||||||
test_results.append((test_name, "OK", test_time))
|
test_results.append((test_name, "OK", test_time))
|
||||||
return total, skipped, unknown, failed, success, hung, task_timeout, test_results
|
return total, skipped, unknown, failed, success, hung, task_timeout, retries, test_results
|
||||||
|
|
||||||
def process_result(result_path):
|
def process_result(result_path):
|
||||||
test_results = []
|
test_results = []
|
||||||
@ -73,7 +78,7 @@ def process_result(result_path):
|
|||||||
state = "error"
|
state = "error"
|
||||||
|
|
||||||
if result_path and os.path.exists(result_path):
|
if result_path and os.path.exists(result_path):
|
||||||
total, skipped, unknown, failed, success, hung, task_timeout, test_results = process_test_log(result_path)
|
total, skipped, unknown, failed, success, hung, task_timeout, retries, test_results = process_test_log(result_path)
|
||||||
is_flacky_check = 1 < int(os.environ.get('NUM_TRIES', 1))
|
is_flacky_check = 1 < int(os.environ.get('NUM_TRIES', 1))
|
||||||
# If no tests were run (success == 0) it indicates an error (e.g. server did not start or crashed immediately)
|
# If no tests were run (success == 0) it indicates an error (e.g. server did not start or crashed immediately)
|
||||||
# But it's Ok for "flaky checks" - they can contain just one test for check which is marked as skipped.
|
# But it's Ok for "flaky checks" - they can contain just one test for check which is marked as skipped.
|
||||||
@ -83,9 +88,14 @@ def process_result(result_path):
|
|||||||
if hung:
|
if hung:
|
||||||
description = "Some queries hung, "
|
description = "Some queries hung, "
|
||||||
state = "failure"
|
state = "failure"
|
||||||
|
test_results.append(("Some queries hung", "FAIL", "0"))
|
||||||
elif task_timeout:
|
elif task_timeout:
|
||||||
description = "Timeout, "
|
description = "Timeout, "
|
||||||
state = "failure"
|
state = "failure"
|
||||||
|
test_results.append(("Timeout", "FAIL", "0"))
|
||||||
|
elif retries:
|
||||||
|
description = "Some tests restarted, "
|
||||||
|
test_results.append(("Some tests restarted", "SKIPPED", "0"))
|
||||||
else:
|
else:
|
||||||
description = ""
|
description = ""
|
||||||
|
|
||||||
|
@ -103,6 +103,7 @@ timeout "$MAX_RUN_TIME" bash -c run_tests ||:
|
|||||||
|
|
||||||
clickhouse-client -q "system flush logs" ||:
|
clickhouse-client -q "system flush logs" ||:
|
||||||
|
|
||||||
|
grep -Fa "Fatal" /var/log/clickhouse-server/clickhouse-server.log ||:
|
||||||
pigz < /var/log/clickhouse-server/clickhouse-server.log > /test_output/clickhouse-server.log.gz &
|
pigz < /var/log/clickhouse-server/clickhouse-server.log > /test_output/clickhouse-server.log.gz &
|
||||||
clickhouse-client -q "select * from system.query_log format TSVWithNamesAndTypes" | pigz > /test_output/query-log.tsv.gz &
|
clickhouse-client -q "select * from system.query_log format TSVWithNamesAndTypes" | pigz > /test_output/query-log.tsv.gz &
|
||||||
clickhouse-client -q "select * from system.query_thread_log format TSVWithNamesAndTypes" | pigz > /test_output/query-thread-log.tsv.gz &
|
clickhouse-client -q "select * from system.query_thread_log format TSVWithNamesAndTypes" | pigz > /test_output/query-thread-log.tsv.gz &
|
||||||
@ -140,6 +141,8 @@ tar -chf /test_output/query_log_dump.tar /var/lib/clickhouse/data/system/query_l
|
|||||||
tar -chf /test_output/coordination.tar /var/lib/clickhouse/coordination ||:
|
tar -chf /test_output/coordination.tar /var/lib/clickhouse/coordination ||:
|
||||||
|
|
||||||
if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then
|
if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then
|
||||||
|
grep -Fa "Fatal" /var/log/clickhouse-server/clickhouse-server1.log ||:
|
||||||
|
grep -Fa "Fatal" /var/log/clickhouse-server/clickhouse-server2.log ||:
|
||||||
pigz < /var/log/clickhouse-server/clickhouse-server1.log > /test_output/clickhouse-server1.log.gz ||:
|
pigz < /var/log/clickhouse-server/clickhouse-server1.log > /test_output/clickhouse-server1.log.gz ||:
|
||||||
pigz < /var/log/clickhouse-server/clickhouse-server2.log > /test_output/clickhouse-server2.log.gz ||:
|
pigz < /var/log/clickhouse-server/clickhouse-server2.log > /test_output/clickhouse-server2.log.gz ||:
|
||||||
mv /var/log/clickhouse-server/stderr1.log /test_output/ ||:
|
mv /var/log/clickhouse-server/stderr1.log /test_output/ ||:
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <ext/scope_guard_safe.h>
|
#include <common/scope_guard_safe.h>
|
||||||
#include <boost/program_options.hpp>
|
#include <boost/program_options.hpp>
|
||||||
#include <boost/algorithm/string/replace.hpp>
|
#include <boost/algorithm/string/replace.hpp>
|
||||||
#include <Poco/String.h>
|
#include <Poco/String.h>
|
||||||
@ -549,65 +549,6 @@ private:
|
|||||||
|
|
||||||
/// Initialize DateLUT here to avoid counting time spent here as query execution time.
|
/// Initialize DateLUT here to avoid counting time spent here as query execution time.
|
||||||
const auto local_tz = DateLUT::instance().getTimeZone();
|
const auto local_tz = DateLUT::instance().getTimeZone();
|
||||||
if (!context->getSettingsRef().use_client_time_zone)
|
|
||||||
{
|
|
||||||
const auto & time_zone = connection->getServerTimezone(connection_parameters.timeouts);
|
|
||||||
if (!time_zone.empty())
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
DateLUT::setDefaultTimezone(time_zone);
|
|
||||||
}
|
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
std::cerr << "Warning: could not switch to server time zone: " << time_zone
|
|
||||||
<< ", reason: " << getCurrentExceptionMessage(/* with_stacktrace = */ false) << std::endl
|
|
||||||
<< "Proceeding with local time zone." << std::endl
|
|
||||||
<< std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::cerr << "Warning: could not determine server time zone. "
|
|
||||||
<< "Proceeding with local time zone." << std::endl
|
|
||||||
<< std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Strings keys;
|
|
||||||
|
|
||||||
prompt_by_server_display_name = config().getRawString("prompt_by_server_display_name.default", "{display_name} :) ");
|
|
||||||
|
|
||||||
config().keys("prompt_by_server_display_name", keys);
|
|
||||||
|
|
||||||
for (const String & key : keys)
|
|
||||||
{
|
|
||||||
if (key != "default" && server_display_name.find(key) != std::string::npos)
|
|
||||||
{
|
|
||||||
prompt_by_server_display_name = config().getRawString("prompt_by_server_display_name." + key);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Prompt may contain escape sequences including \e[ or \x1b[ sequences to set terminal color.
|
|
||||||
{
|
|
||||||
String unescaped_prompt_by_server_display_name;
|
|
||||||
ReadBufferFromString in(prompt_by_server_display_name);
|
|
||||||
readEscapedString(unescaped_prompt_by_server_display_name, in);
|
|
||||||
prompt_by_server_display_name = std::move(unescaped_prompt_by_server_display_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Prompt may contain the following substitutions in a form of {name}.
|
|
||||||
std::map<String, String> prompt_substitutions{
|
|
||||||
{"host", connection_parameters.host},
|
|
||||||
{"port", toString(connection_parameters.port)},
|
|
||||||
{"user", connection_parameters.user},
|
|
||||||
{"display_name", server_display_name},
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Quite suboptimal.
|
|
||||||
for (const auto & [key, value] : prompt_substitutions)
|
|
||||||
boost::replace_all(prompt_by_server_display_name, "{" + key + "}", value);
|
|
||||||
|
|
||||||
if (is_interactive)
|
if (is_interactive)
|
||||||
{
|
{
|
||||||
@ -805,6 +746,66 @@ private:
|
|||||||
<< std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!context->getSettingsRef().use_client_time_zone)
|
||||||
|
{
|
||||||
|
const auto & time_zone = connection->getServerTimezone(connection_parameters.timeouts);
|
||||||
|
if (!time_zone.empty())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
DateLUT::setDefaultTimezone(time_zone);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
std::cerr << "Warning: could not switch to server time zone: " << time_zone
|
||||||
|
<< ", reason: " << getCurrentExceptionMessage(/* with_stacktrace = */ false) << std::endl
|
||||||
|
<< "Proceeding with local time zone." << std::endl
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cerr << "Warning: could not determine server time zone. "
|
||||||
|
<< "Proceeding with local time zone." << std::endl
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Strings keys;
|
||||||
|
|
||||||
|
prompt_by_server_display_name = config().getRawString("prompt_by_server_display_name.default", "{display_name} :) ");
|
||||||
|
|
||||||
|
config().keys("prompt_by_server_display_name", keys);
|
||||||
|
|
||||||
|
for (const String & key : keys)
|
||||||
|
{
|
||||||
|
if (key != "default" && server_display_name.find(key) != std::string::npos)
|
||||||
|
{
|
||||||
|
prompt_by_server_display_name = config().getRawString("prompt_by_server_display_name." + key);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Prompt may contain escape sequences including \e[ or \x1b[ sequences to set terminal color.
|
||||||
|
{
|
||||||
|
String unescaped_prompt_by_server_display_name;
|
||||||
|
ReadBufferFromString in(prompt_by_server_display_name);
|
||||||
|
readEscapedString(unescaped_prompt_by_server_display_name, in);
|
||||||
|
prompt_by_server_display_name = std::move(unescaped_prompt_by_server_display_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Prompt may contain the following substitutions in a form of {name}.
|
||||||
|
std::map<String, String> prompt_substitutions{
|
||||||
|
{"host", connection_parameters.host},
|
||||||
|
{"port", toString(connection_parameters.port)},
|
||||||
|
{"user", connection_parameters.user},
|
||||||
|
{"display_name", server_display_name},
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Quite suboptimal.
|
||||||
|
for (const auto & [key, value] : prompt_substitutions)
|
||||||
|
boost::replace_all(prompt_by_server_display_name, "{" + key + "}", value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1202,7 +1203,9 @@ private:
|
|||||||
client_exception.reset();
|
client_exception.reset();
|
||||||
server_exception.reset();
|
server_exception.reset();
|
||||||
have_error = false;
|
have_error = false;
|
||||||
connection->forceConnected(connection_parameters.timeouts);
|
|
||||||
|
if (!connection->checkConnected())
|
||||||
|
connect();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Report error.
|
// Report error.
|
||||||
@ -1603,7 +1606,8 @@ private:
|
|||||||
if (with_output && with_output->settings_ast)
|
if (with_output && with_output->settings_ast)
|
||||||
apply_query_settings(*with_output->settings_ast);
|
apply_query_settings(*with_output->settings_ast);
|
||||||
|
|
||||||
connection->forceConnected(connection_parameters.timeouts);
|
if (!connection->checkConnected())
|
||||||
|
connect();
|
||||||
|
|
||||||
ASTPtr input_function;
|
ASTPtr input_function;
|
||||||
if (insert && insert->select)
|
if (insert && insert->select)
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#include <Common/isLocalAddress.h>
|
#include <Common/isLocalAddress.h>
|
||||||
#include <Common/DNSResolver.h>
|
#include <Common/DNSResolver.h>
|
||||||
#include <common/setTerminalEcho.h>
|
#include <common/setTerminalEcho.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
|
|
||||||
#if !defined(ARCADIA_BUILD)
|
#if !defined(ARCADIA_BUILD)
|
||||||
#include <readpassphrase.h> // Y_IGNORE
|
#include <readpassphrase.h> // Y_IGNORE
|
||||||
|
@ -1746,7 +1746,7 @@ void ClusterCopier::createShardInternalTables(const ConnectionTimeouts & timeout
|
|||||||
task_shard.table_read_shard = DatabaseAndTableName(working_database_name, read_shard_prefix + task_table.table_id);
|
task_shard.table_read_shard = DatabaseAndTableName(working_database_name, read_shard_prefix + task_table.table_id);
|
||||||
task_shard.main_table_split_shard = DatabaseAndTableName(working_database_name, split_shard_prefix + task_table.table_id);
|
task_shard.main_table_split_shard = DatabaseAndTableName(working_database_name, split_shard_prefix + task_table.table_id);
|
||||||
|
|
||||||
for (const auto & piece_number : ext::range(0, task_table.number_of_splits))
|
for (const auto & piece_number : collections::range(0, task_table.number_of_splits))
|
||||||
{
|
{
|
||||||
task_shard.list_of_split_tables_on_shard[piece_number] =
|
task_shard.list_of_split_tables_on_shard[piece_number] =
|
||||||
DatabaseAndTableName(working_database_name, split_shard_prefix + task_table.table_id + "_piece_" + toString(piece_number));
|
DatabaseAndTableName(working_database_name, split_shard_prefix + task_table.table_id + "_piece_" + toString(piece_number));
|
||||||
@ -1776,7 +1776,7 @@ void ClusterCopier::createShardInternalTables(const ConnectionTimeouts & timeout
|
|||||||
dropAndCreateLocalTable(create_table_split_piece_ast);
|
dropAndCreateLocalTable(create_table_split_piece_ast);
|
||||||
|
|
||||||
/// Create auxiliary split tables for each piece
|
/// Create auxiliary split tables for each piece
|
||||||
for (const auto & piece_number : ext::range(0, task_table.number_of_splits))
|
for (const auto & piece_number : collections::range(0, task_table.number_of_splits))
|
||||||
{
|
{
|
||||||
const auto & storage_piece_split_ast = task_table.auxiliary_engine_split_asts[piece_number];
|
const auto & storage_piece_split_ast = task_table.auxiliary_engine_split_asts[piece_number];
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include <Common/TerminalSize.h>
|
#include <Common/TerminalSize.h>
|
||||||
#include <IO/ConnectionTimeoutsContext.h>
|
#include <IO/ConnectionTimeoutsContext.h>
|
||||||
#include <Formats/registerFormats.h>
|
#include <Formats/registerFormats.h>
|
||||||
#include <ext/scope_guard_safe.h>
|
#include <common/scope_guard_safe.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include <Core/Defines.h>
|
#include <Core/Defines.h>
|
||||||
|
|
||||||
#include <ext/map.h>
|
#include <common/map.h>
|
||||||
#include <boost/algorithm/string/join.hpp>
|
#include <boost/algorithm/string/join.hpp>
|
||||||
|
|
||||||
|
|
||||||
@ -305,7 +305,7 @@ inline TaskTable::TaskTable(TaskCluster & parent, const Poco::Util::AbstractConf
|
|||||||
main_engine_split_ast = createASTStorageDistributed(cluster_push_name, table_push.first, table_push.second,
|
main_engine_split_ast = createASTStorageDistributed(cluster_push_name, table_push.first, table_push.second,
|
||||||
sharding_key_ast);
|
sharding_key_ast);
|
||||||
|
|
||||||
for (const auto piece_number : ext::range(0, number_of_splits))
|
for (const auto piece_number : collections::range(0, number_of_splits))
|
||||||
{
|
{
|
||||||
auxiliary_engine_split_asts.emplace_back
|
auxiliary_engine_split_asts.emplace_back
|
||||||
(
|
(
|
||||||
|
@ -75,6 +75,9 @@ namespace ErrorCodes
|
|||||||
#define HILITE "\033[1m"
|
#define HILITE "\033[1m"
|
||||||
#define END_HILITE "\033[0m"
|
#define END_HILITE "\033[0m"
|
||||||
|
|
||||||
|
static constexpr auto CLICKHOUSE_BRIDGE_USER = "clickhouse-bridge";
|
||||||
|
static constexpr auto CLICKHOUSE_BRIDGE_GROUP = "clickhouse-bridge";
|
||||||
|
|
||||||
using namespace DB;
|
using namespace DB;
|
||||||
namespace po = boost::program_options;
|
namespace po = boost::program_options;
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
@ -150,7 +153,6 @@ int mainEntryClickHouseInstall(int argc, char ** argv)
|
|||||||
<< argv[0]
|
<< argv[0]
|
||||||
<< " install [options]\n";
|
<< " install [options]\n";
|
||||||
std::cout << desc << '\n';
|
std::cout << desc << '\n';
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
@ -324,26 +326,34 @@ int mainEntryClickHouseInstall(int argc, char ** argv)
|
|||||||
std::string user = options["user"].as<std::string>();
|
std::string user = options["user"].as<std::string>();
|
||||||
std::string group = options["group"].as<std::string>();
|
std::string group = options["group"].as<std::string>();
|
||||||
|
|
||||||
|
auto create_group = [](const String & group_name)
|
||||||
|
{
|
||||||
|
std::string command = fmt::format("groupadd -r {}", group_name);
|
||||||
|
fmt::print(" {}\n", command);
|
||||||
|
executeScript(command);
|
||||||
|
};
|
||||||
|
|
||||||
if (!group.empty())
|
if (!group.empty())
|
||||||
{
|
{
|
||||||
{
|
fmt::print("Creating clickhouse group if it does not exist.\n");
|
||||||
fmt::print("Creating clickhouse group if it does not exist.\n");
|
create_group(group);
|
||||||
std::string command = fmt::format("groupadd -r {}", group);
|
|
||||||
fmt::print(" {}\n", command);
|
|
||||||
executeScript(command);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
fmt::print("Will not create clickhouse group");
|
fmt::print("Will not create clickhouse group");
|
||||||
|
|
||||||
|
auto create_user = [](const String & user_name, const String & group_name)
|
||||||
|
{
|
||||||
|
std::string command = group_name.empty()
|
||||||
|
? fmt::format("useradd -r --shell /bin/false --home-dir /nonexistent --user-group {}", user_name)
|
||||||
|
: fmt::format("useradd -r --shell /bin/false --home-dir /nonexistent -g {} {}", group_name, user_name);
|
||||||
|
fmt::print(" {}\n", command);
|
||||||
|
executeScript(command);
|
||||||
|
};
|
||||||
|
|
||||||
if (!user.empty())
|
if (!user.empty())
|
||||||
{
|
{
|
||||||
fmt::print("Creating clickhouse user if it does not exist.\n");
|
fmt::print("Creating clickhouse user if it does not exist.\n");
|
||||||
std::string command = group.empty()
|
create_user(user, group);
|
||||||
? fmt::format("useradd -r --shell /bin/false --home-dir /nonexistent --user-group {}", user)
|
|
||||||
: fmt::format("useradd -r --shell /bin/false --home-dir /nonexistent -g {} {}", group, user);
|
|
||||||
fmt::print(" {}\n", command);
|
|
||||||
executeScript(command);
|
|
||||||
|
|
||||||
if (group.empty())
|
if (group.empty())
|
||||||
group = user;
|
group = user;
|
||||||
@ -475,12 +485,15 @@ int mainEntryClickHouseInstall(int argc, char ** argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Chmod and chown configs
|
auto change_ownership = [](const String & file_name, const String & user_name, const String & group_name)
|
||||||
{
|
{
|
||||||
std::string command = fmt::format("chown --recursive {}:{} '{}'", user, group, config_dir.string());
|
std::string command = fmt::format("chown --recursive {}:{} '{}'", user_name, group_name, file_name);
|
||||||
fmt::print(" {}\n", command);
|
fmt::print(" {}\n", command);
|
||||||
executeScript(command);
|
executeScript(command);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
/// Chmod and chown configs
|
||||||
|
change_ownership(config_dir.string(), user, group);
|
||||||
|
|
||||||
/// Symlink "preprocessed_configs" is created by the server, so "write" is needed.
|
/// Symlink "preprocessed_configs" is created by the server, so "write" is needed.
|
||||||
fs::permissions(config_dir, fs::perms::owner_all, fs::perm_options::replace);
|
fs::permissions(config_dir, fs::perms::owner_all, fs::perm_options::replace);
|
||||||
@ -558,7 +571,19 @@ int mainEntryClickHouseInstall(int argc, char ** argv)
|
|||||||
/// Data directory is not accessible to anyone except clickhouse.
|
/// Data directory is not accessible to anyone except clickhouse.
|
||||||
fs::permissions(data_path, fs::perms::owner_all, fs::perm_options::replace);
|
fs::permissions(data_path, fs::perms::owner_all, fs::perm_options::replace);
|
||||||
|
|
||||||
/// Set up password for default user.
|
fs::path odbc_bridge_path = bin_dir / "clickhouse-odbc-bridge";
|
||||||
|
fs::path library_bridge_path = bin_dir / "clickhouse-library-bridge";
|
||||||
|
|
||||||
|
if (fs::exists(odbc_bridge_path) || fs::exists(library_bridge_path))
|
||||||
|
{
|
||||||
|
create_group(CLICKHOUSE_BRIDGE_GROUP);
|
||||||
|
create_user(CLICKHOUSE_BRIDGE_USER, CLICKHOUSE_BRIDGE_GROUP);
|
||||||
|
|
||||||
|
if (fs::exists(odbc_bridge_path))
|
||||||
|
change_ownership(odbc_bridge_path, CLICKHOUSE_BRIDGE_USER, CLICKHOUSE_BRIDGE_GROUP);
|
||||||
|
if (fs::exists(library_bridge_path))
|
||||||
|
change_ownership(library_bridge_path, CLICKHOUSE_BRIDGE_USER, CLICKHOUSE_BRIDGE_GROUP);
|
||||||
|
}
|
||||||
|
|
||||||
bool stdin_is_a_tty = isatty(STDIN_FILENO);
|
bool stdin_is_a_tty = isatty(STDIN_FILENO);
|
||||||
bool stdout_is_a_tty = isatty(STDOUT_FILENO);
|
bool stdout_is_a_tty = isatty(STDOUT_FILENO);
|
||||||
@ -573,6 +598,7 @@ int mainEntryClickHouseInstall(int argc, char ** argv)
|
|||||||
/// We can ask password even if stdin is closed/redirected but /dev/tty is available.
|
/// We can ask password even if stdin is closed/redirected but /dev/tty is available.
|
||||||
bool can_ask_password = !noninteractive && stdout_is_a_tty;
|
bool can_ask_password = !noninteractive && stdout_is_a_tty;
|
||||||
|
|
||||||
|
/// Set up password for default user.
|
||||||
if (has_password_for_default_user)
|
if (has_password_for_default_user)
|
||||||
{
|
{
|
||||||
fmt::print(HILITE "Password for default user is already specified. To remind or reset, see {} and {}." END_HILITE "\n",
|
fmt::print(HILITE "Password for default user is already specified. To remind or reset, see {} and {}." END_HILITE "\n",
|
||||||
@ -819,15 +845,25 @@ namespace
|
|||||||
|
|
||||||
if (fs::exists(pid_file))
|
if (fs::exists(pid_file))
|
||||||
{
|
{
|
||||||
ReadBufferFromFile in(pid_file.string());
|
try
|
||||||
if (tryReadIntText(pid, in))
|
|
||||||
{
|
{
|
||||||
fmt::print("{} file exists and contains pid = {}.\n", pid_file.string(), pid);
|
ReadBufferFromFile in(pid_file.string());
|
||||||
|
if (tryReadIntText(pid, in))
|
||||||
|
{
|
||||||
|
fmt::print("{} file exists and contains pid = {}.\n", pid_file.string(), pid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fmt::print("{} file exists but damaged, ignoring.\n", pid_file.string());
|
||||||
|
fs::remove(pid_file);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
catch (const Exception & e)
|
||||||
{
|
{
|
||||||
fmt::print("{} file exists but damaged, ignoring.\n", pid_file.string());
|
if (e.code() != ErrorCodes::FILE_DOESNT_EXIST)
|
||||||
fs::remove(pid_file);
|
throw;
|
||||||
|
|
||||||
|
/// If file does not exist (TOCTOU) - it's ok.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include <common/defines.h>
|
#include <common/defines.h>
|
||||||
#include <common/logger_useful.h>
|
#include <common/logger_useful.h>
|
||||||
#include <common/ErrorHandlers.h>
|
#include <common/ErrorHandlers.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <Poco/Util/HelpFormatter.h>
|
#include <Poco/Util/HelpFormatter.h>
|
||||||
#include <Poco/Version.h>
|
#include <Poco/Version.h>
|
||||||
#include <Poco/Environment.h>
|
#include <Poco/Environment.h>
|
||||||
|
@ -51,7 +51,7 @@ namespace
|
|||||||
void LibraryRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response)
|
void LibraryRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response)
|
||||||
{
|
{
|
||||||
LOG_TRACE(log, "Request URI: {}", request.getURI());
|
LOG_TRACE(log, "Request URI: {}", request.getURI());
|
||||||
HTMLForm params(request);
|
HTMLForm params(getContext()->getSettingsRef(), request);
|
||||||
|
|
||||||
if (!params.has("method"))
|
if (!params.has("method"))
|
||||||
{
|
{
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
#include <Common/StringUtils/StringUtils.h>
|
#include <Common/StringUtils/StringUtils.h>
|
||||||
#include <Core/Block.h>
|
#include <Core/Block.h>
|
||||||
#include <ext/bit_cast.h>
|
#include <common/bit_cast.h>
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
|
|
||||||
#include "LibraryInterface.h"
|
#include "LibraryInterface.h"
|
||||||
|
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
#include "SharedLibraryHandler.h"
|
#include "SharedLibraryHandler.h"
|
||||||
|
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <IO/ReadHelpers.h>
|
#include <common/bit_cast.h>
|
||||||
#include <common/find_symbols.h>
|
#include <common/find_symbols.h>
|
||||||
|
#include <IO/ReadHelpers.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
@ -114,7 +115,7 @@ BlockInputStreamPtr SharedLibraryHandler::loadAll()
|
|||||||
|
|
||||||
BlockInputStreamPtr SharedLibraryHandler::loadIds(const std::vector<uint64_t> & ids)
|
BlockInputStreamPtr SharedLibraryHandler::loadIds(const std::vector<uint64_t> & ids)
|
||||||
{
|
{
|
||||||
const ClickHouseLibrary::VectorUInt64 ids_data{ext::bit_cast<decltype(ClickHouseLibrary::VectorUInt64::data)>(ids.data()), ids.size()};
|
const ClickHouseLibrary::VectorUInt64 ids_data{bit_cast<decltype(ClickHouseLibrary::VectorUInt64::data)>(ids.data()), ids.size()};
|
||||||
|
|
||||||
auto columns_holder = std::make_unique<ClickHouseLibrary::CString[]>(attributes_names.size());
|
auto columns_holder = std::make_unique<ClickHouseLibrary::CString[]>(attributes_names.size());
|
||||||
ClickHouseLibrary::CStrings columns_pass{static_cast<decltype(ClickHouseLibrary::CStrings::data)>(columns_holder.get()), attributes_names.size()};
|
ClickHouseLibrary::CStrings columns_pass{static_cast<decltype(ClickHouseLibrary::CStrings::data)>(columns_holder.get()), attributes_names.size()};
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#include <Common/IO.h>
|
#include <Common/IO.h>
|
||||||
|
|
||||||
#include <common/phdr_cache.h>
|
#include <common/phdr_cache.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
|
|
||||||
|
|
||||||
/// Universal executable for various clickhouse applications
|
/// Universal executable for various clickhouse applications
|
||||||
|
@ -27,9 +27,9 @@
|
|||||||
#include <Core/Block.h>
|
#include <Core/Block.h>
|
||||||
#include <common/StringRef.h>
|
#include <common/StringRef.h>
|
||||||
#include <common/DateLUT.h>
|
#include <common/DateLUT.h>
|
||||||
|
#include <common/bit_cast.h>
|
||||||
#include <IO/ReadBufferFromFileDescriptor.h>
|
#include <IO/ReadBufferFromFileDescriptor.h>
|
||||||
#include <IO/WriteBufferFromFileDescriptor.h>
|
#include <IO/WriteBufferFromFileDescriptor.h>
|
||||||
#include <ext/bit_cast.h>
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -254,9 +254,9 @@ Float transformFloatMantissa(Float x, UInt64 seed)
|
|||||||
using UInt = std::conditional_t<std::is_same_v<Float, Float32>, UInt32, UInt64>;
|
using UInt = std::conditional_t<std::is_same_v<Float, Float32>, UInt32, UInt64>;
|
||||||
constexpr size_t mantissa_num_bits = std::is_same_v<Float, Float32> ? 23 : 52;
|
constexpr size_t mantissa_num_bits = std::is_same_v<Float, Float32> ? 23 : 52;
|
||||||
|
|
||||||
UInt x_uint = ext::bit_cast<UInt>(x);
|
UInt x_uint = bit_cast<UInt>(x);
|
||||||
x_uint = feistelNetwork(x_uint, mantissa_num_bits, seed);
|
x_uint = feistelNetwork(x_uint, mantissa_num_bits, seed);
|
||||||
return ext::bit_cast<Float>(x_uint);
|
return bit_cast<Float>(x_uint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,8 +13,8 @@
|
|||||||
#include <Poco/Net/HTTPServerResponse.h>
|
#include <Poco/Net/HTTPServerResponse.h>
|
||||||
#include <Poco/NumberParser.h>
|
#include <Poco/NumberParser.h>
|
||||||
#include <common/logger_useful.h>
|
#include <common/logger_useful.h>
|
||||||
|
#include <common/scope_guard.h>
|
||||||
#include <Common/quoteString.h>
|
#include <Common/quoteString.h>
|
||||||
#include <ext/scope_guard.h>
|
|
||||||
#include "getIdentifierQuote.h"
|
#include "getIdentifierQuote.h"
|
||||||
#include "validateODBCConnectionString.h"
|
#include "validateODBCConnectionString.h"
|
||||||
#include "ODBCConnectionFactory.h"
|
#include "ODBCConnectionFactory.h"
|
||||||
@ -69,7 +69,7 @@ namespace
|
|||||||
|
|
||||||
void ODBCColumnsInfoHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response)
|
void ODBCColumnsInfoHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response)
|
||||||
{
|
{
|
||||||
HTMLForm params(request, request.getStream());
|
HTMLForm params(getContext()->getSettingsRef(), request, request.getStream());
|
||||||
LOG_TRACE(log, "Request URI: {}", request.getURI());
|
LOG_TRACE(log, "Request URI: {}", request.getURI());
|
||||||
|
|
||||||
auto process_error = [&response, this](const std::string & message)
|
auto process_error = [&response, this](const std::string & message)
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include <Poco/Net/HTTPServerRequest.h>
|
#include <Poco/Net/HTTPServerRequest.h>
|
||||||
#include <Poco/Net/HTTPServerResponse.h>
|
#include <Poco/Net/HTTPServerResponse.h>
|
||||||
#include <common/logger_useful.h>
|
#include <common/logger_useful.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include "getIdentifierQuote.h"
|
#include "getIdentifierQuote.h"
|
||||||
#include "validateODBCConnectionString.h"
|
#include "validateODBCConnectionString.h"
|
||||||
#include "ODBCConnectionFactory.h"
|
#include "ODBCConnectionFactory.h"
|
||||||
@ -21,7 +21,7 @@ namespace DB
|
|||||||
{
|
{
|
||||||
void IdentifierQuoteHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response)
|
void IdentifierQuoteHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response)
|
||||||
{
|
{
|
||||||
HTMLForm params(request, request.getStream());
|
HTMLForm params(getContext()->getSettingsRef(), request, request.getStream());
|
||||||
LOG_TRACE(log, "Request URI: {}", request.getURI());
|
LOG_TRACE(log, "Request URI: {}", request.getURI());
|
||||||
|
|
||||||
auto process_error = [&response, this](const std::string & message)
|
auto process_error = [&response, this](const std::string & message)
|
||||||
|
@ -50,7 +50,7 @@ void ODBCHandler::processError(HTTPServerResponse & response, const std::string
|
|||||||
|
|
||||||
void ODBCHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response)
|
void ODBCHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response)
|
||||||
{
|
{
|
||||||
HTMLForm params(request);
|
HTMLForm params(getContext()->getSettingsRef(), request);
|
||||||
LOG_TRACE(log, "Request URI: {}", request.getURI());
|
LOG_TRACE(log, "Request URI: {}", request.getURI());
|
||||||
|
|
||||||
if (mode == "read")
|
if (mode == "read")
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include <IO/ReadHelpers.h>
|
#include <IO/ReadHelpers.h>
|
||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
#include <common/logger_useful.h>
|
#include <common/logger_useful.h>
|
||||||
#include <ext/range.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
|
@ -29,7 +29,7 @@ namespace
|
|||||||
|
|
||||||
void SchemaAllowedHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response)
|
void SchemaAllowedHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response)
|
||||||
{
|
{
|
||||||
HTMLForm params(request, request.getStream());
|
HTMLForm params(getContext()->getSettingsRef(), request, request.getStream());
|
||||||
LOG_TRACE(log, "Request URI: {}", request.getURI());
|
LOG_TRACE(log, "Request URI: {}", request.getURI());
|
||||||
|
|
||||||
auto process_error = [&response, this](const std::string & message)
|
auto process_error = [&response, this](const std::string & message)
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
#include <Poco/Net/NetException.h>
|
#include <Poco/Net/NetException.h>
|
||||||
#include <Poco/Util/HelpFormatter.h>
|
#include <Poco/Util/HelpFormatter.h>
|
||||||
#include <Poco/Environment.h>
|
#include <Poco/Environment.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <common/defines.h>
|
#include <common/defines.h>
|
||||||
#include <common/logger_useful.h>
|
#include <common/logger_useful.h>
|
||||||
#include <common/phdr_cache.h>
|
#include <common/phdr_cache.h>
|
||||||
|
@ -2,9 +2,8 @@
|
|||||||
|
|
||||||
#include <Access/AccessType.h>
|
#include <Access/AccessType.h>
|
||||||
#include <common/types.h>
|
#include <common/types.h>
|
||||||
|
#include <common/range.h>
|
||||||
#include <Common/Exception.h>
|
#include <Common/Exception.h>
|
||||||
#include <ext/range.h>
|
|
||||||
#include <ext/push_back.h>
|
|
||||||
#include <boost/algorithm/string/split.hpp>
|
#include <boost/algorithm/string/split.hpp>
|
||||||
#include <boost/algorithm/string/trim.hpp>
|
#include <boost/algorithm/string/trim.hpp>
|
||||||
#include <bitset>
|
#include <bitset>
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
#include <Access/AllowedClientHosts.h>
|
#include <Access/AllowedClientHosts.h>
|
||||||
#include <Common/Exception.h>
|
#include <Common/Exception.h>
|
||||||
#include <common/SimpleCache.h>
|
#include <common/SimpleCache.h>
|
||||||
|
#include <common/logger_useful.h>
|
||||||
|
#include <common/scope_guard.h>
|
||||||
#include <Functions/likePatternToRegexp.h>
|
#include <Functions/likePatternToRegexp.h>
|
||||||
#include <Poco/Net/SocketAddress.h>
|
#include <Poco/Net/SocketAddress.h>
|
||||||
#include <Poco/RegularExpression.h>
|
#include <Poco/RegularExpression.h>
|
||||||
#include <common/logger_useful.h>
|
|
||||||
#include <ext/scope_guard.h>
|
|
||||||
#include <boost/algorithm/string/replace.hpp>
|
#include <boost/algorithm/string/replace.hpp>
|
||||||
#include <ifaddrs.h>
|
#include <ifaddrs.h>
|
||||||
#include <Common/DNSResolver.h>
|
#include <Common/DNSResolver.h>
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
#include <Access/RowPolicy.h>
|
#include <Access/RowPolicy.h>
|
||||||
#include <Interpreters/ClientInfo.h>
|
#include <Interpreters/ClientInfo.h>
|
||||||
#include <Core/UUID.h>
|
#include <Core/UUID.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <ext/shared_ptr_helper.h>
|
#include <common/shared_ptr_helper.h>
|
||||||
#include <boost/container/flat_set.hpp>
|
#include <boost/container/flat_set.hpp>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
@ -214,9 +214,9 @@ private:
|
|||||||
mutable Poco::Logger * trace_log = nullptr;
|
mutable Poco::Logger * trace_log = nullptr;
|
||||||
mutable UserPtr user;
|
mutable UserPtr user;
|
||||||
mutable String user_name;
|
mutable String user_name;
|
||||||
mutable ext::scope_guard subscription_for_user_change;
|
mutable scope_guard subscription_for_user_change;
|
||||||
mutable std::shared_ptr<const EnabledRoles> enabled_roles;
|
mutable std::shared_ptr<const EnabledRoles> enabled_roles;
|
||||||
mutable ext::scope_guard subscription_for_roles_changes;
|
mutable scope_guard subscription_for_roles_changes;
|
||||||
mutable std::shared_ptr<const EnabledRolesInfo> roles_info;
|
mutable std::shared_ptr<const EnabledRolesInfo> roles_info;
|
||||||
mutable std::shared_ptr<const AccessRights> access;
|
mutable std::shared_ptr<const AccessRights> access;
|
||||||
mutable std::shared_ptr<const AccessRights> access_with_implicit;
|
mutable std::shared_ptr<const AccessRights> access_with_implicit;
|
||||||
|
@ -374,7 +374,7 @@ bool DiskAccessStorage::isPathEqual(const String & directory_path_) const
|
|||||||
void DiskAccessStorage::clear()
|
void DiskAccessStorage::clear()
|
||||||
{
|
{
|
||||||
entries_by_id.clear();
|
entries_by_id.clear();
|
||||||
for (auto type : ext::range(EntityType::MAX))
|
for (auto type : collections::range(EntityType::MAX))
|
||||||
entries_by_name_and_type[static_cast<size_t>(type)].clear();
|
entries_by_name_and_type[static_cast<size_t>(type)].clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -384,7 +384,7 @@ bool DiskAccessStorage::readLists()
|
|||||||
clear();
|
clear();
|
||||||
|
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
for (auto type : ext::range(EntityType::MAX))
|
for (auto type : collections::range(EntityType::MAX))
|
||||||
{
|
{
|
||||||
auto & entries_by_name = entries_by_name_and_type[static_cast<size_t>(type)];
|
auto & entries_by_name = entries_by_name_and_type[static_cast<size_t>(type)];
|
||||||
auto file_path = getListFilePath(directory_path, type);
|
auto file_path = getListFilePath(directory_path, type);
|
||||||
@ -543,7 +543,7 @@ bool DiskAccessStorage::rebuildLists()
|
|||||||
entries_by_name[entry.name] = &entry;
|
entries_by_name[entry.name] = &entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto type : ext::range(EntityType::MAX))
|
for (auto type : collections::range(EntityType::MAX))
|
||||||
types_of_lists_to_write.insert(type);
|
types_of_lists_to_write.insert(type);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -786,7 +786,7 @@ void DiskAccessStorage::prepareNotifications(const UUID & id, const Entry & entr
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ext::scope_guard DiskAccessStorage::subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const
|
scope_guard DiskAccessStorage::subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const
|
||||||
{
|
{
|
||||||
std::lock_guard lock{mutex};
|
std::lock_guard lock{mutex};
|
||||||
auto it = entries_by_id.find(id);
|
auto it = entries_by_id.find(id);
|
||||||
@ -807,7 +807,7 @@ ext::scope_guard DiskAccessStorage::subscribeForChangesImpl(const UUID & id, con
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
ext::scope_guard DiskAccessStorage::subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const
|
scope_guard DiskAccessStorage::subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const
|
||||||
{
|
{
|
||||||
std::lock_guard lock{mutex};
|
std::lock_guard lock{mutex};
|
||||||
auto & handlers = handlers_by_type[static_cast<size_t>(type)];
|
auto & handlers = handlers_by_type[static_cast<size_t>(type)];
|
||||||
|
@ -36,8 +36,8 @@ private:
|
|||||||
UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) override;
|
UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) override;
|
||||||
void removeImpl(const UUID & id) override;
|
void removeImpl(const UUID & id) override;
|
||||||
void updateImpl(const UUID & id, const UpdateFunc & update_func) override;
|
void updateImpl(const UUID & id, const UpdateFunc & update_func) override;
|
||||||
ext::scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const override;
|
scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const override;
|
||||||
ext::scope_guard subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const override;
|
scope_guard subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const override;
|
||||||
bool hasSubscriptionImpl(const UUID & id) const override;
|
bool hasSubscriptionImpl(const UUID & id) const override;
|
||||||
bool hasSubscriptionImpl(EntityType type) const override;
|
bool hasSubscriptionImpl(EntityType type) const override;
|
||||||
|
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
#include <Access/QuotaUsage.h>
|
#include <Access/QuotaUsage.h>
|
||||||
#include <Common/Exception.h>
|
#include <Common/Exception.h>
|
||||||
#include <Common/quoteString.h>
|
#include <Common/quoteString.h>
|
||||||
#include <ext/chrono_io.h>
|
#include <common/chrono_io.h>
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
#include <boost/smart_ptr/make_shared.hpp>
|
#include <boost/smart_ptr/make_shared.hpp>
|
||||||
#include <boost/range/algorithm/fill.hpp>
|
#include <boost/range/algorithm/fill.hpp>
|
||||||
|
|
||||||
@ -28,9 +28,9 @@ struct EnabledQuota::Impl
|
|||||||
{
|
{
|
||||||
const auto & type_info = Quota::ResourceTypeInfo::get(resource_type);
|
const auto & type_info = Quota::ResourceTypeInfo::get(resource_type);
|
||||||
throw Exception(
|
throw Exception(
|
||||||
"Quota for user " + backQuote(user_name) + " for " + ext::to_string(duration) + " has been exceeded: "
|
"Quota for user " + backQuote(user_name) + " for " + to_string(duration) + " has been exceeded: "
|
||||||
+ type_info.outputWithAmount(used) + "/" + type_info.amountToString(max) + ". "
|
+ type_info.outputWithAmount(used) + "/" + type_info.amountToString(max) + ". "
|
||||||
+ "Interval will end at " + ext::to_string(end_of_interval) + ". " + "Name of quota template: " + backQuote(quota_name),
|
+ "Interval will end at " + to_string(end_of_interval) + ". " + "Name of quota template: " + backQuote(quota_name),
|
||||||
ErrorCodes::QUOTA_EXPIRED);
|
ErrorCodes::QUOTA_EXPIRED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +137,7 @@ struct EnabledQuota::Impl
|
|||||||
const Intervals & intervals,
|
const Intervals & intervals,
|
||||||
std::chrono::system_clock::time_point current_time)
|
std::chrono::system_clock::time_point current_time)
|
||||||
{
|
{
|
||||||
for (auto resource_type : ext::range(Quota::MAX_RESOURCE_TYPE))
|
for (auto resource_type : collections::range(Quota::MAX_RESOURCE_TYPE))
|
||||||
checkExceeded(user_name, intervals, resource_type, current_time);
|
checkExceeded(user_name, intervals, resource_type, current_time);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -145,7 +145,7 @@ struct EnabledQuota::Impl
|
|||||||
|
|
||||||
EnabledQuota::Interval::Interval()
|
EnabledQuota::Interval::Interval()
|
||||||
{
|
{
|
||||||
for (auto resource_type : ext::range(MAX_RESOURCE_TYPE))
|
for (auto resource_type : collections::range(MAX_RESOURCE_TYPE))
|
||||||
{
|
{
|
||||||
used[resource_type].store(0);
|
used[resource_type].store(0);
|
||||||
max[resource_type] = 0;
|
max[resource_type] = 0;
|
||||||
@ -161,7 +161,7 @@ EnabledQuota::Interval & EnabledQuota::Interval::operator =(const Interval & src
|
|||||||
randomize_interval = src.randomize_interval;
|
randomize_interval = src.randomize_interval;
|
||||||
duration = src.duration;
|
duration = src.duration;
|
||||||
end_of_interval.store(src.end_of_interval.load());
|
end_of_interval.store(src.end_of_interval.load());
|
||||||
for (auto resource_type : ext::range(MAX_RESOURCE_TYPE))
|
for (auto resource_type : collections::range(MAX_RESOURCE_TYPE))
|
||||||
{
|
{
|
||||||
max[resource_type] = src.max[resource_type];
|
max[resource_type] = src.max[resource_type];
|
||||||
used[resource_type].store(src.used[resource_type].load());
|
used[resource_type].store(src.used[resource_type].load());
|
||||||
@ -187,7 +187,7 @@ std::optional<QuotaUsage> EnabledQuota::Intervals::getUsage(std::chrono::system_
|
|||||||
out.randomize_interval = in.randomize_interval;
|
out.randomize_interval = in.randomize_interval;
|
||||||
bool counters_were_reset = false;
|
bool counters_were_reset = false;
|
||||||
out.end_of_interval = Impl::getEndOfInterval(in, current_time, counters_were_reset);
|
out.end_of_interval = Impl::getEndOfInterval(in, current_time, counters_were_reset);
|
||||||
for (auto resource_type : ext::range(MAX_RESOURCE_TYPE))
|
for (auto resource_type : collections::range(MAX_RESOURCE_TYPE))
|
||||||
{
|
{
|
||||||
if (in.max[resource_type])
|
if (in.max[resource_type])
|
||||||
out.max[resource_type] = in.max[resource_type];
|
out.max[resource_type] = in.max[resource_type];
|
||||||
|
@ -20,7 +20,7 @@ std::shared_ptr<const EnabledRolesInfo> EnabledRoles::getRolesInfo() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ext::scope_guard EnabledRoles::subscribeForChanges(const OnChangeHandler & handler) const
|
scope_guard EnabledRoles::subscribeForChanges(const OnChangeHandler & handler) const
|
||||||
{
|
{
|
||||||
std::lock_guard lock{mutex};
|
std::lock_guard lock{mutex};
|
||||||
handlers.push_back(handler);
|
handlers.push_back(handler);
|
||||||
@ -34,7 +34,7 @@ ext::scope_guard EnabledRoles::subscribeForChanges(const OnChangeHandler & handl
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EnabledRoles::setRolesInfo(const std::shared_ptr<const EnabledRolesInfo> & info_, ext::scope_guard & notifications)
|
void EnabledRoles::setRolesInfo(const std::shared_ptr<const EnabledRolesInfo> & info_, scope_guard & notifications)
|
||||||
{
|
{
|
||||||
std::lock_guard lock{mutex};
|
std::lock_guard lock{mutex};
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ void EnabledRoles::setRolesInfo(const std::shared_ptr<const EnabledRolesInfo> &
|
|||||||
std::vector<OnChangeHandler> handlers_to_notify;
|
std::vector<OnChangeHandler> handlers_to_notify;
|
||||||
boost::range::copy(handlers, std::back_inserter(handlers_to_notify));
|
boost::range::copy(handlers, std::back_inserter(handlers_to_notify));
|
||||||
|
|
||||||
notifications.join(ext::scope_guard([info = info, handlers_to_notify = std::move(handlers_to_notify)]
|
notifications.join(scope_guard([info = info, handlers_to_notify = std::move(handlers_to_notify)]
|
||||||
{
|
{
|
||||||
for (const auto & handler : handlers_to_notify)
|
for (const auto & handler : handlers_to_notify)
|
||||||
handler(info);
|
handler(info);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Core/UUID.h>
|
#include <Core/UUID.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <boost/container/flat_set.hpp>
|
#include <boost/container/flat_set.hpp>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
@ -37,13 +37,13 @@ public:
|
|||||||
using OnChangeHandler = std::function<void(const std::shared_ptr<const EnabledRolesInfo> & info)>;
|
using OnChangeHandler = std::function<void(const std::shared_ptr<const EnabledRolesInfo> & info)>;
|
||||||
|
|
||||||
/// Called when either the specified roles or the roles granted to the specified roles are changed.
|
/// Called when either the specified roles or the roles granted to the specified roles are changed.
|
||||||
ext::scope_guard subscribeForChanges(const OnChangeHandler & handler) const;
|
scope_guard subscribeForChanges(const OnChangeHandler & handler) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class RoleCache;
|
friend class RoleCache;
|
||||||
EnabledRoles(const Params & params_);
|
EnabledRoles(const Params & params_);
|
||||||
|
|
||||||
void setRolesInfo(const std::shared_ptr<const EnabledRolesInfo> & info_, ext::scope_guard & notifications);
|
void setRolesInfo(const std::shared_ptr<const EnabledRolesInfo> & info_, scope_guard & notifications);
|
||||||
|
|
||||||
const Params params;
|
const Params params;
|
||||||
mutable std::shared_ptr<const EnabledRolesInfo> info;
|
mutable std::shared_ptr<const EnabledRolesInfo> info;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#include <Access/GSSAcceptor.h>
|
#include <Access/GSSAcceptor.h>
|
||||||
#include <Common/Exception.h>
|
#include <Common/Exception.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
|
|
||||||
#include <Poco/StringTokenizer.h>
|
#include <Poco/StringTokenizer.h>
|
||||||
|
|
||||||
|
@ -377,21 +377,21 @@ std::vector<UUID> IAccessStorage::tryUpdate(const std::vector<UUID> & ids, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ext::scope_guard IAccessStorage::subscribeForChanges(EntityType type, const OnChangedHandler & handler) const
|
scope_guard IAccessStorage::subscribeForChanges(EntityType type, const OnChangedHandler & handler) const
|
||||||
{
|
{
|
||||||
return subscribeForChangesImpl(type, handler);
|
return subscribeForChangesImpl(type, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ext::scope_guard IAccessStorage::subscribeForChanges(const UUID & id, const OnChangedHandler & handler) const
|
scope_guard IAccessStorage::subscribeForChanges(const UUID & id, const OnChangedHandler & handler) const
|
||||||
{
|
{
|
||||||
return subscribeForChangesImpl(id, handler);
|
return subscribeForChangesImpl(id, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ext::scope_guard IAccessStorage::subscribeForChanges(const std::vector<UUID> & ids, const OnChangedHandler & handler) const
|
scope_guard IAccessStorage::subscribeForChanges(const std::vector<UUID> & ids, const OnChangedHandler & handler) const
|
||||||
{
|
{
|
||||||
ext::scope_guard subscriptions;
|
scope_guard subscriptions;
|
||||||
for (const auto & id : ids)
|
for (const auto & id : ids)
|
||||||
subscriptions.join(subscribeForChangesImpl(id, handler));
|
subscriptions.join(subscribeForChangesImpl(id, handler));
|
||||||
return subscriptions;
|
return subscriptions;
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include <Access/IAccessEntity.h>
|
#include <Access/IAccessEntity.h>
|
||||||
#include <Core/Types.h>
|
#include <Core/Types.h>
|
||||||
#include <Core/UUID.h>
|
#include <Core/UUID.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -130,15 +130,15 @@ public:
|
|||||||
|
|
||||||
/// Subscribes for all changes.
|
/// Subscribes for all changes.
|
||||||
/// Can return nullptr if cannot subscribe (identifier not found) or if it doesn't make sense (the storage is read-only).
|
/// Can return nullptr if cannot subscribe (identifier not found) or if it doesn't make sense (the storage is read-only).
|
||||||
ext::scope_guard subscribeForChanges(EntityType type, const OnChangedHandler & handler) const;
|
scope_guard subscribeForChanges(EntityType type, const OnChangedHandler & handler) const;
|
||||||
|
|
||||||
template <typename EntityClassT>
|
template <typename EntityClassT>
|
||||||
ext::scope_guard subscribeForChanges(OnChangedHandler handler) const { return subscribeForChanges(EntityClassT::TYPE, handler); }
|
scope_guard subscribeForChanges(OnChangedHandler handler) const { return subscribeForChanges(EntityClassT::TYPE, handler); }
|
||||||
|
|
||||||
/// Subscribes for changes of a specific entry.
|
/// Subscribes for changes of a specific entry.
|
||||||
/// Can return nullptr if cannot subscribe (identifier not found) or if it doesn't make sense (the storage is read-only).
|
/// Can return nullptr if cannot subscribe (identifier not found) or if it doesn't make sense (the storage is read-only).
|
||||||
ext::scope_guard subscribeForChanges(const UUID & id, const OnChangedHandler & handler) const;
|
scope_guard subscribeForChanges(const UUID & id, const OnChangedHandler & handler) const;
|
||||||
ext::scope_guard subscribeForChanges(const std::vector<UUID> & ids, const OnChangedHandler & handler) const;
|
scope_guard subscribeForChanges(const std::vector<UUID> & ids, const OnChangedHandler & handler) const;
|
||||||
|
|
||||||
bool hasSubscription(EntityType type) const;
|
bool hasSubscription(EntityType type) const;
|
||||||
bool hasSubscription(const UUID & id) const;
|
bool hasSubscription(const UUID & id) const;
|
||||||
@ -161,8 +161,8 @@ protected:
|
|||||||
virtual UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) = 0;
|
virtual UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) = 0;
|
||||||
virtual void removeImpl(const UUID & id) = 0;
|
virtual void removeImpl(const UUID & id) = 0;
|
||||||
virtual void updateImpl(const UUID & id, const UpdateFunc & update_func) = 0;
|
virtual void updateImpl(const UUID & id, const UpdateFunc & update_func) = 0;
|
||||||
virtual ext::scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const = 0;
|
virtual scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const = 0;
|
||||||
virtual ext::scope_guard subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const = 0;
|
virtual scope_guard subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const = 0;
|
||||||
virtual bool hasSubscriptionImpl(const UUID & id) const = 0;
|
virtual bool hasSubscriptionImpl(const UUID & id) const = 0;
|
||||||
virtual bool hasSubscriptionImpl(EntityType type) const = 0;
|
virtual bool hasSubscriptionImpl(EntityType type) const = 0;
|
||||||
virtual UUID loginImpl(const Credentials & credentials, const Poco::Net::IPAddress & address, const ExternalAuthenticators & external_authenticators) const;
|
virtual UUID loginImpl(const Credentials & credentials, const Poco::Net::IPAddress & address, const ExternalAuthenticators & external_authenticators) const;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <Access/LDAPClient.h>
|
#include <Access/LDAPClient.h>
|
||||||
#include <Common/Exception.h>
|
#include <Common/Exception.h>
|
||||||
#include <common/logger_useful.h>
|
#include <common/logger_useful.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <Poco/Util/AbstractConfiguration.h>
|
#include <Poco/Util/AbstractConfiguration.h>
|
||||||
#include <Poco/JSON/JSON.h>
|
#include <Poco/JSON/JSON.h>
|
||||||
#include <Poco/JSON/Object.h>
|
#include <Poco/JSON/Object.h>
|
||||||
@ -475,14 +475,14 @@ void LDAPAccessStorage::updateImpl(const UUID & id, const UpdateFunc &)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ext::scope_guard LDAPAccessStorage::subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const
|
scope_guard LDAPAccessStorage::subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const
|
||||||
{
|
{
|
||||||
std::scoped_lock lock(mutex);
|
std::scoped_lock lock(mutex);
|
||||||
return memory_storage.subscribeForChanges(id, handler);
|
return memory_storage.subscribeForChanges(id, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ext::scope_guard LDAPAccessStorage::subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const
|
scope_guard LDAPAccessStorage::subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const
|
||||||
{
|
{
|
||||||
std::scoped_lock lock(mutex);
|
std::scoped_lock lock(mutex);
|
||||||
return memory_storage.subscribeForChanges(type, handler);
|
return memory_storage.subscribeForChanges(type, handler);
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include <Access/LDAPClient.h>
|
#include <Access/LDAPClient.h>
|
||||||
#include <Access/Credentials.h>
|
#include <Access/Credentials.h>
|
||||||
#include <common/types.h>
|
#include <common/types.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <set>
|
#include <set>
|
||||||
@ -51,8 +51,8 @@ private: // IAccessStorage implementations.
|
|||||||
virtual UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) override;
|
virtual UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) override;
|
||||||
virtual void removeImpl(const UUID & id) override;
|
virtual void removeImpl(const UUID & id) override;
|
||||||
virtual void updateImpl(const UUID & id, const UpdateFunc & update_func) override;
|
virtual void updateImpl(const UUID & id, const UpdateFunc & update_func) override;
|
||||||
virtual ext::scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const override;
|
virtual scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const override;
|
||||||
virtual ext::scope_guard subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const override;
|
virtual scope_guard subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const override;
|
||||||
virtual bool hasSubscriptionImpl(const UUID & id) const override;
|
virtual bool hasSubscriptionImpl(const UUID & id) const override;
|
||||||
virtual bool hasSubscriptionImpl(EntityType type) const override;
|
virtual bool hasSubscriptionImpl(EntityType type) const override;
|
||||||
virtual UUID loginImpl(const Credentials & credentials, const Poco::Net::IPAddress & address, const ExternalAuthenticators & external_authenticators) const override;
|
virtual UUID loginImpl(const Credentials & credentials, const Poco::Net::IPAddress & address, const ExternalAuthenticators & external_authenticators) const override;
|
||||||
@ -80,7 +80,7 @@ private:
|
|||||||
mutable std::map<String, std::set<String>> roles_per_users; // user name -> role names (...that should be granted to it; may but don't have to include common roles)
|
mutable std::map<String, std::set<String>> roles_per_users; // user name -> role names (...that should be granted to it; may but don't have to include common roles)
|
||||||
mutable std::map<UUID, String> granted_role_names; // (currently granted) role id -> its name
|
mutable std::map<UUID, String> granted_role_names; // (currently granted) role id -> its name
|
||||||
mutable std::map<String, UUID> granted_role_ids; // (currently granted) role name -> its id
|
mutable std::map<String, UUID> granted_role_ids; // (currently granted) role name -> its id
|
||||||
ext::scope_guard role_change_subscription;
|
scope_guard role_change_subscription;
|
||||||
mutable MemoryAccessStorage memory_storage;
|
mutable MemoryAccessStorage memory_storage;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#include <Access/LDAPClient.h>
|
#include <Access/LDAPClient.h>
|
||||||
#include <Common/Exception.h>
|
#include <Common/Exception.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <common/logger_useful.h>
|
#include <common/logger_useful.h>
|
||||||
|
|
||||||
#include <Poco/Logger.h>
|
#include <Poco/Logger.h>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#include <Access/MemoryAccessStorage.h>
|
#include <Access/MemoryAccessStorage.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <boost/container/flat_set.hpp>
|
#include <boost/container/flat_set.hpp>
|
||||||
#include <boost/range/adaptor/map.hpp>
|
#include <boost/range/adaptor/map.hpp>
|
||||||
#include <boost/range/algorithm/copy.hpp>
|
#include <boost/range/algorithm/copy.hpp>
|
||||||
@ -266,7 +266,7 @@ void MemoryAccessStorage::prepareNotifications(const Entry & entry, bool remove,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ext::scope_guard MemoryAccessStorage::subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const
|
scope_guard MemoryAccessStorage::subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const
|
||||||
{
|
{
|
||||||
std::lock_guard lock{mutex};
|
std::lock_guard lock{mutex};
|
||||||
auto & handlers = handlers_by_type[static_cast<size_t>(type)];
|
auto & handlers = handlers_by_type[static_cast<size_t>(type)];
|
||||||
@ -282,7 +282,7 @@ ext::scope_guard MemoryAccessStorage::subscribeForChangesImpl(EntityType type, c
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ext::scope_guard MemoryAccessStorage::subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const
|
scope_guard MemoryAccessStorage::subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const
|
||||||
{
|
{
|
||||||
std::lock_guard lock{mutex};
|
std::lock_guard lock{mutex};
|
||||||
auto it = entries_by_id.find(id);
|
auto it = entries_by_id.find(id);
|
||||||
|
@ -33,8 +33,8 @@ private:
|
|||||||
UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) override;
|
UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) override;
|
||||||
void removeImpl(const UUID & id) override;
|
void removeImpl(const UUID & id) override;
|
||||||
void updateImpl(const UUID & id, const UpdateFunc & update_func) override;
|
void updateImpl(const UUID & id, const UpdateFunc & update_func) override;
|
||||||
ext::scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const override;
|
scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const override;
|
||||||
ext::scope_guard subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const override;
|
scope_guard subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const override;
|
||||||
bool hasSubscriptionImpl(const UUID & id) const override;
|
bool hasSubscriptionImpl(const UUID & id) const override;
|
||||||
bool hasSubscriptionImpl(EntityType type) const override;
|
bool hasSubscriptionImpl(EntityType type) const override;
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include <Access/MultipleAccessStorage.h>
|
#include <Access/MultipleAccessStorage.h>
|
||||||
#include <Access/Credentials.h>
|
#include <Access/Credentials.h>
|
||||||
#include <Common/Exception.h>
|
#include <Common/Exception.h>
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
#include <boost/range/adaptor/map.hpp>
|
#include <boost/range/adaptor/map.hpp>
|
||||||
#include <boost/range/adaptor/reversed.hpp>
|
#include <boost/range/adaptor/reversed.hpp>
|
||||||
#include <boost/range/algorithm/copy.hpp>
|
#include <boost/range/algorithm/copy.hpp>
|
||||||
@ -265,7 +265,7 @@ void MultipleAccessStorage::updateImpl(const UUID & id, const UpdateFunc & updat
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ext::scope_guard MultipleAccessStorage::subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const
|
scope_guard MultipleAccessStorage::subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const
|
||||||
{
|
{
|
||||||
auto storage = findStorage(id);
|
auto storage = findStorage(id);
|
||||||
if (!storage)
|
if (!storage)
|
||||||
@ -286,7 +286,7 @@ bool MultipleAccessStorage::hasSubscriptionImpl(const UUID & id) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ext::scope_guard MultipleAccessStorage::subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const
|
scope_guard MultipleAccessStorage::subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const
|
||||||
{
|
{
|
||||||
std::unique_lock lock{mutex};
|
std::unique_lock lock{mutex};
|
||||||
auto & handlers = handlers_by_type[static_cast<size_t>(type)];
|
auto & handlers = handlers_by_type[static_cast<size_t>(type)];
|
||||||
@ -321,10 +321,10 @@ void MultipleAccessStorage::updateSubscriptionsToNestedStorages(std::unique_lock
|
|||||||
{
|
{
|
||||||
/// lock is already locked.
|
/// lock is already locked.
|
||||||
|
|
||||||
std::vector<std::pair<StoragePtr, ext::scope_guard>> added_subscriptions[static_cast<size_t>(EntityType::MAX)];
|
std::vector<std::pair<StoragePtr, scope_guard>> added_subscriptions[static_cast<size_t>(EntityType::MAX)];
|
||||||
std::vector<ext::scope_guard> removed_subscriptions;
|
std::vector<scope_guard> removed_subscriptions;
|
||||||
|
|
||||||
for (auto type : ext::range(EntityType::MAX))
|
for (auto type : collections::range(EntityType::MAX))
|
||||||
{
|
{
|
||||||
auto & handlers = handlers_by_type[static_cast<size_t>(type)];
|
auto & handlers = handlers_by_type[static_cast<size_t>(type)];
|
||||||
auto & subscriptions = subscriptions_to_nested_storages[static_cast<size_t>(type)];
|
auto & subscriptions = subscriptions_to_nested_storages[static_cast<size_t>(type)];
|
||||||
@ -364,7 +364,7 @@ void MultipleAccessStorage::updateSubscriptionsToNestedStorages(std::unique_lock
|
|||||||
lock.unlock();
|
lock.unlock();
|
||||||
removed_subscriptions.clear();
|
removed_subscriptions.clear();
|
||||||
|
|
||||||
for (auto type : ext::range(EntityType::MAX))
|
for (auto type : collections::range(EntityType::MAX))
|
||||||
{
|
{
|
||||||
if (!added_subscriptions[static_cast<size_t>(type)].empty())
|
if (!added_subscriptions[static_cast<size_t>(type)].empty())
|
||||||
{
|
{
|
||||||
@ -384,7 +384,7 @@ void MultipleAccessStorage::updateSubscriptionsToNestedStorages(std::unique_lock
|
|||||||
/// Lock the mutex again to store added subscriptions to the nested storages.
|
/// Lock the mutex again to store added subscriptions to the nested storages.
|
||||||
lock.lock();
|
lock.lock();
|
||||||
|
|
||||||
for (auto type : ext::range(EntityType::MAX))
|
for (auto type : collections::range(EntityType::MAX))
|
||||||
{
|
{
|
||||||
if (!added_subscriptions[static_cast<size_t>(type)].empty())
|
if (!added_subscriptions[static_cast<size_t>(type)].empty())
|
||||||
{
|
{
|
||||||
|
@ -44,8 +44,8 @@ protected:
|
|||||||
UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) override;
|
UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) override;
|
||||||
void removeImpl(const UUID & id) override;
|
void removeImpl(const UUID & id) override;
|
||||||
void updateImpl(const UUID & id, const UpdateFunc & update_func) override;
|
void updateImpl(const UUID & id, const UpdateFunc & update_func) override;
|
||||||
ext::scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const override;
|
scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const override;
|
||||||
ext::scope_guard subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const override;
|
scope_guard subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const override;
|
||||||
bool hasSubscriptionImpl(const UUID & id) const override;
|
bool hasSubscriptionImpl(const UUID & id) const override;
|
||||||
bool hasSubscriptionImpl(EntityType type) const override;
|
bool hasSubscriptionImpl(EntityType type) const override;
|
||||||
UUID loginImpl(const Credentials & credentials, const Poco::Net::IPAddress & address, const ExternalAuthenticators & external_authenticators) const override;
|
UUID loginImpl(const Credentials & credentials, const Poco::Net::IPAddress & address, const ExternalAuthenticators & external_authenticators) const override;
|
||||||
@ -59,7 +59,7 @@ private:
|
|||||||
std::shared_ptr<const Storages> nested_storages;
|
std::shared_ptr<const Storages> nested_storages;
|
||||||
mutable LRUCache<UUID, Storage> ids_cache;
|
mutable LRUCache<UUID, Storage> ids_cache;
|
||||||
mutable std::list<OnChangedHandler> handlers_by_type[static_cast<size_t>(EntityType::MAX)];
|
mutable std::list<OnChangedHandler> handlers_by_type[static_cast<size_t>(EntityType::MAX)];
|
||||||
mutable std::unordered_map<StoragePtr, ext::scope_guard> subscriptions_to_nested_storages[static_cast<size_t>(EntityType::MAX)];
|
mutable std::unordered_map<StoragePtr, scope_guard> subscriptions_to_nested_storages[static_cast<size_t>(EntityType::MAX)];
|
||||||
mutable std::mutex mutex;
|
mutable std::mutex mutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include <Access/IAccessEntity.h>
|
#include <Access/IAccessEntity.h>
|
||||||
#include <Access/RolesOrUsersSet.h>
|
#include <Access/RolesOrUsersSet.h>
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
#include <boost/algorithm/string/split.hpp>
|
#include <boost/algorithm/string/split.hpp>
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -219,7 +219,7 @@ inline const Quota::KeyTypeInfo & Quota::KeyTypeInfo::get(KeyType type)
|
|||||||
{
|
{
|
||||||
for (const auto & token : tokens)
|
for (const auto & token : tokens)
|
||||||
{
|
{
|
||||||
for (auto kt : ext::range(KeyType::MAX))
|
for (auto kt : collections::range(KeyType::MAX))
|
||||||
{
|
{
|
||||||
if (KeyTypeInfo::get(kt).name == token)
|
if (KeyTypeInfo::get(kt).name == token)
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include <Access/AccessControlManager.h>
|
#include <Access/AccessControlManager.h>
|
||||||
#include <Common/Exception.h>
|
#include <Common/Exception.h>
|
||||||
#include <Common/thread_local_rng.h>
|
#include <Common/thread_local_rng.h>
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
#include <boost/range/adaptor/map.hpp>
|
#include <boost/range/adaptor/map.hpp>
|
||||||
#include <boost/range/algorithm/copy.hpp>
|
#include <boost/range/algorithm/copy.hpp>
|
||||||
#include <boost/range/algorithm/lower_bound.hpp>
|
#include <boost/range/algorithm/lower_bound.hpp>
|
||||||
@ -124,7 +124,7 @@ boost::shared_ptr<const EnabledQuota::Intervals> QuotaCache::QuotaInfo::rebuildI
|
|||||||
if (limits.randomize_interval)
|
if (limits.randomize_interval)
|
||||||
end_of_interval += randomDuration(limits.duration);
|
end_of_interval += randomDuration(limits.duration);
|
||||||
interval.end_of_interval = end_of_interval.time_since_epoch();
|
interval.end_of_interval = end_of_interval.time_since_epoch();
|
||||||
for (auto resource_type : ext::range(MAX_RESOURCE_TYPE))
|
for (auto resource_type : collections::range(MAX_RESOURCE_TYPE))
|
||||||
{
|
{
|
||||||
if (limits.max[resource_type])
|
if (limits.max[resource_type])
|
||||||
interval.max[resource_type] = *limits.max[resource_type];
|
interval.max[resource_type] = *limits.max[resource_type];
|
||||||
@ -159,7 +159,7 @@ boost::shared_ptr<const EnabledQuota::Intervals> QuotaCache::QuotaInfo::rebuildI
|
|||||||
|
|
||||||
/// Found an interval with the same duration, we need to copy its usage information to `result`.
|
/// Found an interval with the same duration, we need to copy its usage information to `result`.
|
||||||
const auto & current_interval = *lower_bound;
|
const auto & current_interval = *lower_bound;
|
||||||
for (auto resource_type : ext::range(MAX_RESOURCE_TYPE))
|
for (auto resource_type : collections::range(MAX_RESOURCE_TYPE))
|
||||||
{
|
{
|
||||||
new_interval.used[resource_type].store(current_interval.used[resource_type].load());
|
new_interval.used[resource_type].store(current_interval.used[resource_type].load());
|
||||||
new_interval.end_of_interval.store(current_interval.end_of_interval.load());
|
new_interval.end_of_interval.store(current_interval.end_of_interval.load());
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Access/EnabledQuota.h>
|
#include <Access/EnabledQuota.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <map>
|
#include <map>
|
||||||
@ -60,7 +60,7 @@ private:
|
|||||||
mutable std::mutex mutex;
|
mutable std::mutex mutex;
|
||||||
std::unordered_map<UUID /* quota id */, QuotaInfo> all_quotas;
|
std::unordered_map<UUID /* quota id */, QuotaInfo> all_quotas;
|
||||||
bool all_quotas_read = false;
|
bool all_quotas_read = false;
|
||||||
ext::scope_guard subscription;
|
scope_guard subscription;
|
||||||
std::map<EnabledQuota::Params, std::weak_ptr<EnabledQuota>> enabled_quotas;
|
std::map<EnabledQuota::Params, std::weak_ptr<EnabledQuota>> enabled_quotas;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ std::shared_ptr<const EnabledRoles>
|
|||||||
RoleCache::getEnabledRoles(const std::vector<UUID> & roles, const std::vector<UUID> & roles_with_admin_option)
|
RoleCache::getEnabledRoles(const std::vector<UUID> & roles, const std::vector<UUID> & roles_with_admin_option)
|
||||||
{
|
{
|
||||||
/// Declared before `lock` to send notifications after the mutex will be unlocked.
|
/// Declared before `lock` to send notifications after the mutex will be unlocked.
|
||||||
ext::scope_guard notifications;
|
scope_guard notifications;
|
||||||
|
|
||||||
std::lock_guard lock{mutex};
|
std::lock_guard lock{mutex};
|
||||||
EnabledRoles::Params params;
|
EnabledRoles::Params params;
|
||||||
@ -88,7 +88,7 @@ RoleCache::getEnabledRoles(const std::vector<UUID> & roles, const std::vector<UU
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void RoleCache::collectEnabledRoles(ext::scope_guard & notifications)
|
void RoleCache::collectEnabledRoles(scope_guard & notifications)
|
||||||
{
|
{
|
||||||
/// `mutex` is already locked.
|
/// `mutex` is already locked.
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ void RoleCache::collectEnabledRoles(ext::scope_guard & notifications)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void RoleCache::collectEnabledRoles(EnabledRoles & enabled, ext::scope_guard & notifications)
|
void RoleCache::collectEnabledRoles(EnabledRoles & enabled, scope_guard & notifications)
|
||||||
{
|
{
|
||||||
/// `mutex` is already locked.
|
/// `mutex` is already locked.
|
||||||
|
|
||||||
@ -146,8 +146,8 @@ RolePtr RoleCache::getRole(const UUID & role_id)
|
|||||||
auto role = manager.tryRead<Role>(role_id);
|
auto role = manager.tryRead<Role>(role_id);
|
||||||
if (role)
|
if (role)
|
||||||
{
|
{
|
||||||
auto cache_value = Poco::SharedPtr<std::pair<RolePtr, ext::scope_guard>>(
|
auto cache_value = Poco::SharedPtr<std::pair<RolePtr, scope_guard>>(
|
||||||
new std::pair<RolePtr, ext::scope_guard>{role, std::move(subscription)});
|
new std::pair<RolePtr, scope_guard>{role, std::move(subscription)});
|
||||||
cache.add(role_id, cache_value);
|
cache.add(role_id, cache_value);
|
||||||
return role;
|
return role;
|
||||||
}
|
}
|
||||||
@ -159,7 +159,7 @@ RolePtr RoleCache::getRole(const UUID & role_id)
|
|||||||
void RoleCache::roleChanged(const UUID & role_id, const RolePtr & changed_role)
|
void RoleCache::roleChanged(const UUID & role_id, const RolePtr & changed_role)
|
||||||
{
|
{
|
||||||
/// Declared before `lock` to send notifications after the mutex will be unlocked.
|
/// Declared before `lock` to send notifications after the mutex will be unlocked.
|
||||||
ext::scope_guard notifications;
|
scope_guard notifications;
|
||||||
|
|
||||||
std::lock_guard lock{mutex};
|
std::lock_guard lock{mutex};
|
||||||
auto role_from_cache = cache.get(role_id);
|
auto role_from_cache = cache.get(role_id);
|
||||||
@ -174,7 +174,7 @@ void RoleCache::roleChanged(const UUID & role_id, const RolePtr & changed_role)
|
|||||||
void RoleCache::roleRemoved(const UUID & role_id)
|
void RoleCache::roleRemoved(const UUID & role_id)
|
||||||
{
|
{
|
||||||
/// Declared before `lock` to send notifications after the mutex will be unlocked.
|
/// Declared before `lock` to send notifications after the mutex will be unlocked.
|
||||||
ext::scope_guard notifications;
|
scope_guard notifications;
|
||||||
|
|
||||||
std::lock_guard lock{mutex};
|
std::lock_guard lock{mutex};
|
||||||
cache.remove(role_id);
|
cache.remove(role_id);
|
||||||
|
@ -24,14 +24,14 @@ public:
|
|||||||
const std::vector<UUID> & current_roles_with_admin_option);
|
const std::vector<UUID> & current_roles_with_admin_option);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void collectEnabledRoles(ext::scope_guard & notifications);
|
void collectEnabledRoles(scope_guard & notifications);
|
||||||
void collectEnabledRoles(EnabledRoles & enabled, ext::scope_guard & notifications);
|
void collectEnabledRoles(EnabledRoles & enabled, scope_guard & notifications);
|
||||||
RolePtr getRole(const UUID & role_id);
|
RolePtr getRole(const UUID & role_id);
|
||||||
void roleChanged(const UUID & role_id, const RolePtr & changed_role);
|
void roleChanged(const UUID & role_id, const RolePtr & changed_role);
|
||||||
void roleRemoved(const UUID & role_id);
|
void roleRemoved(const UUID & role_id);
|
||||||
|
|
||||||
const AccessControlManager & manager;
|
const AccessControlManager & manager;
|
||||||
Poco::ExpireCache<UUID, std::pair<RolePtr, ext::scope_guard>> cache;
|
Poco::ExpireCache<UUID, std::pair<RolePtr, scope_guard>> cache;
|
||||||
std::map<EnabledRoles::Params, std::weak_ptr<EnabledRoles>> enabled_roles;
|
std::map<EnabledRoles::Params, std::weak_ptr<EnabledRoles>> enabled_roles;
|
||||||
mutable std::mutex mutex;
|
mutable std::mutex mutex;
|
||||||
};
|
};
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include <Parsers/makeASTForLogicalFunction.h>
|
#include <Parsers/makeASTForLogicalFunction.h>
|
||||||
#include <Common/Exception.h>
|
#include <Common/Exception.h>
|
||||||
#include <Common/quoteString.h>
|
#include <Common/quoteString.h>
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
#include <boost/smart_ptr/make_shared.hpp>
|
#include <boost/smart_ptr/make_shared.hpp>
|
||||||
#include <Core/Defines.h>
|
#include <Core/Defines.h>
|
||||||
|
|
||||||
@ -59,7 +59,7 @@ void RowPolicyCache::PolicyInfo::setPolicy(const RowPolicyPtr & policy_)
|
|||||||
roles = &policy->to_roles;
|
roles = &policy->to_roles;
|
||||||
database_and_table_name = std::make_shared<std::pair<String, String>>(policy->getDatabase(), policy->getTableName());
|
database_and_table_name = std::make_shared<std::pair<String, String>>(policy->getDatabase(), policy->getTableName());
|
||||||
|
|
||||||
for (auto type : ext::range(0, MAX_CONDITION_TYPE))
|
for (auto type : collections::range(0, MAX_CONDITION_TYPE))
|
||||||
{
|
{
|
||||||
parsed_conditions[type] = nullptr;
|
parsed_conditions[type] = nullptr;
|
||||||
const String & condition = policy->conditions[type];
|
const String & condition = policy->conditions[type];
|
||||||
@ -217,7 +217,7 @@ void RowPolicyCache::mixConditionsFor(EnabledRowPolicies & enabled)
|
|||||||
MixedConditionKey key;
|
MixedConditionKey key;
|
||||||
key.database = info.database_and_table_name->first;
|
key.database = info.database_and_table_name->first;
|
||||||
key.table_name = info.database_and_table_name->second;
|
key.table_name = info.database_and_table_name->second;
|
||||||
for (auto type : ext::range(0, MAX_CONDITION_TYPE))
|
for (auto type : collections::range(0, MAX_CONDITION_TYPE))
|
||||||
{
|
{
|
||||||
if (info.parsed_conditions[type])
|
if (info.parsed_conditions[type])
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Access/EnabledRowPolicies.h>
|
#include <Access/EnabledRowPolicies.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
@ -41,7 +41,7 @@ private:
|
|||||||
const AccessControlManager & access_control_manager;
|
const AccessControlManager & access_control_manager;
|
||||||
std::unordered_map<UUID, PolicyInfo> all_policies;
|
std::unordered_map<UUID, PolicyInfo> all_policies;
|
||||||
bool all_policies_read = false;
|
bool all_policies_read = false;
|
||||||
ext::scope_guard subscription;
|
scope_guard subscription;
|
||||||
std::map<EnabledRowPolicies::Params, std::weak_ptr<EnabledRowPolicies>> enabled_row_policies;
|
std::map<EnabledRowPolicies::Params, std::weak_ptr<EnabledRowPolicies>> enabled_row_policies;
|
||||||
std::mutex mutex;
|
std::mutex mutex;
|
||||||
};
|
};
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include <Access/EnabledSettings.h>
|
#include <Access/EnabledSettings.h>
|
||||||
#include <Core/UUID.h>
|
#include <Core/UUID.h>
|
||||||
#include <common/types.h>
|
#include <common/types.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ private:
|
|||||||
std::unordered_map<UUID, SettingsProfilePtr> all_profiles;
|
std::unordered_map<UUID, SettingsProfilePtr> all_profiles;
|
||||||
std::unordered_map<String, UUID> profiles_by_name;
|
std::unordered_map<String, UUID> profiles_by_name;
|
||||||
bool all_profiles_read = false;
|
bool all_profiles_read = false;
|
||||||
ext::scope_guard subscription;
|
scope_guard subscription;
|
||||||
std::map<EnabledSettings::Params, std::weak_ptr<EnabledSettings>> enabled_settings;
|
std::map<EnabledSettings::Params, std::weak_ptr<EnabledSettings>> enabled_settings;
|
||||||
std::optional<UUID> default_profile_id;
|
std::optional<UUID> default_profile_id;
|
||||||
std::unordered_map<UUID, std::shared_ptr<const SettingsChanges>> settings_for_profiles;
|
std::unordered_map<UUID, std::shared_ptr<const SettingsChanges>> settings_for_profiles;
|
||||||
|
@ -248,7 +248,7 @@ namespace
|
|||||||
limits.duration = duration;
|
limits.duration = duration;
|
||||||
limits.randomize_interval = config.getBool(interval_config + ".randomize", false);
|
limits.randomize_interval = config.getBool(interval_config + ".randomize", false);
|
||||||
|
|
||||||
for (auto resource_type : ext::range(Quota::MAX_RESOURCE_TYPE))
|
for (auto resource_type : collections::range(Quota::MAX_RESOURCE_TYPE))
|
||||||
{
|
{
|
||||||
const auto & type_info = Quota::ResourceTypeInfo::get(resource_type);
|
const auto & type_info = Quota::ResourceTypeInfo::get(resource_type);
|
||||||
auto value = config.getString(interval_config + "." + type_info.name, "0");
|
auto value = config.getString(interval_config + "." + type_info.name, "0");
|
||||||
@ -598,13 +598,13 @@ void UsersConfigAccessStorage::updateImpl(const UUID & id, const UpdateFunc &)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ext::scope_guard UsersConfigAccessStorage::subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const
|
scope_guard UsersConfigAccessStorage::subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const
|
||||||
{
|
{
|
||||||
return memory_storage.subscribeForChanges(id, handler);
|
return memory_storage.subscribeForChanges(id, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ext::scope_guard UsersConfigAccessStorage::subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const
|
scope_guard UsersConfigAccessStorage::subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const
|
||||||
{
|
{
|
||||||
return memory_storage.subscribeForChanges(type, handler);
|
return memory_storage.subscribeForChanges(type, handler);
|
||||||
}
|
}
|
||||||
|
@ -52,8 +52,8 @@ private:
|
|||||||
UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) override;
|
UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) override;
|
||||||
void removeImpl(const UUID & id) override;
|
void removeImpl(const UUID & id) override;
|
||||||
void updateImpl(const UUID & id, const UpdateFunc & update_func) override;
|
void updateImpl(const UUID & id, const UpdateFunc & update_func) override;
|
||||||
ext::scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const override;
|
scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const override;
|
||||||
ext::scope_guard subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const override;
|
scope_guard subscribeForChangesImpl(EntityType type, const OnChangedHandler & handler) const override;
|
||||||
bool hasSubscriptionImpl(const UUID & id) const override;
|
bool hasSubscriptionImpl(const UUID & id) const override;
|
||||||
bool hasSubscriptionImpl(EntityType type) const override;
|
bool hasSubscriptionImpl(EntityType type) const override;
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include <IO/ReadHelpers.h>
|
#include <IO/ReadHelpers.h>
|
||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
|
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
@ -71,7 +71,7 @@ public:
|
|||||||
auto y_col = static_cast<const ColumnUInt8 *>(columns[category_count]);
|
auto y_col = static_cast<const ColumnUInt8 *>(columns[category_count]);
|
||||||
bool y = y_col->getData()[row_num];
|
bool y = y_col->getData()[row_num];
|
||||||
|
|
||||||
for (size_t i : ext::range(0, category_count))
|
for (size_t i : collections::range(0, category_count))
|
||||||
{
|
{
|
||||||
auto x_col = static_cast<const ColumnUInt8 *>(columns[i]);
|
auto x_col = static_cast<const ColumnUInt8 *>(columns[i]);
|
||||||
bool x = x_col->getData()[row_num];
|
bool x = x_col->getData()[row_num];
|
||||||
@ -89,7 +89,7 @@ public:
|
|||||||
Arena *
|
Arena *
|
||||||
) const override
|
) const override
|
||||||
{
|
{
|
||||||
for (size_t i : ext::range(0, category_count + 1))
|
for (size_t i : collections::range(0, category_count + 1))
|
||||||
{
|
{
|
||||||
reinterpret_cast<T *>(place)[i * 2] += reinterpret_cast<const T *>(rhs)[i * 2];
|
reinterpret_cast<T *>(place)[i * 2] += reinterpret_cast<const T *>(rhs)[i * 2];
|
||||||
reinterpret_cast<T *>(place)[i * 2 + 1] += reinterpret_cast<const T *>(rhs)[i * 2 + 1];
|
reinterpret_cast<T *>(place)[i * 2 + 1] += reinterpret_cast<const T *>(rhs)[i * 2 + 1];
|
||||||
@ -139,7 +139,7 @@ public:
|
|||||||
Float64 rev_no = 1. / sum_no;
|
Float64 rev_no = 1. / sum_no;
|
||||||
Float64 rev_yes = 1. / sum_yes;
|
Float64 rev_yes = 1. / sum_yes;
|
||||||
|
|
||||||
for (size_t i : ext::range(0, category_count))
|
for (size_t i : collections::range(0, category_count))
|
||||||
{
|
{
|
||||||
T no = reinterpret_cast<const T *>(place)[i * 2];
|
T no = reinterpret_cast<const T *>(place)[i * 2];
|
||||||
T yes = reinterpret_cast<const T *>(place)[i * 2 + 1];
|
T yes = reinterpret_cast<const T *>(place)[i * 2 + 1];
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <DataTypes/DataTypeDate.h>
|
#include <DataTypes/DataTypeDate.h>
|
||||||
#include <DataTypes/DataTypeDateTime.h>
|
#include <DataTypes/DataTypeDateTime.h>
|
||||||
|
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
|
@ -113,8 +113,8 @@ public:
|
|||||||
|
|
||||||
if constexpr (std::is_same_v<Data, QuantileTiming<Value>>)
|
if constexpr (std::is_same_v<Data, QuantileTiming<Value>>)
|
||||||
{
|
{
|
||||||
/// QuantileTiming only supports integers.
|
/// QuantileTiming only supports unsigned integers. Too large values are also meaningless.
|
||||||
if (isNaN(value) || value > std::numeric_limits<Value>::max() || value < std::numeric_limits<Value>::min())
|
if (isNaN(value) || value > std::numeric_limits<Int64>::max() || value < 0)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
#include <IO/ReadHelpers.h>
|
#include <IO/ReadHelpers.h>
|
||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
#include <Common/ArenaAllocator.h>
|
#include <Common/ArenaAllocator.h>
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
#include <bitset>
|
#include <bitset>
|
||||||
|
|
||||||
#include <AggregateFunctions/IAggregateFunction.h>
|
#include <AggregateFunctions/IAggregateFunction.h>
|
||||||
@ -78,7 +78,7 @@ public:
|
|||||||
AggregateFunctionRetention(const DataTypes & arguments)
|
AggregateFunctionRetention(const DataTypes & arguments)
|
||||||
: IAggregateFunctionDataHelper<AggregateFunctionRetentionData, AggregateFunctionRetention>(arguments, {})
|
: IAggregateFunctionDataHelper<AggregateFunctionRetentionData, AggregateFunctionRetention>(arguments, {})
|
||||||
{
|
{
|
||||||
for (const auto i : ext::range(0, arguments.size()))
|
for (const auto i : collections::range(0, arguments.size()))
|
||||||
{
|
{
|
||||||
auto cond_arg = arguments[i].get();
|
auto cond_arg = arguments[i].get();
|
||||||
if (!isUInt8(cond_arg))
|
if (!isUInt8(cond_arg))
|
||||||
@ -100,7 +100,7 @@ public:
|
|||||||
|
|
||||||
void add(AggregateDataPtr __restrict place, const IColumn ** columns, const size_t row_num, Arena *) const override
|
void add(AggregateDataPtr __restrict place, const IColumn ** columns, const size_t row_num, Arena *) const override
|
||||||
{
|
{
|
||||||
for (const auto i : ext::range(0, events_size))
|
for (const auto i : collections::range(0, events_size))
|
||||||
{
|
{
|
||||||
auto event = assert_cast<const ColumnVector<UInt8> *>(columns[i])->getData()[row_num];
|
auto event = assert_cast<const ColumnVector<UInt8> *>(columns[i])->getData()[row_num];
|
||||||
if (event)
|
if (event)
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <DataTypes/DataTypeDate.h>
|
#include <DataTypes/DataTypeDate.h>
|
||||||
#include <DataTypes/DataTypeDateTime.h>
|
#include <DataTypes/DataTypeDateTime.h>
|
||||||
|
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
@ -43,7 +43,7 @@ AggregateFunctionPtr createAggregateFunctionSequenceBase(
|
|||||||
|
|
||||||
const auto * time_arg = argument_types.front().get();
|
const auto * time_arg = argument_types.front().get();
|
||||||
|
|
||||||
for (const auto i : ext::range(1, arg_count))
|
for (const auto i : collections::range(1, arg_count))
|
||||||
{
|
{
|
||||||
const auto * cond_arg = argument_types[i].get();
|
const auto * cond_arg = argument_types[i].get();
|
||||||
if (!isUInt8(cond_arg))
|
if (!isUInt8(cond_arg))
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <DataTypes/DataTypesNumber.h>
|
#include <DataTypes/DataTypesNumber.h>
|
||||||
#include <Columns/ColumnsNumber.h>
|
#include <Columns/ColumnsNumber.h>
|
||||||
#include <Common/assert_cast.h>
|
#include <Common/assert_cast.h>
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
#include <Common/PODArray.h>
|
#include <Common/PODArray.h>
|
||||||
#include <IO/ReadHelpers.h>
|
#include <IO/ReadHelpers.h>
|
||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
@ -155,7 +155,7 @@ public:
|
|||||||
const auto timestamp = assert_cast<const ColumnVector<T> *>(columns[0])->getData()[row_num];
|
const auto timestamp = assert_cast<const ColumnVector<T> *>(columns[0])->getData()[row_num];
|
||||||
|
|
||||||
typename Data::Events events;
|
typename Data::Events events;
|
||||||
for (const auto i : ext::range(1, arg_count))
|
for (const auto i : collections::range(1, arg_count))
|
||||||
{
|
{
|
||||||
const auto event = assert_cast<const ColumnUInt8 *>(columns[i])->getData()[row_num];
|
const auto event = assert_cast<const ColumnUInt8 *>(columns[i])->getData()[row_num];
|
||||||
events.set(i - 1, event);
|
events.set(i - 1, event);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include <DataTypes/DataTypeNullable.h>
|
#include <DataTypes/DataTypeNullable.h>
|
||||||
#include <Interpreters/Context.h>
|
#include <Interpreters/Context.h>
|
||||||
#include <Common/CurrentThread.h>
|
#include <Common/CurrentThread.h>
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
@ -98,7 +98,7 @@ createAggregateFunctionSequenceNode(const std::string & name, const DataTypes &
|
|||||||
throw Exception("Illegal type " + cond_arg->getName() + " of third argument of aggregate function "
|
throw Exception("Illegal type " + cond_arg->getName() + " of third argument of aggregate function "
|
||||||
+ name + ", must be UInt8", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
+ name + ", must be UInt8", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||||
|
|
||||||
for (const auto i : ext::range(min_required_args, argument_types.size()))
|
for (const auto i : collections::range(min_required_args, argument_types.size()))
|
||||||
{
|
{
|
||||||
const auto * cond_arg = argument_types[i].get();
|
const auto * cond_arg = argument_types[i].get();
|
||||||
if (!isUInt8(cond_arg))
|
if (!isUInt8(cond_arg))
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include <city.h>
|
#include <city.h>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
#include <ext/bit_cast.h>
|
#include <common/bit_cast.h>
|
||||||
|
|
||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
#include <IO/ReadHelpers.h>
|
#include <IO/ReadHelpers.h>
|
||||||
@ -150,7 +150,7 @@ template <typename T> struct AggregateFunctionUniqTraits
|
|||||||
{
|
{
|
||||||
if constexpr (std::is_same_v<T, Float32> || std::is_same_v<T, Float64>)
|
if constexpr (std::is_same_v<T, Float32> || std::is_same_v<T, Float64>)
|
||||||
{
|
{
|
||||||
return ext::bit_cast<UInt64>(x);
|
return bit_cast<UInt64>(x);
|
||||||
}
|
}
|
||||||
else if constexpr (sizeof(T) <= sizeof(UInt64))
|
else if constexpr (sizeof(T) <= sizeof(UInt64))
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <common/bit_cast.h>
|
||||||
|
|
||||||
#include <Common/CombinedCardinalityEstimator.h>
|
#include <Common/CombinedCardinalityEstimator.h>
|
||||||
#include <Common/SipHash.h>
|
#include <Common/SipHash.h>
|
||||||
#include <Common/typeid_cast.h>
|
#include <Common/typeid_cast.h>
|
||||||
@ -13,8 +15,6 @@
|
|||||||
#include <AggregateFunctions/UniqCombinedBiasData.h>
|
#include <AggregateFunctions/UniqCombinedBiasData.h>
|
||||||
#include <AggregateFunctions/UniqVariadicHash.h>
|
#include <AggregateFunctions/UniqVariadicHash.h>
|
||||||
|
|
||||||
#include <ext/bit_cast.h>
|
|
||||||
|
|
||||||
#include <Columns/ColumnVector.h>
|
#include <Columns/ColumnVector.h>
|
||||||
#include <Columns/ColumnsNumber.h>
|
#include <Columns/ColumnsNumber.h>
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ namespace detail
|
|||||||
{
|
{
|
||||||
static Ret hash(Float32 x)
|
static Ret hash(Float32 x)
|
||||||
{
|
{
|
||||||
UInt64 res = ext::bit_cast<UInt64>(x);
|
UInt64 res = bit_cast<UInt64>(x);
|
||||||
return static_cast<Ret>(intHash64(res));
|
return static_cast<Ret>(intHash64(res));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -62,7 +62,7 @@ namespace detail
|
|||||||
{
|
{
|
||||||
static Ret hash(Float64 x)
|
static Ret hash(Float64 x)
|
||||||
{
|
{
|
||||||
UInt64 res = ext::bit_cast<UInt64>(x);
|
UInt64 res = bit_cast<UInt64>(x);
|
||||||
return static_cast<Ret>(intHash64(res));
|
return static_cast<Ret>(intHash64(res));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include <DataTypes/DataTypeDate.h>
|
#include <DataTypes/DataTypeDate.h>
|
||||||
#include <DataTypes/DataTypeDateTime.h>
|
#include <DataTypes/DataTypeDateTime.h>
|
||||||
|
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
@ -35,7 +35,7 @@ createAggregateFunctionWindowFunnel(const std::string & name, const DataTypes &
|
|||||||
if (arguments.size() > max_events + 1)
|
if (arguments.size() > max_events + 1)
|
||||||
throw Exception("Too many event arguments for aggregate function " + name, ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
throw Exception("Too many event arguments for aggregate function " + name, ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
||||||
|
|
||||||
for (const auto i : ext::range(1, arguments.size()))
|
for (const auto i : collections::range(1, arguments.size()))
|
||||||
{
|
{
|
||||||
const auto * cond_arg = arguments[i].get();
|
const auto * cond_arg = arguments[i].get();
|
||||||
if (!isUInt8(cond_arg))
|
if (!isUInt8(cond_arg))
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <common/types.h>
|
||||||
|
#include <common/bit_cast.h>
|
||||||
|
#include <Common/HashTable/HashMap.h>
|
||||||
|
|
||||||
#include <IO/ReadBuffer.h>
|
#include <IO/ReadBuffer.h>
|
||||||
#include <IO/WriteBuffer.h>
|
#include <IO/WriteBuffer.h>
|
||||||
#include <Common/HashTable/HashMap.h>
|
|
||||||
#include <common/types.h>
|
|
||||||
#include <ext/bit_cast.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
@ -102,13 +103,13 @@ private:
|
|||||||
/// Take the most significant 16 bits of the floating point number.
|
/// Take the most significant 16 bits of the floating point number.
|
||||||
BFloat16 toBFloat16(const Value & x) const
|
BFloat16 toBFloat16(const Value & x) const
|
||||||
{
|
{
|
||||||
return ext::bit_cast<UInt32>(static_cast<Float32>(x)) >> 16;
|
return bit_cast<UInt32>(static_cast<Float32>(x)) >> 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Put the bits into most significant 16 bits of the floating point number and fill other bits with zeros.
|
/// Put the bits into most significant 16 bits of the floating point number and fill other bits with zeros.
|
||||||
Float32 toFloat32(const BFloat16 & x) const
|
Float32 toFloat32(const BFloat16 & x) const
|
||||||
{
|
{
|
||||||
return ext::bit_cast<Float32>(x << 16);
|
return bit_cast<Float32>(x << 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
using Pair = PairNoInit<Float32, Weight>;
|
using Pair = PairNoInit<Float32, Weight>;
|
||||||
|
@ -59,9 +59,10 @@ template <typename T,
|
|||||||
ReservoirSamplerDeterministicOnEmpty OnEmpty = ReservoirSamplerDeterministicOnEmpty::THROW>
|
ReservoirSamplerDeterministicOnEmpty OnEmpty = ReservoirSamplerDeterministicOnEmpty::THROW>
|
||||||
class ReservoirSamplerDeterministic
|
class ReservoirSamplerDeterministic
|
||||||
{
|
{
|
||||||
bool good(const UInt32 hash)
|
private:
|
||||||
|
bool good(UInt32 hash) const
|
||||||
{
|
{
|
||||||
return !(hash & skip_mask);
|
return (hash & skip_mask) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -77,15 +78,12 @@ public:
|
|||||||
total_values = 0;
|
total_values = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void insert(const T & v, const UInt64 determinator)
|
void insert(const T & v, UInt64 determinator)
|
||||||
{
|
{
|
||||||
if (isNaN(v))
|
if (isNaN(v))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const UInt32 hash = intHash64(determinator);
|
UInt32 hash = intHash64(determinator);
|
||||||
if (!good(hash))
|
|
||||||
return;
|
|
||||||
|
|
||||||
insertImpl(v, hash);
|
insertImpl(v, hash);
|
||||||
sorted = false;
|
sorted = false;
|
||||||
++total_values;
|
++total_values;
|
||||||
@ -144,8 +142,7 @@ public:
|
|||||||
setSkipDegree(b.skip_degree);
|
setSkipDegree(b.skip_degree);
|
||||||
|
|
||||||
for (const auto & sample : b.samples)
|
for (const auto & sample : b.samples)
|
||||||
if (good(sample.second))
|
insertImpl(sample.first, sample.second);
|
||||||
insertImpl(sample.first, sample.second);
|
|
||||||
|
|
||||||
total_values += b.total_values;
|
total_values += b.total_values;
|
||||||
}
|
}
|
||||||
@ -220,10 +217,19 @@ private:
|
|||||||
|
|
||||||
void insertImpl(const T & v, const UInt32 hash)
|
void insertImpl(const T & v, const UInt32 hash)
|
||||||
{
|
{
|
||||||
|
if (!good(hash))
|
||||||
|
return;
|
||||||
|
|
||||||
/// Make a room for plus one element.
|
/// Make a room for plus one element.
|
||||||
while (samples.size() >= max_sample_size)
|
while (samples.size() >= max_sample_size)
|
||||||
|
{
|
||||||
setSkipDegree(skip_degree + 1);
|
setSkipDegree(skip_degree + 1);
|
||||||
|
|
||||||
|
/// Still good?
|
||||||
|
if (!good(hash))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
samples.emplace_back(v, hash);
|
samples.emplace_back(v, hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include <Poco/Util/AbstractConfiguration.h>
|
#include <Poco/Util/AbstractConfiguration.h>
|
||||||
#include <Common/ShellCommand.h>
|
#include <Common/ShellCommand.h>
|
||||||
#include <common/logger_useful.h>
|
#include <common/logger_useful.h>
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
#include <Core/Field.h>
|
#include <Core/Field.h>
|
||||||
#include <Common/escapeForFileName.h>
|
#include <Common/escapeForFileName.h>
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include <Common/ShellCommand.h>
|
#include <Common/ShellCommand.h>
|
||||||
#include <IO/ConnectionTimeoutsContext.h>
|
#include <IO/ConnectionTimeoutsContext.h>
|
||||||
#include <common/logger_useful.h>
|
#include <common/logger_useful.h>
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
#include <Bridge/IBridgeHelper.h>
|
#include <Bridge/IBridgeHelper.h>
|
||||||
|
|
||||||
#if !defined(ARCADIA_BUILD)
|
#if !defined(ARCADIA_BUILD)
|
||||||
|
@ -185,6 +185,9 @@ public:
|
|||||||
|
|
||||||
bool isConnected() const { return connected; }
|
bool isConnected() const { return connected; }
|
||||||
|
|
||||||
|
/// Check if connection is still active with ping request.
|
||||||
|
bool checkConnected() { return connected && ping(); }
|
||||||
|
|
||||||
TablesStatusResponse getTablesStatus(const ConnectionTimeouts & timeouts,
|
TablesStatusResponse getTablesStatus(const ConnectionTimeouts & timeouts,
|
||||||
const TablesStatusRequest & request);
|
const TablesStatusRequest & request);
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include <common/unaligned.h>
|
#include <common/unaligned.h>
|
||||||
#include <common/sort.h>
|
#include <common/sort.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
|
|
||||||
|
|
||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include <Common/memcmpSmall.h>
|
#include <Common/memcmpSmall.h>
|
||||||
#include <Common/memcpySmall.h>
|
#include <Common/memcpySmall.h>
|
||||||
#include <common/sort.h>
|
#include <common/sort.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
|
|
||||||
#if defined(__SSE2__)
|
#if defined(__SSE2__)
|
||||||
# include <emmintrin.h>
|
# include <emmintrin.h>
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include <Common/WeakHash.h>
|
#include <Common/WeakHash.h>
|
||||||
#include <Common/assert_cast.h>
|
#include <Common/assert_cast.h>
|
||||||
#include <common/sort.h>
|
#include <common/sort.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
#include <DataStreams/ColumnGathererStream.h>
|
#include <DataStreams/ColumnGathererStream.h>
|
||||||
#include <IO/WriteBufferFromString.h>
|
#include <IO/WriteBufferFromString.h>
|
||||||
#include <IO/Operators.h>
|
#include <IO/Operators.h>
|
||||||
#include <ext/map.h>
|
#include <common/map.h>
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
#include <Common/typeid_cast.h>
|
#include <Common/typeid_cast.h>
|
||||||
#include <Common/assert_cast.h>
|
#include <Common/assert_cast.h>
|
||||||
#include <Common/WeakHash.h>
|
#include <Common/WeakHash.h>
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include <Common/memcmpSmall.h>
|
#include <Common/memcmpSmall.h>
|
||||||
#include <common/sort.h>
|
#include <common/sort.h>
|
||||||
#include <common/unaligned.h>
|
#include <common/unaligned.h>
|
||||||
#include <ext/scope_guard.h>
|
#include <common/scope_guard.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
|
@ -10,8 +10,8 @@
|
|||||||
#include <Common/assert_cast.h>
|
#include <Common/assert_cast.h>
|
||||||
#include <Common/typeid_cast.h>
|
#include <Common/typeid_cast.h>
|
||||||
#include <common/sort.h>
|
#include <common/sort.h>
|
||||||
#include <ext/map.h>
|
#include <common/map.h>
|
||||||
#include <ext/range.h>
|
#include <common/range.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
@ -100,14 +100,14 @@ MutableColumnPtr ColumnTuple::cloneResized(size_t new_size) const
|
|||||||
|
|
||||||
Field ColumnTuple::operator[](size_t n) const
|
Field ColumnTuple::operator[](size_t n) const
|
||||||
{
|
{
|
||||||
return ext::map<Tuple>(columns, [n] (const auto & column) { return (*column)[n]; });
|
return collections::map<Tuple>(columns, [n] (const auto & column) { return (*column)[n]; });
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColumnTuple::get(size_t n, Field & res) const
|
void ColumnTuple::get(size_t n, Field & res) const
|
||||||
{
|
{
|
||||||
const size_t tuple_size = columns.size();
|
const size_t tuple_size = columns.size();
|
||||||
Tuple tuple(tuple_size);
|
Tuple tuple(tuple_size);
|
||||||
for (const auto i : ext::range(0, tuple_size))
|
for (const auto i : collections::range(0, tuple_size))
|
||||||
columns[i]->get(n, tuple[i]);
|
columns[i]->get(n, tuple[i]);
|
||||||
|
|
||||||
res = tuple;
|
res = tuple;
|
||||||
@ -467,7 +467,7 @@ void ColumnTuple::getExtremes(Field & min, Field & max) const
|
|||||||
Tuple min_tuple(tuple_size);
|
Tuple min_tuple(tuple_size);
|
||||||
Tuple max_tuple(tuple_size);
|
Tuple max_tuple(tuple_size);
|
||||||
|
|
||||||
for (const auto i : ext::range(0, tuple_size))
|
for (const auto i : collections::range(0, tuple_size))
|
||||||
columns[i]->getExtremes(min_tuple[i], max_tuple[i]);
|
columns[i]->getExtremes(min_tuple[i], max_tuple[i]);
|
||||||
|
|
||||||
min = min_tuple;
|
min = min_tuple;
|
||||||
@ -488,7 +488,7 @@ bool ColumnTuple::structureEquals(const IColumn & rhs) const
|
|||||||
if (tuple_size != rhs_tuple->columns.size())
|
if (tuple_size != rhs_tuple->columns.size())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (const auto i : ext::range(0, tuple_size))
|
for (const auto i : collections::range(0, tuple_size))
|
||||||
if (!columns[i]->structureEquals(*rhs_tuple->columns[i]))
|
if (!columns[i]->structureEquals(*rhs_tuple->columns[i]))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user