rest-server: cleanup_old_tasks: improve error handling

by not bubbling up most errors, and continuing on. this avoids that we
stop cleaning up because e.g. one directory was missing.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak 2022-03-28 09:54:17 +02:00 committed by Thomas Lamprecht
parent b23adfd4ee
commit baefc29544
2 changed files with 35 additions and 8 deletions

View File

@ -20,6 +20,7 @@ use proxmox_lang::try_block;
use proxmox_schema::upid::UPID; use proxmox_schema::upid::UPID;
use proxmox_sys::fs::{atomic_open_or_create_file, create_path, replace_file, CreateOptions}; use proxmox_sys::fs::{atomic_open_or_create_file, create_path, replace_file, CreateOptions};
use proxmox_sys::linux::procfs; use proxmox_sys::linux::procfs;
use proxmox_sys::task_warn;
use proxmox_sys::logrotate::{LogRotate, LogRotateFiles}; use proxmox_sys::logrotate::{LogRotate, LogRotateFiles};
use proxmox_sys::WorkerTaskContext; use proxmox_sys::WorkerTaskContext;
@ -228,7 +229,7 @@ pub fn rotate_task_log_archive(
/// removes all task logs that are older than the oldest task entry in the /// removes all task logs that are older than the oldest task entry in the
/// task archive /// task archive
pub fn cleanup_old_tasks(compressed: bool) -> Result<(), Error> { pub fn cleanup_old_tasks(worker: &dyn WorkerTaskContext, compressed: bool) -> Result<(), Error> {
let setup = worker_task_setup()?; let setup = worker_task_setup()?;
let _lock = setup.lock_task_list_files(true)?; let _lock = setup.lock_task_list_files(true)?;
@ -262,18 +263,44 @@ pub fn cleanup_old_tasks(compressed: bool) -> Result<(), Error> {
for i in 0..256 { for i in 0..256 {
let mut path = setup.taskdir.clone(); let mut path = setup.taskdir.clone();
path.push(format!("{:02X}", i)); path.push(format!("{:02X}", i));
for file in std::fs::read_dir(path)? { let files = match std::fs::read_dir(path) {
let file = file?; Ok(files) => files,
Err(err) if err.kind() == std::io::ErrorKind::NotFound => continue,
Err(err) => {
task_warn!(worker, "could not check task logs in '{:02X}': {}", i, err);
continue;
}
};
for file in files {
let file = match file {
Ok(file) => file,
Err(err) => {
task_warn!(
worker,
"could not check some task log in '{:02X}': {}",
i,
err
);
continue;
}
};
let path = file.path(); let path = file.path();
let modified = get_modified(file) let modified = match get_modified(file) {
.map_err(|err| format_err!("error getting mtime for {:?}: {}", path, err))?; Ok(modified) => modified,
Err(err) => {
task_warn!(worker, "error getting mtime for '{:?}': {}", path, err);
continue;
}
};
if modified < cutoff_time { if modified < cutoff_time {
match std::fs::remove_file(path) { match std::fs::remove_file(&path) {
Ok(()) => {} Ok(()) => {}
Err(err) if err.kind() == std::io::ErrorKind::NotFound => {} Err(err) if err.kind() == std::io::ErrorKind::NotFound => {}
Err(err) => bail!("could not remove file: {}", err), Err(err) => {
task_warn!(worker, "could not remove file '{:?}': {}", path, err)
}
} }
} }
} }

View File

@ -900,7 +900,7 @@ async fn schedule_task_log_rotate() {
if has_rotated { if has_rotated {
task_log!(worker, "cleaning up old task logs"); task_log!(worker, "cleaning up old task logs");
if let Err(err) = cleanup_old_tasks(true) { if let Err(err) = cleanup_old_tasks(&worker, true) {
task_warn!(worker, "could not completely cleanup old tasks: {}", err); task_warn!(worker, "could not completely cleanup old tasks: {}", err);
} }
} }