From f8926d07df2654cea7970c16145dcc0f041e6fa2 Mon Sep 17 00:00:00 2001 From: Eric Eastwood Date: Thu, 22 Aug 2024 19:06:04 -0500 Subject: [PATCH] Fix partial-stated room re-syncing state but nothing has changed Fixes failing test in CI: `tests.handlers.test_federation.PartialJoinTestCase.test_failed_partial_join_is_clean` ``` 2024-08-22 18:57:22-0500 [-] synapse.metrics.background_process_metrics - 253 - ERROR - sync_partial_state_room-0 - Background process 'sync_partial_state_room' threw an exception Traceback (most recent call last): File "synapse/synapse/metrics/background_process_metrics.py", line 251, in run return await func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "synapse/synapse/handlers/federation.py", line 1842, in _sync_partial_state_room_wrapper await self._sync_partial_state_room( File "synapse/synapse/handlers/federation.py", line 1933, in _sync_partial_state_room await self.state_handler.update_current_state(room_id) File "synapse/synapse/state/__init__.py", line 554, in update_current_state await self._storage_controllers.persistence.update_current_state(room_id) File "synapse/synapse/storage/controllers/persist_events.py", line 491, in update_current_state await self._event_persist_queue.add_to_queue( File "synapse/synapse/storage/controllers/persist_events.py", line 245, in add_to_queue res = await make_deferred_yieldable(end_item.deferred.observe()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "synapse/synapse/storage/controllers/persist_events.py", line 288, in handle_queue_loop ret = await self._per_item_callback(room_id, item.task) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "synapse/synapse/storage/controllers/persist_events.py", line 370, in _process_event_persist_queue_task await self._update_current_state(room_id, task) File "synapse/synapse/storage/controllers/persist_events.py", line 507, in _update_current_state await self.persist_events_store._calculate_sliding_sync_table_changes( File "synapse/synapse/storage/databases/main/events.py", line 624, in _calculate_sliding_sync_table_changes assert most_recent_event_pos_results, ( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AssertionError: We should not be seeing `None` here because we are still in the room (!room:example.com) and it should at-least have a join membership event that's keeping us here. ``` --- synapse/storage/databases/main/events.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/synapse/storage/databases/main/events.py b/synapse/storage/databases/main/events.py index 3b2a6783c0..c4188b087d 100644 --- a/synapse/storage/databases/main/events.py +++ b/synapse/storage/databases/main/events.py @@ -178,7 +178,7 @@ class SlidingSyncTableChanges: # correct latest value. # # This should be *some* value that points to a real event in the room if we are - # still joined to the room. + # still joined to the room and some state is changing (`to_insert` or `to_delete`). joined_room_best_effort_most_recent_stream_ordering: Optional[int] # Values to upsert into `sliding_sync_joined_rooms` joined_room_updates: SlidingSyncStateInsertValues @@ -394,6 +394,18 @@ class PersistEventsStore: to_insert = delta_state.to_insert to_delete = delta_state.to_delete + # If no state is changing, we don't need to do anything. This can happen when a + # partial-stated room is re-syncing the current state. + if not to_insert and not to_delete: + return SlidingSyncTableChanges( + room_id=room_id, + joined_room_best_effort_most_recent_stream_ordering=None, + joined_room_updates={}, + membership_snapshot_shared_insert_values={}, + to_insert_membership_snapshots=[], + to_delete_membership_snapshots=[], + ) + event_map = {event.event_id: event for event, _ in events_and_contexts} # Handle gathering info for the `sliding_sync_membership_snapshots` table