Add a check to make sure that during state conflict res we only request a PDU we don't have.
2 files changed, 13 insertions, 2 deletions
diff --git a/synapse/state.py b/synapse/state.py
index d8977b61ea..4f8b4d9760 100644
--- a/synapse/state.py
+++ b/synapse/state.py
@@ -191,10 +191,18 @@ class StateHandler(object):
key=lambda x: x.depth
)
+ pdu_id = missing_prev.prev_state_id
+ origin = missing_prev.prev_state_origin
+
+ is_missing = yield self.store.get_pdu(pdu_id, origin) is None
+
+ if not is_missing:
+ raise Exception("Conflict resolution failed.")
+
yield self._replication.get_pdu(
destination=missing_prev.origin,
- pdu_origin=missing_prev.prev_state_origin,
- pdu_id=missing_prev.prev_state_id,
+ pdu_origin=origin,
+ pdu_id=pdu_id,
outlier=True
)
diff --git a/tests/test_state.py b/tests/test_state.py
index a2908a2eac..aaf873a856 100644
--- a/tests/test_state.py
+++ b/tests/test_state.py
@@ -37,6 +37,7 @@ class StateTestCase(unittest.TestCase):
"update_current_state",
"get_latest_pdus_in_context",
"get_current_state",
+ "get_pdu",
])
self.replication = Mock(spec=["get_pdu"])
@@ -220,6 +221,8 @@ class StateTestCase(unittest.TestCase):
self.replication.get_pdu.side_effect = set_return_tree
+ self.persistence.get_pdu.return_value = None
+
is_new = yield self.state.handle_new_state(new_pdu)
self.assertTrue(is_new)
|