mirror of
https://github.com/chatmail/core.git
synced 2026-05-16 21:36:30 +03:00
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -1388,6 +1388,7 @@ dependencies = [
|
|||||||
"tracing",
|
"tracing",
|
||||||
"url",
|
"url",
|
||||||
"uuid",
|
"uuid",
|
||||||
|
"walkdir",
|
||||||
"webpki-roots",
|
"webpki-roots",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1429,7 +1430,6 @@ dependencies = [
|
|||||||
"tempfile",
|
"tempfile",
|
||||||
"tokio",
|
"tokio",
|
||||||
"typescript-type-def",
|
"typescript-type-def",
|
||||||
"walkdir",
|
|
||||||
"yerpc",
|
"yerpc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ toml = "0.9"
|
|||||||
tracing = "0.1.41"
|
tracing = "0.1.41"
|
||||||
url = "2"
|
url = "2"
|
||||||
uuid = { version = "1", features = ["serde", "v4"] }
|
uuid = { version = "1", features = ["serde", "v4"] }
|
||||||
|
walkdir = "2.5.0"
|
||||||
webpki-roots = "0.26.8"
|
webpki-roots = "0.26.8"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ yerpc = { workspace = true, features = ["anyhow_expose", "openrpc"] }
|
|||||||
typescript-type-def = { version = "0.5.13", features = ["json_value"] }
|
typescript-type-def = { version = "0.5.13", features = ["json_value"] }
|
||||||
tokio = { workspace = true }
|
tokio = { workspace = true }
|
||||||
sanitize-filename = { workspace = true }
|
sanitize-filename = { workspace = true }
|
||||||
walkdir = "2.5.0"
|
|
||||||
base64 = { workspace = true }
|
base64 = { workspace = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
|||||||
@@ -35,14 +35,13 @@ use deltachat::qr_code_generator::{generate_backup_qr, get_securejoin_qr_svg};
|
|||||||
use deltachat::reaction::{get_msg_reactions, send_reaction};
|
use deltachat::reaction::{get_msg_reactions, send_reaction};
|
||||||
use deltachat::securejoin;
|
use deltachat::securejoin;
|
||||||
use deltachat::stock_str::StockMessage;
|
use deltachat::stock_str::StockMessage;
|
||||||
use deltachat::storage_usage::get_storage_usage;
|
use deltachat::storage_usage::{get_blobdir_storage_usage, get_storage_usage};
|
||||||
use deltachat::webxdc::StatusUpdateSerial;
|
use deltachat::webxdc::StatusUpdateSerial;
|
||||||
use deltachat::EventEmitter;
|
use deltachat::EventEmitter;
|
||||||
use sanitize_filename::is_sanitized;
|
use sanitize_filename::is_sanitized;
|
||||||
use tokio::fs;
|
use tokio::fs;
|
||||||
use tokio::sync::{watch, Mutex, RwLock};
|
use tokio::sync::{watch, Mutex, RwLock};
|
||||||
use types::login_param::EnteredLoginParam;
|
use types::login_param::EnteredLoginParam;
|
||||||
use walkdir::WalkDir;
|
|
||||||
use yerpc::rpc;
|
use yerpc::rpc;
|
||||||
|
|
||||||
pub mod types;
|
pub mod types;
|
||||||
@@ -330,13 +329,7 @@ impl CommandApi {
|
|||||||
async fn get_account_file_size(&self, account_id: u32) -> Result<u64> {
|
async fn get_account_file_size(&self, account_id: u32) -> Result<u64> {
|
||||||
let ctx = self.get_context(account_id).await?;
|
let ctx = self.get_context(account_id).await?;
|
||||||
let dbfile = ctx.get_dbfile().metadata()?.len();
|
let dbfile = ctx.get_dbfile().metadata()?.len();
|
||||||
let total_size = WalkDir::new(ctx.get_blobdir())
|
let total_size = get_blobdir_storage_usage(&ctx);
|
||||||
.max_depth(2)
|
|
||||||
.into_iter()
|
|
||||||
.filter_map(|entry| entry.ok())
|
|
||||||
.filter_map(|entry| entry.metadata().ok())
|
|
||||||
.filter(|metadata| metadata.is_file())
|
|
||||||
.fold(0, |acc, m| acc + m.len());
|
|
||||||
|
|
||||||
Ok(dbfile + total_size)
|
Ok(dbfile + total_size)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
use crate::{context::Context, message::MsgId};
|
use crate::{context::Context, message::MsgId};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use humansize::{BINARY, format_size};
|
use humansize::{BINARY, format_size};
|
||||||
|
use walkdir::WalkDir;
|
||||||
|
|
||||||
/// Storage Usage Report
|
/// Storage Usage Report
|
||||||
/// Useful for debugging space usage problems in the deltachat database.
|
/// Useful for debugging space usage problems in the deltachat database.
|
||||||
@@ -14,11 +15,15 @@ pub struct StorageUsage {
|
|||||||
/// count and total size of status updates
|
/// count and total size of status updates
|
||||||
/// for the 10 webxdc apps with the most size usage in status updates
|
/// for the 10 webxdc apps with the most size usage in status updates
|
||||||
pub largest_webxdc_data: Vec<(MsgId, u64, u64)>,
|
pub largest_webxdc_data: Vec<(MsgId, u64, u64)>,
|
||||||
|
/// Total size of all files in the blobdir
|
||||||
|
pub blobdir_size: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Display for StorageUsage {
|
impl std::fmt::Display for StorageUsage {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
writeln!(f, "Storage Usage:")?;
|
writeln!(f, "Storage Usage:")?;
|
||||||
|
let blobdir_size = format_size(self.blobdir_size, BINARY);
|
||||||
|
writeln!(f, "[Blob Directory Size]: {blobdir_size}")?;
|
||||||
let human_db_size = format_size(self.db_size, BINARY);
|
let human_db_size = format_size(self.db_size, BINARY);
|
||||||
writeln!(f, "[Database Size]: {human_db_size}")?;
|
writeln!(f, "[Database Size]: {human_db_size}")?;
|
||||||
writeln!(f, "[Largest Tables]:")?;
|
writeln!(f, "[Largest Tables]:")?;
|
||||||
@@ -46,6 +51,10 @@ impl std::fmt::Display for StorageUsage {
|
|||||||
|
|
||||||
/// Get storage usage information for the Context's database
|
/// Get storage usage information for the Context's database
|
||||||
pub async fn get_storage_usage(ctx: &Context) -> Result<StorageUsage> {
|
pub async fn get_storage_usage(ctx: &Context) -> Result<StorageUsage> {
|
||||||
|
let context_clone = ctx.clone();
|
||||||
|
let blobdir_size =
|
||||||
|
tokio::task::spawn_blocking(move || get_blobdir_storage_usage(&context_clone));
|
||||||
|
|
||||||
let page_size: u64 = ctx
|
let page_size: u64 = ctx
|
||||||
.sql
|
.sql
|
||||||
.query_get_value("PRAGMA page_size", ())
|
.query_get_value("PRAGMA page_size", ())
|
||||||
@@ -101,9 +110,23 @@ pub async fn get_storage_usage(ctx: &Context) -> Result<StorageUsage> {
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
let blobdir_size = blobdir_size.await?;
|
||||||
|
|
||||||
Ok(StorageUsage {
|
Ok(StorageUsage {
|
||||||
db_size: page_size * page_count,
|
db_size: page_size * page_count,
|
||||||
largest_tables,
|
largest_tables,
|
||||||
largest_webxdc_data,
|
largest_webxdc_data,
|
||||||
|
blobdir_size,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns storage usage of the blob directory
|
||||||
|
pub fn get_blobdir_storage_usage(ctx: &Context) -> u64 {
|
||||||
|
WalkDir::new(ctx.get_blobdir())
|
||||||
|
.max_depth(2)
|
||||||
|
.into_iter()
|
||||||
|
.filter_map(|entry| entry.ok())
|
||||||
|
.filter_map(|entry| entry.metadata().ok())
|
||||||
|
.filter(|metadata| metadata.is_file())
|
||||||
|
.fold(0, |acc, m| acc + m.len())
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user