Repository navigation
Expand file tree
/
Copy pathschema.sql
More file actions
51 lines (47 loc) · 2.37 KB
/
Copy pathschema.sql
File metadata and controls
51 lines (47 loc) · 2.37 KB
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
-- 旧packets/node_list/firewall_settingsには触れない、中継専用のスキーマ。
-- 既存の未ACKキューを引き継ぐためスキーマ名を維持する。
CREATE SCHEMA IF NOT EXISTS stegrdb_relay;
CREATE TABLE IF NOT EXISTS stegrdb_relay.nodes (
channel TEXT NOT NULL,
node_id TEXT NOT NULL,
PRIMARY KEY (channel, node_id)
);
-- 旧ノードの設定が不明な間は削除を無効にする。再接続時に各ノードが更新する。
ALTER TABLE stegrdb_relay.nodes ADD COLUMN IF NOT EXISTS replay_window_ms BIGINT NOT NULL DEFAULT 2147483647;
ALTER TABLE stegrdb_relay.nodes ADD COLUMN IF NOT EXISTS retention_ms BIGINT NOT NULL DEFAULT 0;
CREATE TABLE IF NOT EXISTS stegrdb_relay.frames (
channel TEXT NOT NULL,
id UUID NOT NULL,
sender TEXT NOT NULL,
position BIGINT GENERATED ALWAYS AS IDENTITY,
payload BYTEA NOT NULL CHECK (octet_length(payload) BETWEEN 14 AND 65535),
created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
PRIMARY KEY (channel, id)
);
CREATE INDEX IF NOT EXISTS frames_channel_created_at ON stegrdb_relay.frames (channel, created_at);
CREATE TABLE IF NOT EXISTS stegrdb_relay.pending (
channel TEXT NOT NULL,
node_id TEXT NOT NULL,
frame_id UUID NOT NULL,
position BIGINT NOT NULL,
PRIMARY KEY (channel, node_id, frame_id),
FOREIGN KEY (channel, node_id) REFERENCES stegrdb_relay.nodes ON DELETE CASCADE,
FOREIGN KEY (channel, frame_id) REFERENCES stegrdb_relay.frames ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS pending_delivery_order ON stegrdb_relay.pending (channel, node_id, position);
-- node_idをまたぐ未ACK確認とframes削除時の外部キー検査に使う。
CREATE INDEX IF NOT EXISTS pending_frame ON stegrdb_relay.pending (channel, frame_id);
-- 高頻度のINSERT/DELETEで古い行・統計が蓄積しないよう、中継表だけを調整する。
-- 末尾ページの縮小はACCESS EXCLUSIVEを取るため、オンラインでは領域の再利用を優先する。
ALTER TABLE stegrdb_relay.pending SET (
autovacuum_vacuum_scale_factor = 0.02,
autovacuum_analyze_scale_factor = 0.02,
autovacuum_vacuum_cost_limit = 1000,
vacuum_truncate = false
);
ALTER TABLE stegrdb_relay.frames SET (
autovacuum_vacuum_scale_factor = 0.02,
autovacuum_analyze_scale_factor = 0.02,
autovacuum_vacuum_cost_limit = 1000,
vacuum_truncate = false
);