Merge branch 'master' into try-to-change-signal-for-integration-rests

This commit is contained in:
mergify[bot] 2021-06-17 06:20:40 +00:00 committed by GitHub
commit 04adc58ba1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
407 changed files with 2047 additions and 1685 deletions

6
.gitmodules vendored
View File

@ -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

View File

@ -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;

View File

@ -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;
} }

View File

@ -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>

View File

@ -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
View 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
View 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
View 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
View 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)));
}
}

View File

@ -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);
} }
} }

View File

@ -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__)

View File

@ -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>

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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>

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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));
}
}

View File

@ -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};
}
}

View File

@ -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; };
};
}

View File

@ -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));
}
}

View File

@ -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)));
}
}

View File

@ -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)...);
}
}

View File

@ -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(); }
}

View File

@ -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

@ -1 +1 @@
Subproject commit 58d2a028d1600225ac3a478d6b3a06ba2f0c01f6 Subproject commit 357608d11b7a1961c3fb7db2ef9a5dbb2e87da77

View File

@ -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")

View File

@ -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

View File

@ -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/ ||:

View File

@ -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 = ""

View File

@ -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/ ||:

View File

@ -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)

View File

@ -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

View File

@ -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];

View File

@ -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>

View File

@ -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
( (

View File

@ -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.
} }
} }

View File

@ -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>

View File

@ -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"))
{ {

View File

@ -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"

View File

@ -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()};

View File

@ -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

View File

@ -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);
} }

View File

@ -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)

View File

@ -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)

View File

@ -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")

View File

@ -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

View File

@ -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)

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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;

View File

@ -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)];

View File

@ -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;

View File

@ -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];

View File

@ -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);

View File

@ -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;

View File

@ -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>

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;
}; };
} }

View File

@ -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>

View File

@ -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);

View File

@ -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;

View File

@ -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())
{ {

View File

@ -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;
}; };

View File

@ -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)
{ {

View File

@ -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());

View File

@ -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;
}; };
} }

View File

@ -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);

View File

@ -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;
}; };

View File

@ -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])
{ {

View File

@ -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;
}; };

View File

@ -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;

View File

@ -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);
} }

View File

@ -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;

View File

@ -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];

View File

@ -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

View File

@ -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;
} }

View File

@ -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)

View File

@ -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))

View File

@ -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);

View File

@ -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))

View File

@ -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))
{ {

View File

@ -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));
} }
}; };

View File

@ -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))

View File

@ -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>;

View File

@ -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);
} }

View File

@ -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>

View File

@ -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)

View File

@ -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);

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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>

View File

@ -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

View File

@ -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