summary refs log tree commit diff
path: root/synapse/storage
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2015-05-13 14:39:05 +0100
committerErik Johnston <erik@matrix.org>2015-05-13 14:39:05 +0100
commit6edff11a888d2c3f7a6749599fcb9d4974a76bbb (patch)
tree9277bb0a290e9c23b659eb3c2c99d667bc66dce5 /synapse/storage
parentTemp turn off checking for rejections and redactions (diff)
downloadsynapse-6edff11a888d2c3f7a6749599fcb9d4974a76bbb.tar.xz
Don't fetch redaction and rejection stuff for each event, so we can use index only scan
Diffstat (limited to '')
-rw-r--r--synapse/storage/_base.py23
-rw-r--r--synapse/storage/state.py7
2 files changed, 24 insertions, 6 deletions
diff --git a/synapse/storage/_base.py b/synapse/storage/_base.py
index 0279400a83..a6fc4d6ea4 100644
--- a/synapse/storage/_base.py
+++ b/synapse/storage/_base.py
@@ -918,10 +918,10 @@ class SQLBaseStore(object):
             start_time = update_counter("event_cache", start_time)
 
         sql = (
-            "SELECT e.internal_metadata, e.json, r.event_id, rej.reason "
+            "SELECT e.internal_metadata, e.json, r.redacts, rej.event_id "
             "FROM event_json as e "
+            "LEFT JOIN rejections as rej USING (event_id) "
             "LEFT JOIN redactions as r ON e.event_id = r.redacts "
-            "LEFT JOIN rejections as rej on rej.event_id = e.event_id  "
             "WHERE e.event_id = ? "
             "LIMIT 1 "
         )
@@ -967,6 +967,14 @@ class SQLBaseStore(object):
         internal_metadata = json.loads(internal_metadata)
         start_time = update_counter("decode_internal", start_time)
 
+        if rejected_reason:
+            rejected_reason = self._simple_select_one_onecol_txn(
+                txn,
+                table="rejections",
+                keyvalues={"event_id": rejected_reason},
+                retcol="reason",
+            )
+
         ev = FrozenEvent(
             d,
             internal_metadata_dict=internal_metadata,
@@ -977,12 +985,19 @@ class SQLBaseStore(object):
         if check_redacted and redacted:
             ev = prune_event(ev)
 
-            ev.unsigned["redacted_by"] = redacted
+            redaction_id = self._simple_select_one_onecol_txn(
+                txn,
+                table="redactions",
+                keyvalues={"redacts": ev.event_id},
+                retcol="event_id",
+            )
+
+            ev.unsigned["redacted_by"] = redaction_id
             # Get the redaction event.
 
             because = self._get_event_txn(
                 txn,
-                redacted,
+                redaction_id,
                 check_redacted=False
             )
 
diff --git a/synapse/storage/state.py b/synapse/storage/state.py
index 6d7d576cb6..6d0ecf8dd9 100644
--- a/synapse/storage/state.py
+++ b/synapse/storage/state.py
@@ -85,8 +85,10 @@ class StateStore(SQLBaseStore):
 
         def fetch_events(txn, events):
             sql = (
-                "SELECT e.internal_metadata, e.json "
+                "SELECT e.internal_metadata, e.json, r.redacts, rej.event_id "
                 " FROM event_json as e"
+                " LEFT JOIN rejections as rej USING (event_id)"
+                " LEFT JOIN redactions as r ON e.event_id = r.redacts"
                 " WHERE e.event_id IN (%s)"
             ) % (",".join(["?"]*len(events)),)
 
@@ -95,7 +97,8 @@ class StateStore(SQLBaseStore):
 
             return [
                 self._get_event_from_row_txn(
-                    txn, row[0], row[1], None
+                    txn, row[0], row[1], row[2],
+                    rejected_reason=row[3],
                 )
                 for row in rows
             ]