summary refs log tree commit diff
path: root/synapse
diff options
context:
space:
mode:
Diffstat (limited to 'synapse')
-rw-r--r--synapse/storage/_base.py2
-rw-r--r--synapse/storage/events.py13
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