mirror of
https://github.com/element-hq/synapse
synced 2024-08-31 10:30:20 +00:00
Add indices. Remove room_ids accidentally added
We have to do this by re-inserting a background update and recreating tables, as the tables only get created during a background update and will later be deleted. We also make sure that we remove any entries that should have been removed but weren't due to a race that has been fixed in a previous commit.
This commit is contained in:
parent
5ac75fc9a2
commit
5037326d66
2 changed files with 56 additions and 13 deletions
28
synapse/storage/schema/delta/54/stats2.sql
Normal file
28
synapse/storage/schema/delta/54/stats2.sql
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/* 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 delta file gets run after `54/stats.sql` delta.
|
||||||
|
|
||||||
|
-- We want to add some indices to the temporary stats table, so we re-insert
|
||||||
|
-- 'populate_stats_createtables' if we are still processing the rooms update.
|
||||||
|
INSERT INTO background_updates (update_name, progress_json)
|
||||||
|
SELECT 'populate_stats_createtables', '{}'
|
||||||
|
WHERE
|
||||||
|
'populate_stats_process_rooms' IN (
|
||||||
|
SELECT update_name FROM background_updates
|
||||||
|
)
|
||||||
|
AND 'populate_stats_createtables' NOT IN ( -- don't insert if already exists
|
||||||
|
SELECT update_name FROM background_updates
|
||||||
|
);
|
|
@ -18,6 +18,7 @@ import logging
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
from synapse.api.constants import EventTypes, Membership
|
from synapse.api.constants import EventTypes, Membership
|
||||||
|
from synapse.storage.prepare_database import get_statements
|
||||||
from synapse.storage.state_deltas import StateDeltasStore
|
from synapse.storage.state_deltas import StateDeltasStore
|
||||||
from synapse.util.caches.descriptors import cached
|
from synapse.util.caches.descriptors import cached
|
||||||
|
|
||||||
|
@ -69,12 +70,25 @@ class StatsStore(StateDeltasStore):
|
||||||
|
|
||||||
# Get all the rooms that we want to process.
|
# Get all the rooms that we want to process.
|
||||||
def _make_staging_area(txn):
|
def _make_staging_area(txn):
|
||||||
sql = (
|
# Create the temporary tables
|
||||||
"CREATE TABLE IF NOT EXISTS "
|
stmts = get_statements("""
|
||||||
+ TEMP_TABLE
|
-- We just recreate the table, we'll be reinserting the
|
||||||
+ "_rooms(room_id TEXT NOT NULL, events BIGINT NOT NULL)"
|
-- correct entries again later anyway.
|
||||||
)
|
DROP TABLE IF EXISTS {temp}_rooms;
|
||||||
txn.execute(sql)
|
|
||||||
|
CREATE TABLE IF NOT EXISTS {temp}_rooms(
|
||||||
|
room_id TEXT NOT NULL,
|
||||||
|
events BIGINT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX {temp}_rooms_events
|
||||||
|
ON {temp}_rooms(events);
|
||||||
|
CREATE INDEX {temp}_rooms_id
|
||||||
|
ON {temp}_rooms(room_id);
|
||||||
|
""".format(temp=TEMP_TABLE).splitlines())
|
||||||
|
|
||||||
|
for statement in stmts:
|
||||||
|
txn.execute(statement)
|
||||||
|
|
||||||
sql = (
|
sql = (
|
||||||
"CREATE TABLE IF NOT EXISTS "
|
"CREATE TABLE IF NOT EXISTS "
|
||||||
|
@ -83,15 +97,16 @@ class StatsStore(StateDeltasStore):
|
||||||
)
|
)
|
||||||
txn.execute(sql)
|
txn.execute(sql)
|
||||||
|
|
||||||
# Get rooms we want to process from the database
|
# Get rooms we want to process from the database, only adding
|
||||||
|
# those that we haven't (i.e. those not in room_stats_earliest_token)
|
||||||
sql = """
|
sql = """
|
||||||
SELECT room_id, count(*) FROM current_state_events
|
INSERT INTO %s_rooms (room_id, events)
|
||||||
GROUP BY room_id
|
SELECT c.room_id, count(*) FROM current_state_events AS c
|
||||||
"""
|
LEFT JOIN room_stats_earliest_token AS t USING (room_id)
|
||||||
|
WHERE t.room_id IS NULL
|
||||||
|
GROUP BY c.room_id
|
||||||
|
""" % (TEMP_TABLE,)
|
||||||
txn.execute(sql)
|
txn.execute(sql)
|
||||||
rooms = [{"room_id": x[0], "events": x[1]} for x in txn.fetchall()]
|
|
||||||
self._simple_insert_many_txn(txn, TEMP_TABLE + "_rooms", rooms)
|
|
||||||
del rooms
|
|
||||||
|
|
||||||
new_pos = yield self.get_max_stream_id_in_current_state_deltas()
|
new_pos = yield self.get_max_stream_id_in_current_state_deltas()
|
||||||
yield self.runInteraction("populate_stats_temp_build", _make_staging_area)
|
yield self.runInteraction("populate_stats_temp_build", _make_staging_area)
|
||||||
|
|
Loading…
Reference in a new issue