diff options
author | Olivier Wilkinson (reivilibre) <olivier@librepush.net> | 2019-08-12 16:21:35 +0100 |
---|---|---|
committer | Olivier Wilkinson (reivilibre) <olivier@librepush.net> | 2019-08-12 16:21:35 +0100 |
commit | 314567d62d344492d867ea6587e3e7ad5470930d (patch) | |
tree | 8402769cc50b52b98b5996425eaf234bbd3996dd | |
parent | Move back to `defer.inlineCallbacks` from `async` as it makes stats (diff) | |
download | synapse-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.py | 87 |
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 |