From 5ade6c25f38d70fb0d1a6ac164211df69555b365 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Mon, 28 Sep 2020 15:32:07 +0200 Subject: [PATCH] server/worker_task: write older tasks into archive file instead of removing tasks beyond the 1000 that are in the index write them into an archive file by appending them at the end this way we can later still read them Signed-off-by: Dominik Csapak --- src/server/worker_task.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/server/worker_task.rs b/src/server/worker_task.rs index 2ce71136..4a4406e1 100644 --- a/src/server/worker_task.rs +++ b/src/server/worker_task.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; use std::fs::File; -use std::io::{Read, BufRead, BufReader}; +use std::io::{Read, Write, BufRead, BufReader}; use std::panic::UnwindSafe; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Mutex}; @@ -32,6 +32,7 @@ pub const PROXMOX_BACKUP_TASK_DIR: &str = PROXMOX_BACKUP_TASK_DIR_M!(); pub const PROXMOX_BACKUP_TASK_LOCK_FN: &str = concat!(PROXMOX_BACKUP_TASK_DIR_M!(), "/.active.lock"); pub const PROXMOX_BACKUP_ACTIVE_TASK_FN: &str = concat!(PROXMOX_BACKUP_TASK_DIR_M!(), "/active"); pub const PROXMOX_BACKUP_INDEX_TASK_FN: &str = concat!(PROXMOX_BACKUP_TASK_DIR_M!(), "/index"); +pub const PROXMOX_BACKUP_ARCHIVE_TASK_FN: &str = concat!(PROXMOX_BACKUP_TASK_DIR_M!(), "/archive"); const MAX_INDEX_TASKS: usize = 1000; @@ -407,6 +408,19 @@ fn update_active_workers(new_upid: Option<&UPID>) -> Result, E .group(backup_user.gid), )?; + if !finish_list.is_empty() && start > 0 { + match std::fs::OpenOptions::new().append(true).create(true).open(PROXMOX_BACKUP_ARCHIVE_TASK_FN) { + Ok(mut writer) => { + for info in &finish_list[0..start] { + writer.write_all(render_task_line(&info).as_bytes())?; + } + }, + Err(err) => bail!("could not write task archive - {}", err), + } + + nix::unistd::chown(PROXMOX_BACKUP_ARCHIVE_TASK_FN, Some(backup_user.uid), Some(backup_user.gid))?; + } + drop(lock); finish_list.append(&mut active_list);