mirror of
https://git.proxmox.com/git/proxmox-offline-mirror
synced 2025-08-15 23:11:50 +00:00
fix #4261: allow GC for all configured mirrors
by making the --id parameter optional, and structuring the output accordingly. since pools are per base-dir, GC only needs to run once per base-dir instead of for each mirror entry. Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
parent
e361735f23
commit
8282ee4790
@ -4,7 +4,7 @@ use proxmox_section_config::SectionConfigData;
|
|||||||
use proxmox_subscription::SubscriptionStatus;
|
use proxmox_subscription::SubscriptionStatus;
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
use std::{
|
use std::{
|
||||||
collections::{BTreeMap, HashMap},
|
collections::{BTreeMap, HashMap, HashSet},
|
||||||
path::PathBuf,
|
path::PathBuf,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -285,6 +285,7 @@ async fn remove_snapshot(
|
|||||||
},
|
},
|
||||||
id: {
|
id: {
|
||||||
schema: MIRROR_ID_SCHEMA,
|
schema: MIRROR_ID_SCHEMA,
|
||||||
|
optional: true,
|
||||||
},
|
},
|
||||||
"output-format": {
|
"output-format": {
|
||||||
schema: OUTPUT_FORMAT,
|
schema: OUTPUT_FORMAT,
|
||||||
@ -293,14 +294,55 @@ async fn remove_snapshot(
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
)]
|
)]
|
||||||
/// Run Garbage Collection on pool
|
/// Run Garbage Collection on pool(s). If no `id` is specified, the pools of all configured mirrors
|
||||||
async fn garbage_collect(config: Option<String>, id: String, _param: Value) -> Result<(), Error> {
|
/// will be GCed.
|
||||||
|
async fn garbage_collect(
|
||||||
|
config: Option<String>,
|
||||||
|
id: Option<String>,
|
||||||
|
_param: Value,
|
||||||
|
) -> Result<(), Error> {
|
||||||
let config = config.unwrap_or_else(get_config_path);
|
let config = config.unwrap_or_else(get_config_path);
|
||||||
|
|
||||||
let (config, _digest) = proxmox_offline_mirror::config::config(&config)?;
|
let (config, _digest) = proxmox_offline_mirror::config::config(&config)?;
|
||||||
let config: MirrorConfig = config.lookup("mirror", &id)?;
|
|
||||||
|
|
||||||
let (count, size) = mirror::gc(&config)?;
|
let (count, size) = if let Some(id) = id {
|
||||||
|
let config: MirrorConfig = config.lookup("mirror", &id)?;
|
||||||
|
mirror::gc(&config)?
|
||||||
|
} else {
|
||||||
|
let mut total_count = 0;
|
||||||
|
let mut total_size = 0;
|
||||||
|
let mut error_count = 0;
|
||||||
|
let mut base_dirs = HashSet::new();
|
||||||
|
|
||||||
|
for mirror_config in config.convert_to_typed_array::<MirrorConfig>("mirror")? {
|
||||||
|
if base_dirs.insert(mirror_config.base_dir.clone()) {
|
||||||
|
match mirror::gc(&mirror_config) {
|
||||||
|
Ok((count, size)) => {
|
||||||
|
println!(
|
||||||
|
"{}: removed {count} files totalling {size}b",
|
||||||
|
mirror_config.id
|
||||||
|
);
|
||||||
|
total_count += count;
|
||||||
|
total_size += size;
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
error_count += 1;
|
||||||
|
eprintln!("{}: failed to run GC - {err}", mirror_config.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
println!(
|
||||||
|
"{}: base dir '{}' already GCed",
|
||||||
|
mirror_config.id, mirror_config.base_dir
|
||||||
|
);
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
if error_count > 0 {
|
||||||
|
eprintln!("Encountered {error_count} errors, please check log.");
|
||||||
|
}
|
||||||
|
(total_count, total_size)
|
||||||
|
};
|
||||||
|
|
||||||
println!("Removed {} files totalling {}b", count, size);
|
println!("Removed {} files totalling {}b", count, size);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user