mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 00:30:49 +00:00
Merge pull request #22109 from azat/nested-epoll-wait
Disable async_socket_for_remote/use_hedged_requests for buggy linux kernels
This commit is contained in:
commit
f90a328568
62
src/Core/SettingsQuirks.cpp
Normal file
62
src/Core/SettingsQuirks.cpp
Normal file
@ -0,0 +1,62 @@
|
||||
#include <Core/SettingsQuirks.h>
|
||||
#include <Core/Settings.h>
|
||||
#include <common/logger_useful.h>
|
||||
|
||||
#ifdef __linux__
|
||||
#include <linux/version.h>
|
||||
#endif
|
||||
|
||||
#ifdef __linux__
|
||||
/// Detect does epoll_wait with nested epoll fds works correctly.
|
||||
/// Polling nested epoll fds from epoll_wait is required for async_socket_for_remote and use_hedged_requests.
|
||||
///
|
||||
/// It may not be reliable in 5.5+ [1], that has been fixed in 5.7+ [2] or 5.6.13+.
|
||||
///
|
||||
/// [1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=339ddb53d373
|
||||
/// [2]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0c54a6a44bf3
|
||||
bool nestedEpollWorks(Poco::Logger * log)
|
||||
{
|
||||
bool nested_epoll_works =
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 5, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(5, 6, 13))
|
||||
/// the check is correct since there will be no more 5.5.x releases.
|
||||
false
|
||||
#else
|
||||
true
|
||||
#endif
|
||||
;
|
||||
|
||||
if (!nested_epoll_works)
|
||||
{
|
||||
if (log)
|
||||
LOG_WARNING(log, "Nested epoll_wait has some issues on kernels [5.5.0, 5.6.13). You should upgrade it to avoid possible issues.");
|
||||
}
|
||||
return nested_epoll_works;
|
||||
}
|
||||
#else
|
||||
bool nestedEpollWorks(Poco::Logger *) { return true; }
|
||||
#endif
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
/// Update some settings defaults to avoid some known issues.
|
||||
void applySettingsQuirks(Settings & settings, Poco::Logger * log)
|
||||
{
|
||||
if (!nestedEpollWorks(log))
|
||||
{
|
||||
if (!settings.async_socket_for_remote.changed && settings.async_socket_for_remote)
|
||||
{
|
||||
settings.async_socket_for_remote = false;
|
||||
if (log)
|
||||
LOG_WARNING(log, "async_socket_for_remote has been disabled (you can explicitly enable it still)");
|
||||
}
|
||||
if (!settings.use_hedged_requests.changed && settings.use_hedged_requests)
|
||||
{
|
||||
settings.use_hedged_requests = false;
|
||||
if (log)
|
||||
LOG_WARNING(log, "use_hedged_requests has been disabled (you can explicitly enable it still)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
16
src/Core/SettingsQuirks.h
Normal file
16
src/Core/SettingsQuirks.h
Normal file
@ -0,0 +1,16 @@
|
||||
#pragma once
|
||||
|
||||
namespace Poco
|
||||
{
|
||||
class Logger;
|
||||
}
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
struct Settings;
|
||||
|
||||
/// Update some settings defaults to avoid some known issues.
|
||||
void applySettingsQuirks(Settings & settings, Poco::Logger * log = nullptr);
|
||||
|
||||
}
|
@ -36,6 +36,7 @@ SRCS(
|
||||
Settings.cpp
|
||||
SettingsEnums.cpp
|
||||
SettingsFields.cpp
|
||||
SettingsQuirks.cpp
|
||||
SortDescription.cpp
|
||||
iostream_debug_helpers.cpp
|
||||
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <TableFunctions/TableFunctionFactory.h>
|
||||
#include <Interpreters/ActionLocksManager.h>
|
||||
#include <Core/Settings.h>
|
||||
#include <Core/SettingsQuirks.h>
|
||||
#include <Access/AccessControlManager.h>
|
||||
#include <Access/ContextAccess.h>
|
||||
#include <Access/EnabledRolesInfo.h>
|
||||
@ -1102,6 +1103,7 @@ void Context::applySettingsChanges(const SettingsChanges & changes)
|
||||
auto lock = getLock();
|
||||
for (const SettingChange & change : changes)
|
||||
applySettingChange(change);
|
||||
applySettingsQuirks(settings);
|
||||
}
|
||||
|
||||
|
||||
@ -2300,6 +2302,8 @@ void Context::setDefaultProfiles(const Poco::Util::AbstractConfiguration & confi
|
||||
shared->system_profile_name = config.getString("system_profile", shared->default_profile_name);
|
||||
setProfile(shared->system_profile_name);
|
||||
|
||||
applySettingsQuirks(settings, &Poco::Logger::get("SettingsQuirks"));
|
||||
|
||||
shared->buffer_profile_name = config.getString("buffer_profile", shared->system_profile_name);
|
||||
buffer_context = std::make_shared<Context>(*this);
|
||||
buffer_context->setProfile(shared->buffer_profile_name);
|
||||
|
Loading…
Reference in New Issue
Block a user