Extract pts and qts updates and apply them during getDifference.
This commit is contained in:
parent
a7e2e85119
commit
241718eae8
|
@ -1338,15 +1338,8 @@ void UpdatesManager::on_get_difference(tl_object_ptr<telegram_api::updates_Diffe
|
|||
auto difference = move_tl_object_as<telegram_api::updates_differenceEmpty>(difference_ptr);
|
||||
set_date(difference->date_, false, "on_get_difference_empty");
|
||||
seq_ = difference->seq_;
|
||||
if (!pending_seq_updates_.empty()) {
|
||||
LOG(WARNING) << "Drop " << pending_seq_updates_.size() << " pending seq updates after receive empty difference";
|
||||
auto pending_seq_updates = std::move(pending_seq_updates_);
|
||||
pending_seq_updates_.clear();
|
||||
|
||||
for (auto &pending_update : pending_seq_updates) {
|
||||
pending_update.second.promise.set_value(Unit());
|
||||
}
|
||||
}
|
||||
process_pending_qts_updates();
|
||||
if (!pending_qts_updates_.empty()) {
|
||||
LOG(WARNING) << "Drop " << pending_qts_updates_.size() << " pending qts updates after receive empty difference";
|
||||
auto pending_qts_updates = std::move(pending_qts_updates_);
|
||||
|
@ -1359,6 +1352,17 @@ void UpdatesManager::on_get_difference(tl_object_ptr<telegram_api::updates_Diffe
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
process_pending_seq_updates();
|
||||
if (!pending_seq_updates_.empty()) {
|
||||
LOG(WARNING) << "Drop " << pending_seq_updates_.size() << " pending seq updates after receive empty difference";
|
||||
auto pending_seq_updates = std::move(pending_seq_updates_);
|
||||
pending_seq_updates_.clear();
|
||||
|
||||
for (auto &pending_update : pending_seq_updates) {
|
||||
pending_update.second.promise.set_value(Unit());
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case telegram_api::updates_difference::ID: {
|
||||
|
@ -1564,24 +1568,7 @@ void UpdatesManager::on_pending_updates(vector<tl_object_ptr<telegram_api::Updat
|
|||
}
|
||||
|
||||
bool need_postpone = running_get_difference_ /*|| string(source) != string("postponed updates")*/;
|
||||
if (need_postpone) {
|
||||
LOG(INFO) << "Postpone " << updates.size() << " updates [" << seq_begin << ", " << seq_end
|
||||
<< "] with date = " << date << " from " << source;
|
||||
for (auto &update : updates) {
|
||||
auto pts = get_update_pts(update.get());
|
||||
if (pts != 0 && (min_postponed_update_pts_ == 0 || pts < min_postponed_update_pts_)) {
|
||||
min_postponed_update_pts_ = pts;
|
||||
}
|
||||
auto qts = get_update_qts(update.get());
|
||||
if (qts != 0 && (min_postponed_update_qts_ == 0 || qts < min_postponed_update_qts_)) {
|
||||
min_postponed_update_qts_ = qts;
|
||||
}
|
||||
}
|
||||
postponed_updates_.emplace(
|
||||
seq_begin, PendingSeqUpdates(seq_begin, seq_end, date, receive_time, std::move(updates), std::move(promise)));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!need_postpone) {
|
||||
for (auto &update : updates) {
|
||||
if (!is_acceptable_update(update.get())) {
|
||||
CHECK(update != nullptr);
|
||||
|
@ -1639,6 +1626,7 @@ void UpdatesManager::on_pending_updates(vector<tl_object_ptr<telegram_api::Updat
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
size_t ordinary_new_message_count = 0;
|
||||
size_t scheduled_new_message_count = 0;
|
||||
|
@ -1659,7 +1647,9 @@ void UpdatesManager::on_pending_updates(vector<tl_object_ptr<telegram_api::Updat
|
|||
for (auto &update : updates) {
|
||||
LOG(ERROR) << "Update: " << oneline(to_string(update));
|
||||
}
|
||||
if (!running_get_difference_) {
|
||||
schedule_get_difference("on_get_wrong_updates");
|
||||
}
|
||||
return promise.set_value(Unit());
|
||||
}
|
||||
|
||||
|
@ -1697,27 +1687,34 @@ void UpdatesManager::on_pending_updates(vector<tl_object_ptr<telegram_api::Updat
|
|||
on_update(move_tl_object_as<telegram_api::updateEncryption>(update), mpas.get_promise());
|
||||
update = nullptr;
|
||||
}
|
||||
CHECK(!running_get_difference_);
|
||||
CHECK(need_postpone || !running_get_difference_);
|
||||
}
|
||||
}
|
||||
|
||||
for (auto &update : updates) {
|
||||
if (update != nullptr) {
|
||||
if (is_pts_update(update.get()) || is_qts_update(update.get())) {
|
||||
if (is_pts_update(update.get())) {
|
||||
if (running_get_difference_) {
|
||||
auto pts = get_update_pts(update.get());
|
||||
if (pts != 0 && (min_postponed_update_pts_ == 0 || pts < min_postponed_update_pts_)) {
|
||||
min_postponed_update_pts_ = pts;
|
||||
}
|
||||
}
|
||||
downcast_call(*update, OnUpdate(this, update, mpas.get_promise()));
|
||||
update = nullptr;
|
||||
} else if (is_qts_update(update.get())) {
|
||||
if (running_get_difference_) {
|
||||
auto qts = get_update_qts(update.get());
|
||||
if (qts != 0 && (min_postponed_update_qts_ == 0 || qts < min_postponed_update_qts_)) {
|
||||
min_postponed_update_qts_ = qts;
|
||||
}
|
||||
}
|
||||
downcast_call(*update, OnUpdate(this, update, mpas.get_promise()));
|
||||
update = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (running_get_difference_) {
|
||||
LOG(ERROR) << "Postpone " << updates.size() << " updates [" << seq_begin << ", " << seq_end
|
||||
<< "] with date = " << date << " from " << source;
|
||||
postponed_updates_.emplace(
|
||||
seq_begin, PendingSeqUpdates(seq_begin, seq_end, date, receive_time, std::move(updates), mpas.get_promise()));
|
||||
return lock.set_value(Unit());
|
||||
}
|
||||
|
||||
if (seq_begin == 0 && seq_end == 0) {
|
||||
bool have_updates = false;
|
||||
for (auto &update : updates) {
|
||||
|
@ -1727,11 +1724,22 @@ void UpdatesManager::on_pending_updates(vector<tl_object_ptr<telegram_api::Updat
|
|||
}
|
||||
}
|
||||
if (!have_updates) {
|
||||
LOG(INFO) << "All updates was processed";
|
||||
LOG(INFO) << "All updates were processed";
|
||||
return lock.set_value(Unit());
|
||||
}
|
||||
}
|
||||
|
||||
if (need_postpone || running_get_difference_) {
|
||||
LOG(INFO) << "Postpone " << updates.size() << " updates [" << seq_begin << ", " << seq_end
|
||||
<< "] with date = " << date << " from " << source;
|
||||
if (!need_postpone) {
|
||||
LOG(ERROR) << "Run get difference while applying updates from " << source;
|
||||
}
|
||||
postponed_updates_.emplace(
|
||||
seq_begin, PendingSeqUpdates(seq_begin, seq_end, date, receive_time, std::move(updates), mpas.get_promise()));
|
||||
return lock.set_value(Unit());
|
||||
}
|
||||
|
||||
if (seq_begin == 0 || seq_begin == seq_ + 1) {
|
||||
LOG(INFO) << "Process " << updates.size() << " updates [" << seq_begin << ", " << seq_end
|
||||
<< "] with date = " << date << " from " << source;
|
||||
|
@ -1792,11 +1800,9 @@ void UpdatesManager::add_pending_qts_update(tl_object_ptr<telegram_api::Update>
|
|||
return;
|
||||
}
|
||||
|
||||
CHECK(!running_get_difference_);
|
||||
|
||||
if (qts - 1 > old_qts && old_qts > 0) {
|
||||
if (running_get_difference_ || (qts - 1 > old_qts && old_qts > 0)) {
|
||||
LOG(INFO) << "Postpone update with qts = " << qts;
|
||||
if (pending_qts_updates_.empty()) {
|
||||
if (!running_get_difference_ && pending_qts_updates_.empty()) {
|
||||
set_qts_gap_timeout(MAX_UNFILLED_GAP_TIME);
|
||||
}
|
||||
auto &pending_update = pending_qts_updates_[qts];
|
||||
|
@ -1976,9 +1982,6 @@ void UpdatesManager::add_pending_pts_update(tl_object_ptr<telegram_api::Update>
|
|||
|
||||
if (running_get_difference_ || !postponed_pts_updates_.empty()) {
|
||||
LOG(INFO) << "Save pending update got while running getDifference from " << source;
|
||||
if (running_get_difference_) {
|
||||
CHECK(update->get_id() == dummyUpdate::ID || update->get_id() == updateSentMessage::ID);
|
||||
}
|
||||
postpone_pts_update(std::move(update), new_pts, pts_count, receive_time, std::move(promise));
|
||||
return;
|
||||
}
|
||||
|
@ -2360,6 +2363,7 @@ void UpdatesManager::process_pending_qts_updates() {
|
|||
}
|
||||
set_qts_gap_timeout(receive_time + MAX_UNFILLED_GAP_TIME - Time::now());
|
||||
}
|
||||
CHECK(!running_get_difference_);
|
||||
}
|
||||
|
||||
void UpdatesManager::set_pts_gap_timeout(double timeout) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user