Skip to content

Commit e0df557

Browse files
committedApr 11, 2025··
more speed
1 parent 2ce2ecd commit e0df557

File tree

16 files changed

+440
-324
lines changed

16 files changed

+440
-324
lines changed
 

‎Cargo.lock

+18-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
[package]
22
name = "api"
3-
version = "2.2.2"
3+
version = "2.3.0"
44
edition = "2024"
55

6+
[profile.dev]
7+
debug = false
8+
69
[profile.release]
710
debug = "limited"
811

@@ -14,7 +17,7 @@ dotenvy = "0.15.7"
1417
rustis = "0.13.3"
1518
serde = { version = "1.0.218", features = ["derive"] }
1619
serde_json = { version = "1.0.140", features = ["preserve_order"] }
17-
tokio = { version = "1.43.0", features = ["rt-multi-thread"] }
20+
tokio = { version = "1.43.0", features = ["full"] }
1821
utoipa = { version = "5.3.1", features = ["axum_extras", "preserve_order", "chrono"] }
1922
utoipa-axum = "0.2.0"
2023
chrono = { version = "0.4.40", features = ["serde"] }

‎migrations/0008_great_freedom.sql

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
CREATE MATERIALIZED VIEW mv_extension_stats AS
2+
SELECT
3+
extensions.id,
4+
jsonb_build_object(
5+
'panels', (
6+
SELECT COUNT(*)
7+
FROM (
8+
SELECT jsonb_array_elements(data->'blueprint'->'extensions') as ext
9+
FROM telemetry_data
10+
WHERE id IN (
11+
SELECT latest_telemetry_data_id
12+
FROM telemetry_panels_with_latest
13+
)
14+
AND created > NOW() - INTERVAL '2 days'
15+
) subq
16+
WHERE subq.ext->>'identifier' = extensions.identifier
17+
)
18+
) stats,
19+
(
20+
SELECT jsonb_agg(
21+
jsonb_build_object(
22+
'version', version,
23+
'percentage', percentage
24+
)
25+
ORDER BY percentage DESC
26+
)
27+
FROM (
28+
SELECT
29+
ext->>'version' AS version,
30+
(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER ())::float8 AS percentage
31+
FROM
32+
(
33+
SELECT jsonb_array_elements(data->'blueprint'->'extensions') AS ext
34+
FROM telemetry_data
35+
WHERE
36+
id IN (
37+
SELECT telemetry_data.id
38+
FROM telemetry_panels_with_latest
39+
WHERE latest_telemetry_data_id = (
40+
SELECT latest_telemetry_data_id
41+
FROM telemetry_panels_with_latest
42+
ORDER BY created DESC
43+
LIMIT 1
44+
)
45+
)
46+
AND created > NOW() - INTERVAL '2 days'
47+
) AS subq
48+
WHERE subq.ext->>'identifier' = extensions.identifier
49+
GROUP BY subq.ext->>'version'
50+
) version_data
51+
) versions
52+
FROM extensions;
53+
CREATE UNIQUE INDEX mv_extension_stats_id_idx ON mv_extension_stats (id);

‎src/database.rs

+25
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,31 @@ impl Database {
7878
});
7979
}
8080

81+
if env.database_refresh {
82+
let writer = instance.write.clone();
83+
tokio::spawn(async move {
84+
loop {
85+
tokio::time::sleep(std::time::Duration::from_secs(60 * 30)).await;
86+
87+
let start = std::time::Instant::now();
88+
89+
sqlx::query("REFRESH MATERIALIZED VIEW mv_extension_stats")
90+
.execute(&writer)
91+
.await
92+
.unwrap();
93+
94+
crate::logger::log(
95+
crate::logger::LoggerLevel::Info,
96+
format!(
97+
"{} views refreshed {}",
98+
"database".bright_cyan(),
99+
format!("({}ms)", start.elapsed().as_millis()).bright_black()
100+
),
101+
);
102+
}
103+
});
104+
}
105+
81106
instance
82107
}
83108

‎src/env.rs

+6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub struct Env {
1414

1515
pub sentry_url: Option<String>,
1616
pub database_migrate: bool,
17+
pub database_refresh: bool,
1718
pub database_url: String,
1819
pub database_url_primary: Option<String>,
1920

@@ -75,6 +76,11 @@ impl Env {
7576
.trim_matches('"')
7677
.parse()
7778
.unwrap(),
79+
database_refresh: std::env::var("DATABASE_REFRESH")
80+
.unwrap_or("false".to_string())
81+
.trim_matches('"')
82+
.parse()
83+
.unwrap(),
7884
database_url: std::env::var("DATABASE_URL")
7985
.expect("DATABASE_URL is required")
8086
.trim_matches('"')

‎src/main.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,14 @@ fn handle_panic(_err: Box<dyn std::any::Any + Send + 'static>) -> Response<Body>
3939
"a request panic has occurred".bright_red().to_string(),
4040
);
4141

42-
let body = routes::ApiError::new(&["internal server error"]);
43-
let body = serde_json::to_string(&body).unwrap();
44-
4542
Response::builder()
4643
.status(StatusCode::INTERNAL_SERVER_ERROR)
4744
.header("Content-Type", "application/json")
48-
.body(Body::from(body))
45+
.body(Body::from(
46+
routes::ApiError::new(&["internal server error"])
47+
.to_value()
48+
.to_string(),
49+
))
4950
.unwrap()
5051
}
5152

0 commit comments

Comments
 (0)
Please sign in to comment.