diff --git a/td/telegram/UpdatesManager.cpp b/td/telegram/UpdatesManager.cpp index f217cb2de..b33eb2123 100644 --- a/td/telegram/UpdatesManager.cpp +++ b/td/telegram/UpdatesManager.cpp @@ -395,8 +395,14 @@ void UpdatesManager::before_get_difference(bool is_initial) { // may be called many times before after_get_difference is called send_closure(G()->state_manager(), &StateManager::on_synchronized, false); - postponed_pts_updates_.insert(std::make_move_iterator(pending_pts_updates_.begin()), - std::make_move_iterator(pending_pts_updates_.end())); + if (can_postpone_updates()) { + postponed_pts_updates_.insert(std::make_move_iterator(pending_pts_updates_.begin()), + std::make_move_iterator(pending_pts_updates_.end())); + } else { + for (auto &update : pending_pts_updates_) { + update.second.promise.set_value(Unit()); + } + } drop_all_pending_pts_updates(); @@ -1748,6 +1754,8 @@ void UpdatesManager::after_get_difference() { retry_timeout_.cancel_timeout(); retry_time_ = 1; + finished_first_get_difference_ = true; + // cancels qts_gap_timeout_ if needed, can apply some updates received during getDifference, // but missed in getDifference process_pending_qts_updates(); @@ -1970,6 +1978,7 @@ void UpdatesManager::on_pending_updates(vector(update), get_promise()); update = nullptr; } + // check that if getDifference wasn't run than it isn't run still CHECK(need_postpone || !running_get_difference_); } } @@ -2122,7 +2132,7 @@ void UpdatesManager::on_pending_updates(vector 0) << "Already have pending updates with seq = " << seq_begin << ", but receive it again from " << source; - pending_seq_updates_.emplace( - seq_begin, PendingSeqUpdates(seq_begin, seq_end, date, receive_time, std::move(updates), std::move(lock))); + if (can_postpone_updates()) { + pending_seq_updates_.emplace( + seq_begin, PendingSeqUpdates(seq_begin, seq_end, date, receive_time, std::move(updates), std::move(lock))); + } else { + lock.set_value(Unit()); + } + set_seq_gap_timeout(receive_time + MAX_UNFILLED_GAP_TIME - Time::now()); } @@ -2245,6 +2264,9 @@ void UpdatesManager::add_pending_qts_update(tl_object_ptr if (!running_get_difference_ && pending_qts_updates_.empty()) { set_qts_gap_timeout(MAX_UNFILLED_GAP_TIME); } + if (!can_postpone_updates()) { + return promise.set_value(Unit()); + } auto &pending_update = pending_qts_updates_[qts]; if (pending_update.update != nullptr) { LOG(WARNING) << "Receive duplicate update with QTS = " << qts; @@ -2529,6 +2551,9 @@ void UpdatesManager::add_pending_pts_update(tl_object_ptr void UpdatesManager::postpone_pts_update(tl_object_ptr &&update, int32 pts, int32 pts_count, double receive_time, Promise &&promise) { + if (!can_postpone_updates()) { + return promise.set_value(Unit()); + } postponed_pts_updates_.emplace(pts, PendingPtsUpdate(std::move(update), pts, pts_count, receive_time, std::move(promise))); } diff --git a/td/telegram/UpdatesManager.h b/td/telegram/UpdatesManager.h index 4b703f4c2..634a4adde 100644 --- a/td/telegram/UpdatesManager.h +++ b/td/telegram/UpdatesManager.h @@ -241,15 +241,16 @@ class UpdatesManager final : public Actor { double next_data_reload_time_ = 0.0; Timeout data_reload_timeout_; + bool is_ping_sent_ = false; + bool running_get_difference_ = false; + bool finished_first_get_difference_ = false; int32 last_get_difference_pts_ = 0; int32 last_get_difference_qts_ = 0; int32 min_postponed_update_pts_ = 0; int32 min_postponed_update_qts_ = 0; double get_difference_start_time_ = 0; // time from which we started to get difference without success - bool is_ping_sent_ = false; - FlatHashMap pending_audio_transcriptions_; MultiTimeout pending_audio_transcription_timeout_{"PendingAudioTranscriptionTimeout"}; @@ -289,6 +290,10 @@ class UpdatesManager final : public Actor { void on_qts_ack(PtsManager::PtsId ack_token); void save_qts(int32 qts); + bool can_postpone_updates() const { + return finished_first_get_difference_; + } + void set_date(int32 date, bool from_update, string date_source); int32 get_short_update_date() const;