sqlite-specific performance tuning

This commit is contained in:
A cursed quail 2024-06-08 22:05:37 -05:00
parent 717cc95983
commit 759dbc9f7e
No known key found for this signature in database
GPG key ID: F1DF83DEC4C611EC

View file

@ -107,9 +107,28 @@ impl StateInner {
async fn database(&self) -> ServerResult<&DatabaseConnection> { async fn database(&self) -> ServerResult<&DatabaseConnection> {
self.database self.database
.get_or_try_init(|| async { .get_or_try_init(|| async {
Database::connect(&self.config.database.url) let db = Database::connect(&self.config.database.url)
.await .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 .await
} }
@ -225,14 +244,11 @@ pub async fn run_api_server(cli_listen: Option<SocketAddr>, config: Config) -> R
let listener = TcpListener::bind(&listen).await?; let listener = TcpListener::bind(&listen).await?;
let (server_ret, _) = tokio::join!( let (server_ret, _) = tokio::join!(axum::serve(listener, rest).into_future(), async {
axum::serve(listener, rest).into_future(),
async {
if state.config.database.heartbeat { if state.config.database.heartbeat {
let _ = state.run_db_heartbeat().await; let _ = state.run_db_heartbeat().await;
} }
}, },);
);
server_ret?; server_ret?;