Add a wait
2 files changed, 12 insertions, 3 deletions
diff --git a/synapse/storage/_base.py b/synapse/storage/_base.py
index 0df1b46edc..5d86aa5cd4 100644
--- a/synapse/storage/_base.py
+++ b/synapse/storage/_base.py
@@ -301,7 +301,7 @@ class SQLBaseStore(object):
self._get_event_cache = Cache("*getEvent*", keylen=3, lru=True,
max_entries=hs.config.event_cache_size)
- self._event_fetch_lock = threading.Lock()
+ self._event_fetch_lock = threading.Condition()
self._event_fetch_list = []
self._event_fetch_ongoing = 0
diff --git a/synapse/storage/events.py b/synapse/storage/events.py
index 2c3e6d5a5c..f694b877f4 100644
--- a/synapse/storage/events.py
+++ b/synapse/storage/events.py
@@ -502,6 +502,7 @@ class EventsStore(SQLBaseStore):
def _do_fetch(self, conn):
event_list = []
+ i = 0
while True:
try:
logger.debug("do_fetch getting lock")
@@ -510,8 +511,14 @@ class EventsStore(SQLBaseStore):
event_list = self._event_fetch_list
self._event_fetch_list = []
if not event_list:
- self._event_fetch_ongoing -= 1
- return
+ if self.database_engine.single_threaded or i > 5:
+ self._event_fetch_ongoing -= 1
+ return
+ else:
+ self._event_fetch_lock.wait(0.1)
+ i += 1
+ continue
+ i = 0
event_id_lists = zip(*event_list)[0]
event_ids = [
@@ -566,6 +573,8 @@ class EventsStore(SQLBaseStore):
(events, events_d)
)
+ self._event_fetch_lock.notify_all()
+
if self._event_fetch_ongoing < 1:
self._event_fetch_ongoing += 1
should_start = True
|