Skip to content

Commit 8dfa5fc

Browse files
authored
api: add blob dir size to storage info (#7605)
closes #7598
1 parent 49b04e8 commit 8dfa5fc

File tree

5 files changed

+27
-11
lines changed

5 files changed

+27
-11
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ toml = "0.9"
111111
tracing = "0.1.41"
112112
url = "2"
113113
uuid = { version = "1", features = ["serde", "v4"] }
114+
walkdir = "2.5.0"
114115
webpki-roots = "0.26.8"
115116

116117
[dev-dependencies]

deltachat-jsonrpc/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ yerpc = { workspace = true, features = ["anyhow_expose", "openrpc"] }
1919
typescript-type-def = { version = "0.5.13", features = ["json_value"] }
2020
tokio = { workspace = true }
2121
sanitize-filename = { workspace = true }
22-
walkdir = "2.5.0"
2322
base64 = { workspace = true }
2423

2524
[dev-dependencies]

deltachat-jsonrpc/src/api.rs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,13 @@ use deltachat::qr_code_generator::{generate_backup_qr, get_securejoin_qr_svg};
3535
use deltachat::reaction::{get_msg_reactions, send_reaction};
3636
use deltachat::securejoin;
3737
use deltachat::stock_str::StockMessage;
38-
use deltachat::storage_usage::get_storage_usage;
38+
use deltachat::storage_usage::{get_blobdir_storage_usage, get_storage_usage};
3939
use deltachat::webxdc::StatusUpdateSerial;
4040
use deltachat::EventEmitter;
4141
use sanitize_filename::is_sanitized;
4242
use tokio::fs;
4343
use tokio::sync::{watch, Mutex, RwLock};
4444
use types::login_param::EnteredLoginParam;
45-
use walkdir::WalkDir;
4645
use yerpc::rpc;
4746

4847
pub mod types;
@@ -330,13 +329,7 @@ impl CommandApi {
330329
async fn get_account_file_size(&self, account_id: u32) -> Result<u64> {
331330
let ctx = self.get_context(account_id).await?;
332331
let dbfile = ctx.get_dbfile().metadata()?.len();
333-
let total_size = WalkDir::new(ctx.get_blobdir())
334-
.max_depth(2)
335-
.into_iter()
336-
.filter_map(|entry| entry.ok())
337-
.filter_map(|entry| entry.metadata().ok())
338-
.filter(|metadata| metadata.is_file())
339-
.fold(0, |acc, m| acc + m.len());
332+
let total_size = get_blobdir_storage_usage(&ctx);
340333

341334
Ok(dbfile + total_size)
342335
}

src/storage_usage.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
use crate::{context::Context, message::MsgId};
33
use anyhow::Result;
44
use humansize::{BINARY, format_size};
5+
use walkdir::WalkDir;
56

67
/// Storage Usage Report
78
/// Useful for debugging space usage problems in the deltachat database.
@@ -14,11 +15,15 @@ pub struct StorageUsage {
1415
/// count and total size of status updates
1516
/// for the 10 webxdc apps with the most size usage in status updates
1617
pub largest_webxdc_data: Vec<(MsgId, u64, u64)>,
18+
/// Total size of all files in the blobdir
19+
pub blobdir_size: u64,
1720
}
1821

1922
impl std::fmt::Display for StorageUsage {
2023
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2124
writeln!(f, "Storage Usage:")?;
25+
let blobdir_size = format_size(self.blobdir_size, BINARY);
26+
writeln!(f, "[Blob Directory Size]: {blobdir_size}")?;
2227
let human_db_size = format_size(self.db_size, BINARY);
2328
writeln!(f, "[Database Size]: {human_db_size}")?;
2429
writeln!(f, "[Largest Tables]:")?;
@@ -46,6 +51,10 @@ impl std::fmt::Display for StorageUsage {
4651

4752
/// Get storage usage information for the Context's database
4853
pub async fn get_storage_usage(ctx: &Context) -> Result<StorageUsage> {
54+
let context_clone = ctx.clone();
55+
let blobdir_size =
56+
tokio::task::spawn_blocking(move || get_blobdir_storage_usage(&context_clone));
57+
4958
let page_size: u64 = ctx
5059
.sql
5160
.query_get_value("PRAGMA page_size", ())
@@ -101,9 +110,23 @@ pub async fn get_storage_usage(ctx: &Context) -> Result<StorageUsage> {
101110
)
102111
.await?;
103112

113+
let blobdir_size = blobdir_size.await?;
114+
104115
Ok(StorageUsage {
105116
db_size: page_size * page_count,
106117
largest_tables,
107118
largest_webxdc_data,
119+
blobdir_size,
108120
})
109121
}
122+
123+
/// Returns storage usage of the blob directory
124+
pub fn get_blobdir_storage_usage(ctx: &Context) -> u64 {
125+
WalkDir::new(ctx.get_blobdir())
126+
.max_depth(2)
127+
.into_iter()
128+
.filter_map(|entry| entry.ok())
129+
.filter_map(|entry| entry.metadata().ok())
130+
.filter(|metadata| metadata.is_file())
131+
.fold(0, |acc, m| acc + m.len())
132+
}

0 commit comments

Comments
 (0)