From e1771fa7de1864727fcebf151e7cf81bdd0e5732 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Sun, 21 Mar 2021 00:27:18 +0100 Subject: [PATCH] Add an experimental option to delay get_channel_difference --- README.md | 2 ++ td/telegram/MessagesManager.cpp | 21 ++++++++++++++++++++- td/telegram/MessagesManager.h | 6 ++++-- td/telegram/Td.cpp | 5 +++++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 26a226abc..47e67aa9a 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,8 @@ We added some options: * **delete_file_reference_after_seconds** (positive number) During cleanup, free the memory of the files that have not been touched for more than X seconds * **experiment_enable_file_reference_cleanup** (**true**/false) During cleanup, free the memory of the file references * **experiment_enable_chat_access_hash_cleanup** (**true**/false) During cleanup, clean chats and channels access hash +* **get_channel_difference_delay_milliseconds** (**0**) Delay get_channel_difference n milliseconds every ~3000pts (~300msg). + Don't modify this option unless you have a very large bot that struggles to keep up with start-up updates throughput. ## Custom API functions ### TdApi.OptimizeMemory diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index ac4b49f1a..7ea99f7bd 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -35641,6 +35641,23 @@ class MessagesManager::GetChannelDifferenceLogEvent { } }; +void MessagesManager::get_channel_difference_delayed(DialogId dialog_id, int32 pts, + bool force, double delay_seconds, const char *source) { + if (delay_seconds <= 0.0) { + // Execute get_channel_difference immediatly + get_channel_difference(dialog_id,pts, force, "on_get_channel_difference"); + } else { + // Schedule get_channel_difference + create_actor( + "GetChannelDifferenceDelayedActor", delay_seconds, + PromiseCreator::lambda([actor_id = actor_id(this), dialog_id, pts, force](Result result) { + send_closure(actor_id, &MessagesManager::get_channel_difference, dialog_id, pts, force, + "on_get_channel_difference"); + })) + .release(); + } +} + void MessagesManager::get_channel_difference(DialogId dialog_id, int32 pts, bool force, const char *source) { if (channel_get_difference_retry_timeout_.has_timeout(dialog_id.get())) { LOG(INFO) << "Skip running channels.getDifference for " << dialog_id << " from " << source @@ -36057,7 +36074,9 @@ void MessagesManager::on_get_channel_difference( if (!is_final) { LOG_IF(ERROR, timeout > 0) << "Have timeout in not final ChannelDifference in " << dialog_id; - get_channel_difference(dialog_id, d->pts, true, "on_get_channel_difference"); + auto delay_seconds = static_cast(G()->shared_config() + .get_option_integer("get_channel_difference_delay_milliseconds", 0)) / 1000.0; + get_channel_difference_delayed(dialog_id, d->pts, true, delay_seconds, "on_get_channel_difference"); return; } diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index a76aa53ce..b04aa62b2 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1646,8 +1646,8 @@ class MessagesManager : public Actor { static constexpr int32 MAX_SEARCH_MESSAGES = 100; // server side limit static constexpr int32 MIN_SEARCH_PUBLIC_DIALOG_PREFIX_LEN = 4; // server side limit static constexpr int32 MIN_CHANNEL_DIFFERENCE = 10; - static constexpr int32 MAX_CHANNEL_DIFFERENCE = 100; - static constexpr int32 MAX_BOT_CHANNEL_DIFFERENCE = 100000; // server side limit + static constexpr int32 MAX_BOT_CHANNEL_DIFFERENCE = 1000000; // server side limit + static constexpr int32 MAX_CHANNEL_DIFFERENCE = MAX_BOT_CHANNEL_DIFFERENCE; static constexpr int32 MAX_RECENTLY_FOUND_DIALOGS = 30; // some reasonable value static constexpr size_t MAX_TITLE_LENGTH = 128; // server side limit for chat title static constexpr size_t MAX_DESCRIPTION_LENGTH = 255; // server side limit for chat description @@ -2774,6 +2774,8 @@ class MessagesManager : public Actor { void on_channel_get_difference_timeout(DialogId dialog_id); + void get_channel_difference_delayed(DialogId dialog_id, int32 pts, bool force, double timeout, const char *source); + void get_channel_difference(DialogId dialog_id, int32 pts, bool force, const char *source); void do_get_channel_difference(DialogId dialog_id, int32 pts, bool force, diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 0d32b3111..cb5fa9533 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -7462,6 +7462,11 @@ void Td::on_request(uint64 id, td_api::setOption &request) { return; } break; + case 'g': + if (set_integer_option("get_channel_difference_delay_milliseconds")) { + return; + } + break; case 'i': if (set_boolean_option("ignore_background_updates")) { return;