deltachat/sql/pool/
wal_checkpoint.rs1use anyhow::{Result, ensure};
4use std::sync::Arc;
5use std::time::Duration;
6
7use crate::sql::Sql;
8use crate::tools::{Time, time_elapsed};
9
10use super::Pool;
11
12#[derive(Debug)]
14pub(crate) struct WalCheckpointStats {
15 pub total_duration: Duration,
17
18 pub writers_blocked_duration: Duration,
20
21 pub readers_blocked_duration: Duration,
23
24 pub pages_total: i64,
26
27 pub pages_checkpointed: i64,
33}
34
35pub(super) async fn wal_checkpoint(pool: &Pool) -> Result<WalCheckpointStats> {
37 let t_start = Time::now();
38
39 let query_only = true;
41 let conn = pool.get(query_only).await?;
42 tokio::task::block_in_place(|| {
43 conn.query_row("PRAGMA table_list", [], |_| Ok(()))?;
47 conn.query_row("PRAGMA wal_checkpoint(PASSIVE)", [], |_| Ok(()))
48 })?;
49
50 drop(conn);
53 let _write_lock = Arc::clone(&pool.inner.write_mutex).lock_owned().await;
54 let t_writers_blocked = Time::now();
55 let conn = pool.get(query_only).await?;
56 let mut read_conns = Vec::with_capacity(Sql::N_DB_CONNECTIONS - 1);
62 for _ in 0..(Sql::N_DB_CONNECTIONS - 1) {
63 read_conns.push(pool.get(query_only).await?);
64 }
65 read_conns.clear();
66 let (pages_total, pages_checkpointed) = tokio::task::block_in_place(|| {
68 conn.query_row("PRAGMA table_list", [], |_| Ok(()))?;
69 conn.query_row("PRAGMA wal_checkpoint(FULL)", [], |row| {
70 let pages_total: i64 = row.get(1)?;
71 let pages_checkpointed: i64 = row.get(2)?;
72 Ok((pages_total, pages_checkpointed))
73 })
74 })?;
75 for _ in 0..(Sql::N_DB_CONNECTIONS - 1) {
77 read_conns.push(pool.get(query_only).await?);
78 }
79 let t_readers_blocked = Time::now();
80 tokio::task::block_in_place(|| {
81 let blocked = conn.query_row("PRAGMA wal_checkpoint(TRUNCATE)", [], |row| {
82 let blocked: i64 = row.get(0)?;
83 Ok(blocked)
84 })?;
85 ensure!(blocked == 0);
86 Ok(())
87 })?;
88 Ok(WalCheckpointStats {
89 total_duration: time_elapsed(&t_start),
90 writers_blocked_duration: time_elapsed(&t_writers_blocked),
91 readers_blocked_duration: time_elapsed(&t_readers_blocked),
92 pages_total,
93 pages_checkpointed,
94 })
95}