Move retry_get_difference_timeout out of Dialog to allow retries for unknown dialogs.

This commit is contained in:
levlam 2021-07-29 02:52:59 +03:00
parent d5a19f0a82
commit be53ea2e1c
2 changed files with 12 additions and 8 deletions

View File

@ -35614,11 +35614,15 @@ void MessagesManager::on_get_channel_difference(
if (difference_ptr == nullptr) { if (difference_ptr == nullptr) {
bool have_access = have_input_peer(dialog_id, AccessRights::Read); bool have_access = have_input_peer(dialog_id, AccessRights::Read);
if (have_access && d != nullptr) { if (have_access) {
channel_get_difference_retry_timeout_.add_timeout_in(dialog_id.get(), d->retry_get_difference_timeout); auto &delay = channel_get_difference_retry_timeouts_[dialog_id];
d->retry_get_difference_timeout *= 2; if (delay == 0) {
if (d->retry_get_difference_timeout > 60) { delay = 1;
d->retry_get_difference_timeout = Random::fast(60, 80); }
channel_get_difference_retry_timeout_.add_timeout_in(dialog_id.get(), delay);
delay *= 2;
if (delay > 60) {
delay = Random::fast(60, 80);
} }
} else { } else {
after_get_channel_difference(dialog_id, false); after_get_channel_difference(dialog_id, false);
@ -35626,6 +35630,8 @@ void MessagesManager::on_get_channel_difference(
return; return;
} }
channel_get_difference_retry_timeouts_.erase(dialog_id);
LOG(INFO) << "Receive result of getChannelDifference for " << dialog_id << " with pts = " << request_pts LOG(INFO) << "Receive result of getChannelDifference for " << dialog_id << " with pts = " << request_pts
<< " and limit = " << request_limit << ": " << to_string(difference_ptr); << " and limit = " << request_limit << ": " << to_string(difference_ptr);
@ -35671,8 +35677,6 @@ void MessagesManager::on_get_channel_difference(
LOG_IF(ERROR, cur_pts != request_pts) << "Channel pts has changed from " << request_pts << " to " << d->pts << " in " LOG_IF(ERROR, cur_pts != request_pts) << "Channel pts has changed from " << request_pts << " to " << d->pts << " in "
<< dialog_id << " during getChannelDifference"; << dialog_id << " during getChannelDifference";
d->retry_get_difference_timeout = 1;
bool is_final = true; bool is_final = true;
int32 timeout = 0; int32 timeout = 0;
switch (difference_ptr->get_id()) { switch (difference_ptr->get_id()) {

View File

@ -1240,7 +1240,6 @@ class MessagesManager final : public Actor {
int32 pts = 0; // for channels only int32 pts = 0; // for channels only
std::multimap<int32, PendingPtsUpdate> postponed_channel_updates; // for channels only std::multimap<int32, PendingPtsUpdate> postponed_channel_updates; // for channels only
int32 retry_get_difference_timeout = 1; // for channels only
int32 pending_read_channel_inbox_pts = 0; // for channels only int32 pending_read_channel_inbox_pts = 0; // for channels only
MessageId pending_read_channel_inbox_max_message_id; // for channels only MessageId pending_read_channel_inbox_max_message_id; // for channels only
int32 pending_read_channel_inbox_server_unread_count = 0; // for channels only int32 pending_read_channel_inbox_server_unread_count = 0; // for channels only
@ -3237,6 +3236,7 @@ class MessagesManager final : public Actor {
std::unordered_map<DialogId, string, DialogIdHash> active_get_channel_differencies_; std::unordered_map<DialogId, string, DialogIdHash> active_get_channel_differencies_;
std::unordered_map<DialogId, uint64, DialogIdHash> get_channel_difference_to_log_event_id_; std::unordered_map<DialogId, uint64, DialogIdHash> get_channel_difference_to_log_event_id_;
std::unordered_map<DialogId, int32, DialogIdHash> channel_get_difference_retry_timeouts_;
MultiTimeout channel_get_difference_timeout_{"ChannelGetDifferenceTimeout"}; MultiTimeout channel_get_difference_timeout_{"ChannelGetDifferenceTimeout"};
MultiTimeout channel_get_difference_retry_timeout_{"ChannelGetDifferenceRetryTimeout"}; MultiTimeout channel_get_difference_retry_timeout_{"ChannelGetDifferenceRetryTimeout"};