summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Morgan <1342360+anoadragon453@users.noreply.github.com>2022-01-24 12:20:01 +0000
committerAndrej Shadura <andrewsh@debian.org>2022-01-24 18:14:51 +0100
commit461bc18a0c4d6fe7859ebeb491fbd31e642997d7 (patch)
treed3d692ebd786c7526be34afbf95dedf057b8cd1e
parent101c571794665efd00bc0c05fc21c085c03485e7 (diff)
Fix logic for dropping old events in fed queue (#11806)
Co-authored-by: Brendan Abolivier <babolivier@matrix.org> Co-authored-by: Richard van der Hoff <richard@matrix.org> Gbp-Pq: Name 0004-Fix-logic-for-dropping-old-events-in-fed-queue-11806.patch
-rw-r--r--changelog.d/11806.bugfix1
-rw-r--r--synapse/storage/databases/main/event_federation.py5
-rw-r--r--tests/storage/test_event_federation.py28
3 files changed, 27 insertions, 7 deletions
diff --git a/changelog.d/11806.bugfix b/changelog.d/11806.bugfix
new file mode 100644
index 00000000..e4beaf10
--- /dev/null
+++ b/changelog.d/11806.bugfix
@@ -0,0 +1 @@
+Fix a bug introduced in Synapse 1.40.0 that caused Synapse to fail to process incoming federation traffic after handling a large amount of events in a v1 room. \ No newline at end of file
diff --git a/synapse/storage/databases/main/event_federation.py b/synapse/storage/databases/main/event_federation.py
index 9580a407..fadef4f0 100644
--- a/synapse/storage/databases/main/event_federation.py
+++ b/synapse/storage/databases/main/event_federation.py
@@ -1423,7 +1423,10 @@ class EventFederationWorkerStore(EventsWorkerStore, SignatureWorkerStore, SQLBas
if room_version.event_format == EventFormatVersions.V1:
for prev_event_tuple in prev_events:
- if not isinstance(prev_event_tuple, list) or len(prev_events) != 2:
+ if (
+ not isinstance(prev_event_tuple, list)
+ or len(prev_event_tuple) != 2
+ ):
logger.info("Invalid prev_events for %s", event_id)
break
diff --git a/tests/storage/test_event_federation.py b/tests/storage/test_event_federation.py
index c3fcf7e7..10cd445f 100644
--- a/tests/storage/test_event_federation.py
+++ b/tests/storage/test_event_federation.py
@@ -12,10 +12,16 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+from typing import Tuple, Union
+
import attr
from parameterized import parameterized
-from synapse.api.room_versions import RoomVersions
+from synapse.api.room_versions import (
+ KNOWN_ROOM_VERSIONS,
+ EventFormatVersions,
+ RoomVersion,
+)
from synapse.events import _EventInternalMetadata
from synapse.util import json_encoder
@@ -506,11 +512,21 @@ class EventFederationWorkerStoreTestCase(tests.unittest.HomeserverTestCase):
)
self.assertSetEqual(difference, set())
- def test_prune_inbound_federation_queue(self):
- "Test that pruning of inbound federation queues work"
+ @parameterized.expand(
+ [(room_version,) for room_version in KNOWN_ROOM_VERSIONS.values()]
+ )
+ def test_prune_inbound_federation_queue(self, room_version: RoomVersion):
+ """Test that pruning of inbound federation queues work"""
room_id = "some_room_id"
+ def prev_event_format(prev_event_id: str) -> Union[Tuple[str, dict], str]:
+ """Account for differences in prev_events format across room versions"""
+ if room_version.event_format == EventFormatVersions.V1:
+ return prev_event_id, {}
+
+ return prev_event_id
+
# Insert a bunch of events that all reference the previous one.
self.get_success(
self.store.db_pool.simple_insert_many(
@@ -522,7 +538,7 @@ class EventFederationWorkerStoreTestCase(tests.unittest.HomeserverTestCase):
"received_ts": 0,
"event_id": f"$fake_event_id_{i + 1}",
"event_json": json_encoder.encode(
- {"prev_events": [f"$fake_event_id_{i}"]}
+ {"prev_events": [prev_event_format(f"$fake_event_id_{i}")]}
),
"internal_metadata": "{}",
}
@@ -535,12 +551,12 @@ class EventFederationWorkerStoreTestCase(tests.unittest.HomeserverTestCase):
# Calling prune once should return True, i.e. a prune happen. The second
# time it shouldn't.
pruned = self.get_success(
- self.store.prune_staged_events_in_room(room_id, RoomVersions.V6)
+ self.store.prune_staged_events_in_room(room_id, room_version)
)
self.assertTrue(pruned)
pruned = self.get_success(
- self.store.prune_staged_events_in_room(room_id, RoomVersions.V6)
+ self.store.prune_staged_events_in_room(room_id, room_version)
)
self.assertFalse(pruned)