element-hq / element-hq/synapse

Synapse gets very confused if the prev_events in a make_join response predate your most recent leave event

Open
#8,036 0 comments 0 reactions 0 assignees View on GitHub
A-Federated-Join A-Workers O-Uncommon S-Major T-Defect z-bug z-p2
Dominant language
Python
Stars
4.6k
Forks
600
Avg merge
5d 22h
Merged PRs (30d)
51

Description

This issue has been migrated from [#8036](https://github.com/matrix-org/synapse/issues/8036).

---

See https://github.com/matrix-org/sytest/issues/918#issuecomment-669613247. Basically, if you leave and rejoin a room too quickly, then the remote server might send you a make_join response whose prev_events predate your leave event, which seems to make synapse explode horribly.

Initially it returns a `404 - Unknown room` (which is bogus in itself), but subsequent attempts to join (even with a prev_events) result in an ISE:

```
2020-08-05 23:52:11,433 - synapse.http.server - 83 - ERROR - POST-18 - Failed handle request via 'ReplicationFederationSendEventsRestServlet':
Traceback (most recent call last):
File "/venv/lib/python3.7/site-packages/twisted/internet/defer.py", line 1416, in _inlineCallbacks
result = result.throwExceptionIntoGenerator(g)
File "/venv/lib/python3.7/site-packages/twisted/python/failure.py", line 512, in throwExceptionIntoGenerator
return g.throw(self.type, self.value, self.tb)
File "/venv/lib/python3.7/site-packages/synapse/replication/http/federation.py", line 123, in _handle_request
event_and_contexts, backfilled
File "/venv/lib/python3.7/site-packages/synapse/handlers/federation.py", line 2923, in persist_events_and_notify
event_and_contexts, backfilled=backfilled
File "/venv/lib/python3.7/site-packages/synapse/storage/persist_events.py", line 226, in persist_events
defer.gatherResults(deferreds, consumeErrors=True)
twisted.internet.defer.FirstError: FirstError[#0, [Failure instance: Traceback: : duplicate key value violates unique constraint "event_edges_event_id_prev_event_id_room_id_is_state_key"
DETAIL: Key (event_id, prev_event_id, room_id, is_state)=($pHb25PrfQJWGje3oKYzsupqEnY8UmNZF89p1l3TmIWc, $O-phXq0q8j-9QO-RSmw3IsEgiicVHWpf9ixzPSJeLQ0, !tBDcWbZxvLvmyNDtSG:localhost:8831, f) already exists.

/venv/lib/python3.7/site-packages/twisted/internet/defer.py:654:_runCallbacks
/venv/lib/python3.7/site-packages/twisted/internet/defer.py:1475:gotResult
/venv/lib/python3.7/site-packages/twisted/internet/defer.py:1416:_inlineCallbacks
/venv/lib/python3.7/site-packages/twisted/python/failure.py:512:throwExceptionIntoGenerator
--- ---
/venv/lib/python3.7/site-packages/synapse/storage/persist_events.py:148:handle_queue_loop
/venv/lib/python3.7/site-packages/synapse/storage/persist_events.py:254:persisting_queue
/venv/lib/python3.7/site-packages/synapse/storage/persist_events.py:430:_persist_events
/venv/lib/python3.7/site-packages/twisted/internet/defer.py:1416:_inlineCallbacks
/venv/lib/python3.7/site-packages/twisted/python/failure.py:512:throwExceptionIntoGenerator
/venv/lib/python3.7/site-packages/synapse/storage/data_stores/main/events.py:216:_persist_events_and_state_updates
/venv/lib/python3.7/site-packages/twisted/internet/defer.py:1416:_inlineCallbacks
/venv/lib/python3.7/site-packages/twisted/python/failure.py:512:throwExceptionIntoGenerator
/venv/lib/python3.7/site-packages/synapse/storage/database.py:527:runInteraction
/venv/lib/python3.7/site-packages/twisted/internet/defer.py:1416:_inlineCallbacks
/venv/lib/python3.7/site-packages/twisted/python/failure.py:512:throwExceptionIntoGenerator
/venv/lib/python3.7/site-packages/synapse/storage/database.py:575:runWithConnection
/venv/lib/python3.7/site-packages/twisted/python/threadpool.py:250:inContext
/venv/lib/python3.7/site-packages/twisted/python/threadpool.py:266:
/venv/lib/python3.7/site-packages/twisted/python/context.py:122:callWithContext
/venv/lib/python3.7/site-packages/twisted/python/context.py:85:callWithContext
/venv/lib/python3.7/site-packages/twisted/enterprise/adbapi.py:306:_runWithConnection
/venv/lib/python3.7/site-packages/twisted/python/compat.py:464:reraise
/venv/lib/python3.7/site-packages/twisted/enterprise/adbapi.py:297:_runWithConnection
/venv/lib/python3.7/site-packages/synapse/storage/database.py:572:inner_func
/venv/lib/python3.7/site-packages/synapse/storage/database.py:416:new_transaction
/venv/lib/python3.7/site-packages/synapse/logging/utils.py:71:wrapped
/venv/lib/python3.7/site-packages/synapse/storage/data_stores/main/events.py:452:_persist_events_txn
/venv/lib/python3.7/site-packages/synapse/storage/data_stores/main/events.py:948:_update_metadata_tables_txn
/venv/lib/python3.7/site-packages/synapse/storage/data_stores/main/events.py:1468:_handle_mult_prev_events
/venv/lib/python3.7/site-packages/synapse/storage/database.py:685:simple_insert_many_txn
/venv/lib/python3.7/site-packages/synapse/storage/database.py:211:executemany
/venv/lib/python3.7/site-packages/synapse/storage/database.py:234:_do_execute
]]
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.