mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-12 13:52:14 -04:00
Retry to sync out of sync device lists (#7453)
When a call to `user_device_resync` fails, we don't currently mark the remote user's device list as out of sync, nor do we retry to sync it. https://github.com/matrix-org/synapse/pull/6776 introduced some code infrastructure to mark device lists as stale/out of sync. This commit uses that code infrastructure to mark device lists as out of sync if processing an incoming device list update makes the device handler realise that the device list is out of sync, but we can't resync right now. It also adds a looping call to retry all failed resync every 30s. This shouldn't cause too much spam in the logs as this commit also removes the "Failed to handle device list update for..." warning logs when catching `NotRetryingDestination`. Fixes #7418
This commit is contained in:
parent
0bbbd10513
commit
d1ae1015ec
4 changed files with 158 additions and 20 deletions
|
@ -15,7 +15,7 @@
|
|||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
import logging
|
||||
from typing import List, Tuple
|
||||
from typing import List, Optional, Set, Tuple
|
||||
|
||||
from six import iteritems
|
||||
|
||||
|
@ -649,21 +649,31 @@ class DeviceWorkerStore(SQLBaseStore):
|
|||
return results
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def get_user_ids_requiring_device_list_resync(self, user_ids: Collection[str]):
|
||||
def get_user_ids_requiring_device_list_resync(
|
||||
self, user_ids: Optional[Collection[str]] = None,
|
||||
) -> Set[str]:
|
||||
"""Given a list of remote users return the list of users that we
|
||||
should resync the device lists for.
|
||||
should resync the device lists for. If None is given instead of a list,
|
||||
return every user that we should resync the device lists for.
|
||||
|
||||
Returns:
|
||||
Deferred[Set[str]]
|
||||
The IDs of users whose device lists need resync.
|
||||
"""
|
||||
|
||||
rows = yield self.db.simple_select_many_batch(
|
||||
table="device_lists_remote_resync",
|
||||
column="user_id",
|
||||
iterable=user_ids,
|
||||
retcols=("user_id",),
|
||||
desc="get_user_ids_requiring_device_list_resync",
|
||||
)
|
||||
if user_ids:
|
||||
rows = yield self.db.simple_select_many_batch(
|
||||
table="device_lists_remote_resync",
|
||||
column="user_id",
|
||||
iterable=user_ids,
|
||||
retcols=("user_id",),
|
||||
desc="get_user_ids_requiring_device_list_resync_with_iterable",
|
||||
)
|
||||
else:
|
||||
rows = yield self.db.simple_select_list(
|
||||
table="device_lists_remote_resync",
|
||||
keyvalues=None,
|
||||
retcols=("user_id",),
|
||||
desc="get_user_ids_requiring_device_list_resync",
|
||||
)
|
||||
|
||||
return {row["user_id"] for row in rows}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue