Apparently we can't do txn.rollback(), so raise and catch an exception instead.

This commit is contained in:
Erik Johnston 2014-09-08 22:36:51 +01:00
parent c1a25756c2
commit e062f2dfa8

View File

@ -47,6 +47,11 @@ import os
logger = logging.getLogger(__name__) 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, class DataStore(RoomMemberStore, RoomStore,
RegistrationStore, StreamStore, ProfileStore, FeedbackStore, RegistrationStore, StreamStore, ProfileStore, FeedbackStore,
@ -71,6 +76,7 @@ class DataStore(RoomMemberStore, RoomStore,
self.min_token -= 1 self.min_token -= 1
stream_ordering = self.min_token stream_ordering = self.min_token
try:
latest = yield self._db_pool.runInteraction( latest = yield self._db_pool.runInteraction(
self._persist_pdu_event_txn, self._persist_pdu_event_txn,
pdu=pdu, pdu=pdu,
@ -78,6 +84,8 @@ class DataStore(RoomMemberStore, RoomStore,
backfilled=backfilled, backfilled=backfilled,
stream_ordering=stream_ordering, stream_ordering=stream_ordering,
) )
except _RollbackButIsFineException as e:
pass
defer.returnValue(latest) defer.returnValue(latest)
@defer.inlineCallbacks @defer.inlineCallbacks
@ -175,12 +183,12 @@ class DataStore(RoomMemberStore, RoomStore,
try: try:
self._simple_insert_txn(txn, "events", vals) self._simple_insert_txn(txn, "events", vals)
except: except:
logger.exception( logger.warn(
"Failed to persist, probably duplicate: %s", "Failed to persist, probably duplicate: %s",
event.event_id event.event_id,
exc_info=True,
) )
txn.rollback() raise _RollbackButIsFineException("_persist_event")
return
if not backfilled and hasattr(event, "state_key"): if not backfilled and hasattr(event, "state_key"):
vals = { vals = {