diff options
author | Erik Johnston <erik@matrix.org> | 2014-08-15 11:47:01 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2014-08-15 11:47:01 +0100 |
commit | c5f2da587532c80cda066acc715344b74a9d19d5 (patch) | |
tree | ce72c1d93bc829907fb726b15f6d8ef9ae74c1a1 | |
parent | Fix pontenial bug in state resolution handler that compared dicts rather than... (diff) | |
download | synapse-c5f2da587532c80cda066acc715344b74a9d19d5.tar.xz |
Add a check to make sure that during state conflict res we only request a PDU we don't have.
-rw-r--r-- | synapse/state.py | 12 | ||||
-rw-r--r-- | tests/test_state.py | 3 |
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) |