summary refs log tree commit diff
diff options
context:
space:
mode:
authorOlivier Wilkinson (reivilibre) <olivier@librepush.net>2019-08-12 16:21:35 +0100
committerOlivier Wilkinson (reivilibre) <olivier@librepush.net>2019-08-12 16:21:35 +0100
commit314567d62d344492d867ea6587e3e7ad5470930d (patch)
tree8402769cc50b52b98b5996425eaf234bbd3996dd
parentMove back to `defer.inlineCallbacks` from `async` as it makes stats (diff)
downloadsynapse-314567d62d344492d867ea6587e3e7ad5470930d.tar.xz
Split out partial indices from theschema delta, thus supporting SQLite.
Signed-off-by: Olivier Wilkinson (reivilibre) <olivier@librepush.net>
-rw-r--r--synapse/storage/schema/delta/56/stats_separated1.sql (renamed from synapse/storage/schema/delta/56/stats_separated.sql)6
-rw-r--r--synapse/storage/schema/delta/56/stats_separated2.py87
2 files changed, 89 insertions, 4 deletions
diff --git a/synapse/storage/schema/delta/56/stats_separated.sql b/synapse/storage/schema/delta/56/stats_separated1.sql
index 0e80c9f967..26606b2b60 100644
--- a/synapse/storage/schema/delta/56/stats_separated.sql
+++ b/synapse/storage/schema/delta/56/stats_separated1.sql
@@ -90,12 +90,10 @@ CREATE TABLE IF NOT EXISTS room_stats_current (
 -- TODO check: make it easier to find dirty rows
 -- TODO check we specify 'AND start_ts IS NOT NULL' in old collector, to take
 -- advantage of optimisations.
-CREATE INDEX IF NOT EXISTS room_stats_current_dirty ON room_stats_current (start_ts)
-    WHERE start_ts IS NOT NULL;
+
 
 -- TODO check: make it easier to find incomplete rows
-CREATE INDEX IF NOT EXISTS room_stats_not_complete ON room_stats_current (room_id)
-    WHERE completed_delta_stream_id IS NULL;
+
 
 -- represents HISTORICAL room statistics for a room
 CREATE TABLE IF NOT EXISTS room_stats_historical (
diff --git a/synapse/storage/schema/delta/56/stats_separated2.py b/synapse/storage/schema/delta/56/stats_separated2.py
new file mode 100644
index 0000000000..b92984a8cf
--- /dev/null
+++ b/synapse/storage/schema/delta/56/stats_separated2.py
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+# Copyright 2019 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.
+
+# This schema delta will be run after 'stats_separated1.sql' due to lexicographic
+# ordering. Note that it MUST be so.
+from synapse.storage.engines import Sqlite3Engine, PostgresEngine
+
+
+def _run_create_generic(stats_type, cursor, database_engine):
+    """
+    Creates the pertinent (partial, if supported) indices for one kind of stats.
+    Args:
+        stats_type: "room" or "user" – the type of stats
+        cursor: Database Cursor
+        database_engine: Database Engine
+    """
+    if isinstance(database_engine, Sqlite3Engine):
+        # even though SQLite >= 3.8 can support partial indices, we won't enable
+        # them, in case the SQLite database may be later used on another system.
+        # It's also the case that SQLite is only likely to be used in small
+        # deployments or testing, where the optimisations gained by use of a
+        # partial index are not a big concern.
+        cursor.execute(
+            """
+                CREATE INDEX IF NOT EXISTS %s_stats_current_dirty
+                    ON %s_stats_current (end_ts);
+            """
+            % (stats_type, stats_type)
+        )
+        cursor.execute(
+            """
+                CREATE INDEX IF NOT EXISTS %s_stats_not_complete
+                    ON %s_stats_current (completed_delta_stream_id, room_id);
+            """
+            % (stats_type, stats_type)
+        )
+    elif isinstance(database_engine, PostgresEngine):
+        # This partial index helps us with finding dirty stats rows
+        cursor.execute(
+            """
+                CREATE INDEX IF NOT EXISTS %s_stats_current_dirty
+                    ON %s_stats_current (end_ts)
+                    WHERE end_ts IS NOT NULL;
+            """
+            % (stats_type, stats_type)
+        )
+        # This partial index helps us with old collection
+        cursor.execute(
+            """
+                CREATE INDEX IF NOT EXISTS %s_stats_not_complete
+                    ON %s_stats_current (room_id)
+                    WHERE completed_delta_stream_id IS NULL;
+            """
+            % (stats_type, stats_type)
+        )
+    else:
+        raise NotImplementedError("Unknown database engine.")
+
+
+def run_create(cursor, database_engine):
+    """
+    This function is called as part of the schema delta.
+    It will create indices – partial, if supported – for the new 'separated'
+    room & user statistics.
+    """
+    _run_create_generic("room", cursor, database_engine)
+    _run_create_generic("user", cursor, database_engine)
+
+
+def run_upgrade(cur, database_engine, config):
+    """
+    This function is run on a database upgrade (of a non-empty database).
+    We have no need to do anything specific here.
+    """
+    pass