diff options
author | Erik Johnston <erik@matrix.org> | 2015-04-29 19:15:23 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2015-04-29 19:15:23 +0100 |
commit | d2d61a82881da58a024f20d7c0db28300aa628dc (patch) | |
tree | e1023bb690c9a985691fe86299f7a7ad3454197e /synapse/storage/util | |
parent | Also log when we've started pushers (diff) | |
download | synapse-d2d61a82881da58a024f20d7c0db28300aa628dc.tar.xz |
Fix deadlock in id_generators. No idea why this was an actual deadlock.
Diffstat (limited to 'synapse/storage/util')
-rw-r--r-- | synapse/storage/util/id_generators.py | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/synapse/storage/util/id_generators.py b/synapse/storage/util/id_generators.py index 9d461d5e96..54aeff2b43 100644 --- a/synapse/storage/util/id_generators.py +++ b/synapse/storage/util/id_generators.py @@ -86,10 +86,10 @@ class StreamIdGenerator(object): with stream_id_gen.get_next_txn(txn) as stream_id: # ... persist event ... """ - with self._lock: - if not self._current_max: - self._compute_current_max(txn) + if not self._current_max: + self._compute_current_max(txn) + with self._lock: self._current_max += 1 next_id = self._current_max @@ -110,22 +110,24 @@ class StreamIdGenerator(object): """Returns the maximum stream id such that all stream ids less than or equal to it have been successfully persisted. """ + if not self._current_max: + yield store.runInteraction( + "_compute_current_max", + self._get_or_compute_current_max, + ) + with self._lock: if self._unfinished_ids: defer.returnValue(self._unfinished_ids[0] - 1) - if not self._current_max: - yield store.runInteraction( - "_compute_current_max", - self._compute_current_max, - ) - defer.returnValue(self._current_max) - def _compute_current_max(self, txn): - txn.execute("SELECT MAX(stream_ordering) FROM events") - val, = txn.fetchone() + def _get_or_compute_current_max(self, txn): + with self._lock: + txn.execute("SELECT MAX(stream_ordering) FROM events") + rows = txn.fetchall() + val, = rows[0] - self._current_max = int(val) if val else 1 + self._current_max = int(val) if val else 1 - return self._current_max + return self._current_max |