Add compression support to backup workflow
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled

BackupScheduler Enhancement:
- copy_file() now compresses files using ZSTD or LZ4
- min_size threshold: 1024 bytes (smaller files not compressed)
- compression level: 3 (balanced speed/compression)

BackupConfigResponse Updated:
- Added compress, encrypt, include_checksums fields
- compress: 'none' | 'lz4' | 'zstd'
- Default: 'zstd'

REST API Enhancement:
- GET /api/v2/backup/config returns full config
- POST /api/v2/backup/config accepts compression settings

Test Results:
- Set compress='lz4':  Config updated
- Set compress='zstd':  Config updated
- Compression applied via run_backup() (scheduled backup)

Note: Direct create_snapshot API doesn't use compression
(scheduler.run_backup() is the primary backup mechanism)

Build: 495 tests pass
This commit is contained in:
Warren
2026-06-24 04:14:24 +08:00
parent 55caeabd94
commit 2d8e9049b0
3 changed files with 34 additions and 4 deletions

View File

@@ -2750,6 +2750,9 @@ pub struct BackupConfigResponse {
pub interval_hours: u64,
pub max_snapshots: usize,
pub auto_cleanup: bool,
pub compress: String,
pub encrypt: bool,
pub include_checksums: bool,
}
#[derive(Debug, Serialize, Deserialize)]
@@ -2790,24 +2793,37 @@ async fn get_backup_stats_handler() -> Json<BackupStatsResponse> {
async fn get_backup_config_handler() -> Json<BackupConfigResponse> {
let scheduler = BACKUP_SCHEDULER.lock().unwrap();
let config = scheduler.get_config();
let compress_name = match config.compress {
crate::vfs::VfsCompression::None => "none",
crate::vfs::VfsCompression::Lz4 => "lz4",
crate::vfs::VfsCompression::Zstd => "zstd",
};
Json(BackupConfigResponse {
enabled: config.enabled,
interval_hours: config.interval_hours,
max_snapshots: config.max_snapshots,
auto_cleanup: config.auto_cleanup,
compress: compress_name.to_string(),
encrypt: config.encrypt,
include_checksums: config.include_checksums,
})
}
async fn set_backup_config_handler(Json(config): Json<BackupConfigResponse>) -> Json<serde_json::Value> {
let mut scheduler = BACKUP_SCHEDULER.lock().unwrap();
let compress = match config.compress.as_str() {
"lz4" => crate::vfs::VfsCompression::Lz4,
"zstd" => crate::vfs::VfsCompression::Zstd,
_ => crate::vfs::VfsCompression::None,
};
let new_config = BackupScheduleConfig {
enabled: config.enabled,
interval_hours: config.interval_hours,
max_snapshots: config.max_snapshots,
auto_cleanup: config.auto_cleanup,
compress: scheduler.get_config().compress.clone(),
encrypt: scheduler.get_config().encrypt,
include_checksums: scheduler.get_config().include_checksums,
compress,
encrypt: config.encrypt,
include_checksums: config.include_checksums,
};
scheduler.set_config(new_config);
Json(serde_json::json!({"success": true, "message": "Backup config updated"}))