From c35bbf1bd231fa562ab403cb7c2c2eccf6aadcbf Mon Sep 17 00:00:00 2001 From: levlam Date: Sun, 18 Sep 2022 00:20:41 +0300 Subject: [PATCH] Update TDLib to 1.8.6 and add options for changing CPU affinity. --- td | 2 +- telegram-bot-api/Client.cpp | 36 ++++++++++------------ telegram-bot-api/telegram-bot-api.cpp | 43 +++++++++++++++++++++++---- 3 files changed, 55 insertions(+), 26 deletions(-) diff --git a/td b/td index 96fc91e..cb70993 160000 --- a/td +++ b/td @@ -1 +1 @@ -Subproject commit 96fc91e239f25a123df2e0405f58e24bc963cab7 +Subproject commit cb70993b90ce84c16dea07c347835addbff46a2c diff --git a/telegram-bot-api/Client.cpp b/telegram-bot-api/Client.cpp index c1721a1..00608f4 100644 --- a/telegram-bot-api/Client.cpp +++ b/telegram-bot-api/Client.cpp @@ -4472,27 +4472,23 @@ void Client::on_update_authorization_state() { make_object(true)), td::make_unique()); - auto parameters = make_object(); + auto request = make_object(); + request->use_test_dc_ = is_test_dc_; + request->database_directory_ = dir_; + //request->use_file_database_ = false; + //request->use_chat_info_database_ = false; + //request->use_secret_chats_ = false; + request->use_message_database_ = USE_MESSAGE_DATABASE; + request->api_id_ = parameters_->api_id_; + request->api_hash_ = parameters_->api_hash_; + request->system_language_code_ = "en"; + request->device_model_ = "server"; + request->application_version_ = parameters_->version_; + request->enable_storage_optimizer_ = true; + request->ignore_file_names_ = true; - parameters->use_test_dc_ = is_test_dc_; - parameters->database_directory_ = dir_; - //parameters->use_file_database_ = false; - //parameters->use_chat_info_database_ = false; - //parameters->use_secret_chats_ = false; - parameters->use_message_database_ = USE_MESSAGE_DATABASE; - parameters->api_id_ = parameters_->api_id_; - parameters->api_hash_ = parameters_->api_hash_; - parameters->system_language_code_ = "en"; - parameters->device_model_ = "server"; - parameters->application_version_ = parameters_->version_; - parameters->enable_storage_optimizer_ = true; - parameters->ignore_file_names_ = true; - - return send_request(make_object(std::move(parameters)), - td::make_unique(this)); + return send_request(std::move(request), td::make_unique(this)); } - case td_api::authorizationStateWaitEncryptionKey::ID: - return send_request(make_object(), td::make_unique(this)); case td_api::authorizationStateWaitPhoneNumber::ID: send_request(make_object("online", make_object(true)), td::make_unique()); @@ -5618,7 +5614,7 @@ td::Result> Client::get_input_me td_api::object_ptr Client::get_message_send_options(bool disable_notification, bool protect_content) { - return make_object(disable_notification, false, protect_content, nullptr); + return make_object(disable_notification, false, protect_content, false, nullptr); } td::Result>> Client::get_inline_query_results( diff --git a/telegram-bot-api/telegram-bot-api.cpp b/telegram-bot-api/telegram-bot-api.cpp index 419dfcf..f5cc937 100644 --- a/telegram-bot-api/telegram-bot-api.cpp +++ b/telegram-bot-api/telegram-bot-api.cpp @@ -44,6 +44,7 @@ #include "td/utils/port/signals.h" #include "td/utils/port/stacktrace.h" #include "td/utils/port/Stat.h" +#include "td/utils/port/thread.h" #include "td/utils/port/user.h" #include "td/utils/Promise.h" #include "td/utils/Slice.h" @@ -223,6 +224,8 @@ int main(int argc, char *argv[]) { td::string username; td::string groupname; td::uint64 max_connections = 0; + td::uint64 cpu_affinity = 0; + td::uint64 main_thread_affinity = 0; ClientManager::TokenRange token_range{0, 1}; parameters->api_id_ = [](auto x) -> td::int32 { @@ -310,6 +313,17 @@ int main(int argc, char *argv[]) { options.add_option('g', "groupname", "effective group name to switch to", td::OptionParser::parse_string(groupname)); options.add_checked_option('c', "max-connections", "maximum number of open file descriptors", td::OptionParser::parse_integer(max_connections)); +#if TD_HAVE_THREAD_AFFINITY + options.add_checked_option('\0', "cpu-affinity", "CPU affinity as 64-bit mask (defaults to all available CPUs)", + td::OptionParser::parse_integer(cpu_affinity)); + options.add_checked_option( + '\0', "main-thread-affinity", + "CPU affinity of the main thread as 64-bit mask (defaults to the value of the option --cpu-affinity)", + td::OptionParser::parse_integer(main_thread_affinity)); +#else + (void)cpu_affinity; + (void)main_thread_affinity; +#endif options.add_checked_option('\0', "proxy", "HTTP proxy server for outgoing webhook requests in the format http://host:port", @@ -363,6 +377,26 @@ int main(int argc, char *argv[]) { td::TsLog ts_log(&file_log); auto init_status = [&] { +#if TD_HAVE_THREAD_AFFINITY + if (main_thread_affinity == 0) { + main_thread_affinity = cpu_affinity; + } + if (main_thread_affinity != 0) { + auto initial_mask = td::thread::get_affinity_mask(td::this_thread::get_id()); + if (initial_mask == 0) { + return td::Status::Error("Failed to get current thread affinity"); + } + if (cpu_affinity != 0) { + TRY_STATUS_PREFIX(td::thread::set_affinity_mask(td::this_thread::get_id(), cpu_affinity), + "Can't set CPU affinity mask: "); + } else { + cpu_affinity = initial_mask; + } + TRY_STATUS_PREFIX(td::thread::set_affinity_mask(td::this_thread::get_id(), main_thread_affinity), + "Can't set main thread CPU affinity mask: "); + } +#endif + if (max_connections != 0) { TRY_STATUS_PREFIX(td::set_resource_limit(td::ResourceLimitType::NoFile, max_connections), "Can't set file descriptor limit: "); @@ -463,12 +497,11 @@ int main(int argc, char *argv[]) { // << (td::GitInfo::is_dirty() ? "(dirty)" : "") << " started"; LOG(WARNING) << "Bot API " << parameters->version_ << " server started"; - const int threads_n = 6; // +3 for Td, one for watchdog, one for slow HTTP connections, one for DNS resolving - td::ConcurrentScheduler sched; - sched.init(threads_n); + const int thread_count = 6; // +3 for Td, one for watchdog, one for slow HTTP connections, one for DNS resolving + td::ConcurrentScheduler sched(thread_count, cpu_affinity); td::GetHostByNameActor::Options get_host_by_name_options; - get_host_by_name_options.scheduler_id = threads_n; + get_host_by_name_options.scheduler_id = thread_count; parameters->get_host_by_name_actor_id_ = sched.create_actor_unsafe(0, "GetHostByName", std::move(get_host_by_name_options)) .release(); @@ -498,7 +531,7 @@ int main(int argc, char *argv[]) { constexpr double WATCHDOG_TIMEOUT = 0.5; auto watchdog_id = - sched.create_actor_unsafe(threads_n - 2, "Watchdog", td::this_thread::get_id(), WATCHDOG_TIMEOUT); + sched.create_actor_unsafe(thread_count - 2, "Watchdog", td::this_thread::get_id(), WATCHDOG_TIMEOUT); sched.start();