summary refs log tree commit diff
path: root/synapse/storage/schema/delta/56/stats_separated1.sql
blob: 6d4648c0d71302da20b4f24f7c09d38b763ff12a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* Copyright 2018 New Vector Ltd
 * 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.
 */


----- First clean up from previous versions of room stats.

-- First remove old stats stuff
DROP TABLE IF EXISTS room_stats;
DROP TABLE IF EXISTS user_stats;
DROP TABLE IF EXISTS room_stats_earliest_tokens;
DROP TABLE IF EXISTS _temp_populate_stats_position;
DROP TABLE IF EXISTS _temp_populate_stats_rooms;
DROP TABLE IF EXISTS stats_stream_pos;

-- Unschedule old background updates if they're still scheduled
DELETE FROM background_updates WHERE update_name IN (
    'populate_stats_createtables',
    'populate_stats_process_rooms',
    'populate_stats_cleanup'
);

----- Create tables for our version of room stats.

-- single-row table to track position of incremental updates
CREATE TABLE IF NOT EXISTS stats_incremental_position (
    -- the stream_id of the last-processed state delta
    state_delta_stream_id BIGINT,

    -- the stream_ordering of the last-processed backfilled event
    -- (this is negative)
    total_events_min_stream_ordering BIGINT,

    -- the stream_ordering of the last-processed normally-created event
    -- (this is positive)
    total_events_max_stream_ordering BIGINT,

    -- If true, this represents the contract agreed upon by the stats
    -- regenerator.
    -- If false, this is suitable for use by the delta/incremental processor.
    is_background_contract BOOLEAN NOT NULL PRIMARY KEY
);

-- insert a null row and make sure it is the only one.
DELETE FROM stats_incremental_position;
INSERT INTO stats_incremental_position (
    state_delta_stream_id,
    total_events_min_stream_ordering,
    total_events_max_stream_ordering,
    is_background_contract
) VALUES (NULL, NULL, NULL, (0 = 1)), (NULL, NULL, NULL, (1 = 1));

-- represents PRESENT room statistics for a room
-- only holds absolute fields
CREATE TABLE IF NOT EXISTS room_stats_current (
    room_id TEXT NOT NULL PRIMARY KEY,

    current_state_events INT NOT NULL,
    total_events INT NOT NULL,
    total_event_bytes BIGINT NOT NULL,
    joined_members INT NOT NULL,
    invited_members INT NOT NULL,
    left_members INT NOT NULL,
    banned_members INT NOT NULL,

    -- If initial stats regen is still to be performed: NULL
    -- If initial stats regen has been performed: the maximum delta stream
    --  position that this row takes into account.
    completed_delta_stream_id BIGINT
);


-- represents HISTORICAL room statistics for a room
CREATE TABLE IF NOT EXISTS room_stats_historical (
    room_id TEXT NOT NULL,
    -- These stats cover the time from (end_ts - bucket_size)...end_ts (in ms).
    -- Note that end_ts is quantised.
    end_ts BIGINT NOT NULL,
    bucket_size INT NOT NULL,

    current_state_events INT NOT NULL,
    total_events INT NOT NULL,
    total_event_bytes BIGINT NOT NULL,
    joined_members INT NOT NULL,
    invited_members INT NOT NULL,
    left_members INT NOT NULL,
    banned_members INT NOT NULL,

    PRIMARY KEY (room_id, end_ts)
);

-- We use this index to speed up deletion of ancient room stats.
CREATE INDEX IF NOT EXISTS room_stats_historical_end_ts ON room_stats_historical (end_ts);

-- We don't need an index on (room_id, end_ts) because PRIMARY KEY sorts that
-- out for us. (We would want it to review stats for a particular room.)


-- represents PRESENT statistics for a user
-- only holds absolute fields
CREATE TABLE IF NOT EXISTS user_stats_current (
    user_id TEXT NOT NULL PRIMARY KEY,

    public_rooms INT NOT NULL,
    private_rooms INT NOT NULL,

    -- If initial stats regen is still to be performed: NULL
    -- If initial stats regen has been performed: the maximum delta stream
    --  position that this row takes into account.
    completed_delta_stream_id BIGINT
);

-- represents HISTORICAL statistics for a user
CREATE TABLE IF NOT EXISTS user_stats_historical (
    user_id TEXT NOT NULL,
    end_ts BIGINT NOT NULL,
    bucket_size INT NOT NULL,

    public_rooms INT NOT NULL,
    private_rooms INT NOT NULL,

    PRIMARY KEY (user_id, end_ts)
);

-- We use this index to speed up deletion of ancient user stats.
CREATE INDEX IF NOT EXISTS user_stats_historical_end_ts ON user_stats_historical (end_ts);

-- We don't need an index on (user_id, end_ts) because PRIMARY KEY sorts that
-- out for us. (We would want it to review stats for a particular user.)

-- Also rename room_state to room_stats_state to make its ownership clear.
ALTER TABLE room_state RENAME TO room_stats_state;