mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2024-11-22 09:26:37 +03:00
Better fix for reset_deadline
Follow-up to 876af8f27c
.
The issue was caused because we called end_get_diff to cleanup a diff
that could not actually be started.
This also enables further cleanup later on.
This commit is contained in:
parent
876af8f27c
commit
6f6b207866
|
@ -273,11 +273,7 @@ class MessageBox:
|
||||||
if self.next_deadline == entry:
|
if self.next_deadline == entry:
|
||||||
# If the updated deadline was the closest one, recalculate the new minimum.
|
# If the updated deadline was the closest one, recalculate the new minimum.
|
||||||
# TODO figure out when reset_deadline may be called while self.map is empty
|
# TODO figure out when reset_deadline may be called while self.map is empty
|
||||||
self.next_deadline = min(
|
self.next_deadline = min(self.map.items(), key=lambda entry_state: entry_state[1].deadline)[0]
|
||||||
self.map.items(),
|
|
||||||
key=lambda entry_state: entry_state[1].deadline,
|
|
||||||
default=(None, None)
|
|
||||||
)[0]
|
|
||||||
elif self.next_deadline in self.map and deadline < self.map[self.next_deadline].deadline:
|
elif self.next_deadline in self.map and deadline < self.map[self.next_deadline].deadline:
|
||||||
# If the updated deadline is smaller than the next deadline, change the next deadline to be the new one.
|
# If the updated deadline is smaller than the next deadline, change the next deadline to be the new one.
|
||||||
self.next_deadline = entry
|
self.next_deadline = entry
|
||||||
|
@ -327,10 +323,19 @@ class MessageBox:
|
||||||
if id not in self.map:
|
if id not in self.map:
|
||||||
self.map[id] = State(pts=pts, deadline=next_updates_deadline())
|
self.map[id] = State(pts=pts, deadline=next_updates_deadline())
|
||||||
|
|
||||||
# Begin getting difference for the given entry.
|
# Try to begin getting difference for the given entry.
|
||||||
|
# Fails if the entry does not have a previously-known state that can be used to get its difference.
|
||||||
#
|
#
|
||||||
# Clears any previous gaps.
|
# Clears any previous gaps.
|
||||||
def begin_get_diff(self, entry):
|
def try_begin_get_diff(self, entry):
|
||||||
|
if entry not in self.map:
|
||||||
|
# Won't actually be able to get difference for this entry if we don't have a pts to start off from.
|
||||||
|
if entry in self.possible_gaps:
|
||||||
|
raise RuntimeError('Should not have a possible_gap for an entry not in the state map')
|
||||||
|
|
||||||
|
# TODO it would be useful to log when this happens
|
||||||
|
return
|
||||||
|
|
||||||
self.getting_diff_for.add(entry)
|
self.getting_diff_for.add(entry)
|
||||||
self.possible_gaps.pop(entry, None)
|
self.possible_gaps.pop(entry, None)
|
||||||
|
|
||||||
|
@ -370,7 +375,7 @@ class MessageBox:
|
||||||
date = getattr(updates, 'date', None)
|
date = getattr(updates, 'date', None)
|
||||||
if date is None:
|
if date is None:
|
||||||
# updatesTooLong is the only one with no date (we treat it as a gap)
|
# updatesTooLong is the only one with no date (we treat it as a gap)
|
||||||
self.begin_get_diff(ENTRY_ACCOUNT)
|
self.try_begin_get_diff(ENTRY_ACCOUNT)
|
||||||
raise GapError
|
raise GapError
|
||||||
|
|
||||||
# v1 has never sent updates produced by the client itself to the handlers.
|
# v1 has never sent updates produced by the client itself to the handlers.
|
||||||
|
@ -397,7 +402,7 @@ class MessageBox:
|
||||||
return (users, chats)
|
return (users, chats)
|
||||||
elif self.seq + 1 < seq_start:
|
elif self.seq + 1 < seq_start:
|
||||||
# Gap detected
|
# Gap detected
|
||||||
self.begin_get_diff(ENTRY_ACCOUNT)
|
self.try_begin_get_diff(ENTRY_ACCOUNT)
|
||||||
raise GapError
|
raise GapError
|
||||||
# else apply
|
# else apply
|
||||||
|
|
||||||
|
@ -447,7 +452,7 @@ class MessageBox:
|
||||||
):
|
):
|
||||||
# This update means we need to call getChannelDifference to get the updates from the channel
|
# This update means we need to call getChannelDifference to get the updates from the channel
|
||||||
if isinstance(update, tl.UpdateChannelTooLong):
|
if isinstance(update, tl.UpdateChannelTooLong):
|
||||||
self.begin_get_diff(update.channel_id)
|
self.try_begin_get_diff(update.channel_id)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
pts = PtsInfo.from_update(update)
|
pts = PtsInfo.from_update(update)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user