Skip to content

Commit 9f46355

Browse files
committed
add procedure to create tables for range_id
1 parent b29506e commit 9f46355

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed

database/src/base/state_indexer.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,6 @@ pub trait StateIndexerDbManager {
8585
block_height: u64,
8686
block_hash: near_primitives::hash::CryptoHash,
8787
) -> anyhow::Result<()>;
88+
89+
async fn create_new_range_tables(&self, range_id: u64) -> anyhow::Result<()>;
8890
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
-- Add down migration script here
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
CREATE OR REPLACE PROCEDURE create_new_range_tables(range_id INT)
2+
LANGUAGE plpgsql
3+
AS $$
4+
DECLARE
5+
i INT;
6+
BEGIN
7+
EXECUTE format('
8+
CREATE TABLE IF NOT EXISTS state_changes_data_%s (
9+
account_id text NOT NULL,
10+
block_height numeric(20,0) NOT NULL,
11+
block_hash text NOT NULL,
12+
data_key text NOT NULL,
13+
data_value bytea NULL,
14+
PRIMARY KEY (account_id, data_key, block_height)
15+
) PARTITION BY HASH (account_id);
16+
', range_id);
17+
18+
-- Create 100 partitions
19+
FOR i IN 0..99 LOOP
20+
EXECUTE format('
21+
CREATE TABLE IF NOT EXISTS state_changes_data_%s_%s PARTITION OF state_changes_data_%s FOR VALUES WITH (MODULUS 100, REMAINDER %s);
22+
', range_id, i, range_id, i);
23+
END LOOP;
24+
25+
26+
EXECUTE format('
27+
CREATE TABLE IF NOT EXISTS state_changes_access_key_%s (
28+
account_id text NOT NULL,
29+
block_height numeric(20,0) NOT NULL,
30+
block_hash text NOT NULL,
31+
data_key text NOT NULL,
32+
data_value bytea NULL,
33+
PRIMARY KEY (account_id, data_key, block_height)
34+
) PARTITION BY HASH (account_id);
35+
', range_id);
36+
37+
-- Create 100 partitions
38+
FOR i IN 0..99 LOOP
39+
EXECUTE format('
40+
CREATE TABLE IF NOT EXISTS state_changes_access_key_%s_%s PARTITION OF state_changes_access_key_%s FOR VALUES WITH (MODULUS 100, REMAINDER %s);
41+
', range_id, i, range_id, i);
42+
END LOOP;
43+
44+
EXECUTE format('
45+
CREATE TABLE IF NOT EXISTS state_changes_contract_%s (
46+
account_id text NOT NULL,
47+
block_height numeric(20,0) NOT NULL,
48+
block_hash text NOT NULL,
49+
data_value bytea NULL,
50+
PRIMARY KEY (account_id, block_height)
51+
) PARTITION BY HASH (account_id);
52+
', range_id);
53+
54+
-- Create 100 partitions
55+
FOR i IN 0..99 LOOP
56+
EXECUTE format('
57+
CREATE TABLE IF NOT EXISTS state_changes_contract_%s_%s PARTITION OF state_changes_contract_%s FOR VALUES WITH (MODULUS 100, REMAINDER %s);
58+
', range_id, i, range_id, i);
59+
END LOOP;
60+
61+
EXECUTE format('
62+
CREATE TABLE IF NOT EXISTS state_changes_account_%s (
63+
account_id text NOT NULL,
64+
block_height numeric(20,0) NOT NULL,
65+
block_hash text NOT NULL,
66+
data_value bytea NULL,
67+
PRIMARY KEY (account_id, block_height)
68+
) PARTITION BY HASH (account_id);
69+
', range_id);
70+
71+
-- Create 100 partitions
72+
FOR i IN 0..99 LOOP
73+
EXECUTE format('
74+
CREATE TABLE IF NOT EXISTS state_changes_account_%s_%s PARTITION OF state_changes_account_%s FOR VALUES WITH (MODULUS 100, REMAINDER %s);
75+
', range_id, i, range_id, i);
76+
END LOOP;
77+
END;
78+
$$;

database/src/postgres/state_indexer.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,4 +438,14 @@ impl crate::StateIndexerDbManager for crate::PostgresDBManager {
438438
.await?;
439439
Ok(())
440440
}
441+
442+
async fn create_new_range_tables(&self, range_id: u64) -> anyhow::Result<()> {
443+
for (_, pool) in self.shards_pool.iter() {
444+
sqlx::query("CALL create_new_range_tables($1);")
445+
.bind(range_id as i64)
446+
.execute(pool)
447+
.await?;
448+
}
449+
Ok(())
450+
}
441451
}

0 commit comments

Comments
 (0)