forked from ClickHouse/ClickHouse
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request ClickHouse#22109 from azat/nested-epoll-wait
Disable async_socket_for_remote/use_hedged_requests for buggy linux kernels
- Loading branch information
Showing
4 changed files
with
83 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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)"); | ||
} | ||
} | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters