summary refs log tree commit diff
path: root/synapse/storage
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2014-09-08 22:36:51 +0100
committerErik Johnston <erik@matrix.org>2014-09-08 22:37:19 +0100
commite062f2dfa89eca20d409642b61bb240accb51bf1 (patch)
tree548895af67a5abd733c3ea41e82704086050268f /synapse/storage
parentAdded demo.details (diff)
downloadsynapse-e062f2dfa89eca20d409642b61bb240accb51bf1.tar.xz
Apparently we can't do txn.rollback(), so raise and catch an exception instead.
Diffstat (limited to 'synapse/storage')
-rw-r--r--synapse/storage/__init__.py30
1 files changed, 19 insertions, 11 deletions
diff --git a/synapse/storage/__init__.py b/synapse/storage/__init__.py

index 8ed80109a5..a2eec3b209 100644 --- a/synapse/storage/__init__.py +++ b/synapse/storage/__init__.py
@@ -47,6 +47,11 @@ import os logger = logging.getLogger(__name__) +class _RollbackButIsFineException(Exception): + """ This exception is used to rollback a transaction without implying + something went wrong. + """ + pass class DataStore(RoomMemberStore, RoomStore, RegistrationStore, StreamStore, ProfileStore, FeedbackStore, @@ -71,13 +76,16 @@ class DataStore(RoomMemberStore, RoomStore, self.min_token -= 1 stream_ordering = self.min_token - latest = yield self._db_pool.runInteraction( - self._persist_pdu_event_txn, - pdu=pdu, - event=event, - backfilled=backfilled, - stream_ordering=stream_ordering, - ) + try: + latest = yield self._db_pool.runInteraction( + self._persist_pdu_event_txn, + pdu=pdu, + event=event, + backfilled=backfilled, + stream_ordering=stream_ordering, + ) + except _RollbackButIsFineException as e: + pass defer.returnValue(latest) @defer.inlineCallbacks @@ -175,12 +183,12 @@ class DataStore(RoomMemberStore, RoomStore, try: self._simple_insert_txn(txn, "events", vals) except: - logger.exception( + logger.warn( "Failed to persist, probably duplicate: %s", - event.event_id + event.event_id, + exc_info=True, ) - txn.rollback() - return + raise _RollbackButIsFineException("_persist_event") if not backfilled and hasattr(event, "state_key"): vals = {