From 759dbc9f7e80a7c670facd00b25c5dbcc91b4d9c Mon Sep 17 00:00:00 2001 From: A cursed quail Date: Sat, 8 Jun 2024 22:05:37 -0500 Subject: [PATCH] sqlite-specific performance tuning --- server/src/lib.rs | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/server/src/lib.rs b/server/src/lib.rs index 2aba734..93f2e0b 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -107,9 +107,28 @@ impl StateInner { async fn database(&self) -> ServerResult<&DatabaseConnection> { self.database .get_or_try_init(|| async { - Database::connect(&self.config.database.url) + let db = Database::connect(&self.config.database.url) .await - .map_err(ServerError::database_error) + .map_err(ServerError::database_error); + if let Ok(DatabaseConnection::SqlxSqlitePoolConnection(ref conn)) = db { + // execute some sqlite-specific performance optimizations + // see https://phiresky.github.io/blog/2020/sqlite-performance-tuning/ for + // more details + // intentionally ignore errors from this: this is purely for performance, + // not for correctness, so we can live without this + _ = conn + .execute_unprepared( + " + pragma journal_mode=WAL; + pragma synchronous=normal; + pragma temp_store=memory; + pragma mmap_size = 30000000000; + ", + ) + .await; + } + + db }) .await } @@ -225,14 +244,11 @@ pub async fn run_api_server(cli_listen: Option, config: Config) -> R let listener = TcpListener::bind(&listen).await?; - let (server_ret, _) = tokio::join!( - axum::serve(listener, rest).into_future(), - async { - if state.config.database.heartbeat { - let _ = state.run_db_heartbeat().await; - } - }, - ); + let (server_ret, _) = tokio::join!(axum::serve(listener, rest).into_future(), async { + if state.config.database.heartbeat { + let _ = state.run_db_heartbeat().await; + } + },); server_ret?;