summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--docs/admin_api/rooms.md12
-rw-r--r--synapse/rest/admin/__init__.py2
-rw-r--r--synapse/rest/admin/rooms.py2
-rw-r--r--synapse/storage/databases/main/__init__.py2
-rw-r--r--synapse/storage/databases/main/events_forward_extremities.py64
5 files changed, 46 insertions, 36 deletions
diff --git a/docs/admin_api/rooms.md b/docs/admin_api/rooms.md
index 1d59bb5c4b..86daa393a7 100644
--- a/docs/admin_api/rooms.md
+++ b/docs/admin_api/rooms.md
@@ -516,11 +516,8 @@ optionally be specified, e.g.:
 # Forward Extremities Admin API
 
 Enables querying and deleting forward extremities from rooms. When a lot of forward
-extremities accumulate in a room, performance can become degraded.
-
-When using this API endpoint to delete any extra forward extremities for a room, 
-the server does not need to be restarted as the relevant caches will be cleared 
-in the API call.
+extremities accumulate in a room, performance can become degraded. For details, see 
+[#1760](https://github.com/matrix-org/synapse/issues/1760).
 
 ## Check for forward extremities
 
@@ -537,7 +534,7 @@ A response as follows will be returned:
   "count": 1,
   "results": [
     {
-      "event_id": "$M5SP266vsnxctfwFgFLNceaCo3ujhRtg_NiiHabcdfgh",
+      "event_id": "$M5SP266vsnxctfwFgFLNceaCo3ujhRtg_NiiHabcdefgh",
       "state_group": 439
     }
   ]
@@ -561,6 +558,3 @@ that were deleted.
   "deleted": 1
 }
 ```
-
-The cache `get_latest_event_ids_in_room` will be invalidated, if any forward extremities
-were deleted.
diff --git a/synapse/rest/admin/__init__.py b/synapse/rest/admin/__init__.py
index b80b036090..319ad7bf7f 100644
--- a/synapse/rest/admin/__init__.py
+++ b/synapse/rest/admin/__init__.py
@@ -1,6 +1,8 @@
 # -*- coding: utf-8 -*-
 # Copyright 2014-2016 OpenMarket Ltd
 # Copyright 2018-2019 New Vector Ltd
+# Copyright 2020, 2021 The Matrix.org Foundation C.I.C.
+
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/synapse/rest/admin/rooms.py b/synapse/rest/admin/rooms.py
index 6757a8100b..da1499cab3 100644
--- a/synapse/rest/admin/rooms.py
+++ b/synapse/rest/admin/rooms.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Copyright 2019 The Matrix.org Foundation C.I.C.
+# Copyright 2019-2021 The Matrix.org Foundation C.I.C.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/synapse/storage/databases/main/__init__.py b/synapse/storage/databases/main/__init__.py
index 93b25af057..b936f54f1e 100644
--- a/synapse/storage/databases/main/__init__.py
+++ b/synapse/storage/databases/main/__init__.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # Copyright 2014-2016 OpenMarket Ltd
 # Copyright 2018 New Vector Ltd
-# Copyright 2019 The Matrix.org Foundation C.I.C.
+# Copyright 2019-2021 The Matrix.org Foundation C.I.C.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/synapse/storage/databases/main/events_forward_extremities.py b/synapse/storage/databases/main/events_forward_extremities.py
index 83f751cf5b..e6c2d6e122 100644
--- a/synapse/storage/databases/main/events_forward_extremities.py
+++ b/synapse/storage/databases/main/events_forward_extremities.py
@@ -1,3 +1,18 @@
+# -*- coding: utf-8 -*-
+# Copyright 2021 The Matrix.org Foundation C.I.C.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 import logging
 from typing import Dict, List
 
@@ -19,19 +34,19 @@ class EventForwardExtremitiesStore(SQLBaseStore):
 
         def delete_forward_extremities_for_room_txn(txn):
             # First we need to get the event_id to not delete
-            sql = (
-                "SELECT "
-                "   last_value(event_id) OVER w AS event_id"
-                "   FROM event_forward_extremities"
-                "   NATURAL JOIN events"
-                " where room_id = ?"
-                "   WINDOW w AS ("
-                "   PARTITION BY room_id"
-                "       ORDER BY stream_ordering"
-                "       range between unbounded preceding and unbounded following"
-                "   )"
-                "   ORDER BY stream_ordering"
-            )
+            sql = """
+                SELECT
+                    last_value(event_id) OVER w AS event_id
+                FROM event_forward_extremities
+                    NATURAL JOIN events
+                WHERE room_id = ?
+                    WINDOW w AS (
+                        PARTITION BY room_id
+                        ORDER BY stream_ordering 
+                        range between unbounded preceding and unbounded following
+                    )
+                ORDER BY stream_ordering
+            """
             txn.execute(sql, (room_id,))
             rows = txn.fetchall()
             try:
@@ -47,12 +62,10 @@ class EventForwardExtremitiesStore(SQLBaseStore):
                 raise SynapseError(400, msg)
 
             # Now delete the extra forward extremities
-            sql = (
-                "DELETE FROM event_forward_extremities "
-                "WHERE"
-                "   event_id != ?"
-                "   AND room_id = ?"
-            )
+            sql = """
+                DELETE FROM event_forward_extremities
+                WHERE event_id != ? AND room_id = ?
+            """
 
             txn.execute(sql, (event_id, room_id))
             logger.info(
@@ -78,14 +91,15 @@ class EventForwardExtremitiesStore(SQLBaseStore):
         """Get list of forward extremities for a room."""
 
         def get_forward_extremities_for_room_txn(txn):
-            sql = (
-                "SELECT event_id, state_group FROM event_forward_extremities NATURAL JOIN event_to_state_groups "
-                "WHERE room_id = ?"
-            )
+            sql = """
+                SELECT event_id, state_group 
+                FROM event_forward_extremities 
+                NATURAL JOIN event_to_state_groups
+                WHERE room_id = ?
+            """
 
             txn.execute(sql, (room_id,))
-            rows = txn.fetchall()
-            return [{"event_id": row[0], "state_group": row[1]} for row in rows]
+            return self.db_pool.cursor_to_dict(txn)
 
         return await self.db_pool.runInteraction(
             "get_forward_extremities_for_room", get_forward_extremities_for_room_txn,