Clear the resync bit after resyncing device lists (#9867)

Fixes #9866.
This commit is contained in:
Richard van der Hoff 2021-04-22 16:53:24 +01:00 committed by GitHub
parent 294c675033
commit 69018acbd2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 10 deletions

1
changelog.d/9867.bugfix Normal file
View File

@ -0,0 +1 @@
Fix a bug which could cause Synapse to get stuck in a loop of resyncing device lists.

View File

@ -925,6 +925,10 @@ class DeviceListUpdater:
else: else:
cached_devices = await self.store.get_cached_devices_for_user(user_id) cached_devices = await self.store.get_cached_devices_for_user(user_id)
if cached_devices == {d["device_id"]: d for d in devices}: if cached_devices == {d["device_id"]: d for d in devices}:
logging.info(
"Skipping device list resync for %s, as our cache matches already",
user_id,
)
devices = [] devices = []
ignore_devices = True ignore_devices = True
@ -940,6 +944,9 @@ class DeviceListUpdater:
await self.store.update_remote_device_list_cache( await self.store.update_remote_device_list_cache(
user_id, devices, stream_id user_id, devices, stream_id
) )
# mark the cache as valid, whether or not we actually processed any device
# list updates.
await self.store.mark_remote_user_device_cache_as_valid(user_id)
device_ids = [device["device_id"] for device in devices] device_ids = [device["device_id"] for device in devices]
# Handle cross-signing keys. # Handle cross-signing keys.

View File

@ -717,7 +717,15 @@ class DeviceWorkerStore(SQLBaseStore):
keyvalues={"user_id": user_id}, keyvalues={"user_id": user_id},
values={}, values={},
insertion_values={"added_ts": self._clock.time_msec()}, insertion_values={"added_ts": self._clock.time_msec()},
desc="make_remote_user_device_cache_as_stale", desc="mark_remote_user_device_cache_as_stale",
)
async def mark_remote_user_device_cache_as_valid(self, user_id: str) -> None:
# Remove the database entry that says we need to resync devices, after a resync
await self.db_pool.simple_delete(
table="device_lists_remote_resync",
keyvalues={"user_id": user_id},
desc="mark_remote_user_device_cache_as_valid",
) )
async def mark_remote_user_device_list_as_unsubscribed(self, user_id: str) -> None: async def mark_remote_user_device_list_as_unsubscribed(self, user_id: str) -> None:
@ -1289,15 +1297,6 @@ class DeviceStore(DeviceWorkerStore, DeviceBackgroundUpdateStore):
lock=False, lock=False,
) )
# If we're replacing the remote user's device list cache presumably
# we've done a full resync, so we remove the entry that says we need
# to resync
self.db_pool.simple_delete_txn(
txn,
table="device_lists_remote_resync",
keyvalues={"user_id": user_id},
)
async def add_device_change_to_streams( async def add_device_change_to_streams(
self, user_id: str, device_ids: Collection[str], hosts: List[str] self, user_id: str, device_ids: Collection[str], hosts: List[str]
): ):