mirror of
https://git.proxmox.com/git/proxmox-backup
synced 2025-08-11 11:01:23 +00:00
reuse-datastore: avoid creating another prune job
If a datastore with a prune job is removed, the prune job is preserverd as it is stored in /etc/proxmox-backup/prune.cfg. We also create a default prune job for every datastore – this means that when reusing a datastore that previously existed, you end up with duplicate prune jobs. To avoid this we check if a prune job already exists, and when it does, we refrain from creating the default one. (We also check if specific keep-options have been added, if yes, then we create the job nevertheless.) Reported-by: Fabian Grünbichler <f.gruenbichler@proxmox.com> Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
This commit is contained in:
parent
f73bc28f03
commit
5a52d1f06c
@ -24,7 +24,7 @@ use crate::api2::admin::{
|
|||||||
datastore::do_mount_device, prune::list_prune_jobs, sync::list_config_sync_jobs,
|
datastore::do_mount_device, prune::list_prune_jobs, sync::list_config_sync_jobs,
|
||||||
verify::list_verification_jobs,
|
verify::list_verification_jobs,
|
||||||
};
|
};
|
||||||
use crate::api2::config::prune::{delete_prune_job, do_create_prune_job};
|
use crate::api2::config::prune::{delete_prune_job, do_create_prune_job, has_prune_job};
|
||||||
use crate::api2::config::sync::delete_sync_job;
|
use crate::api2::config::sync::delete_sync_job;
|
||||||
use crate::api2::config::tape_backup_job::{delete_tape_backup_job, list_tape_backup_jobs};
|
use crate::api2::config::tape_backup_job::{delete_tape_backup_job, list_tape_backup_jobs};
|
||||||
use crate::api2::config::verify::delete_verification_job;
|
use crate::api2::config::verify::delete_verification_job;
|
||||||
@ -204,23 +204,26 @@ pub fn create_datastore(
|
|||||||
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
|
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
|
||||||
let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI;
|
let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI;
|
||||||
|
|
||||||
let prune_job_config = config.prune_schedule.as_ref().map(|schedule| {
|
let mut prune_job_config = None;
|
||||||
let mut id = format!("default-{}-{}", config.name, Uuid::generate());
|
if config.keep.keeps_something() || !has_prune_job(&config.name)? {
|
||||||
id.truncate(32);
|
prune_job_config = config.prune_schedule.as_ref().map(|schedule| {
|
||||||
|
let mut id = format!("default-{}-{}", config.name, Uuid::generate());
|
||||||
|
id.truncate(32);
|
||||||
|
|
||||||
PruneJobConfig {
|
PruneJobConfig {
|
||||||
id,
|
id,
|
||||||
store: config.name.clone(),
|
store: config.name.clone(),
|
||||||
comment: None,
|
comment: None,
|
||||||
disable: false,
|
disable: false,
|
||||||
schedule: schedule.clone(),
|
schedule: schedule.clone(),
|
||||||
options: PruneJobOptions {
|
options: PruneJobOptions {
|
||||||
keep: config.keep.clone(),
|
keep: config.keep.clone(),
|
||||||
max_depth: None,
|
max_depth: None,
|
||||||
ns: None,
|
ns: None,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// clearing prune settings in the datastore config, as they are now handled by prune jobs
|
// clearing prune settings in the datastore config, as they are now handled by prune jobs
|
||||||
let config = DataStoreConfig {
|
let config = DataStoreConfig {
|
||||||
|
@ -77,6 +77,17 @@ pub fn do_create_prune_job(config: PruneJobConfig) -> Result<(), Error> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn has_prune_job(datastore: &str) -> Result<bool, Error> {
|
||||||
|
let (section_config, _digest) = prune::config()?;
|
||||||
|
for (_, (_, job_config)) in section_config.sections {
|
||||||
|
let job_config: PruneJobConfig = serde_json::from_value(job_config)?;
|
||||||
|
if job_config.store == datastore {
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(false)
|
||||||
|
}
|
||||||
|
|
||||||
#[api(
|
#[api(
|
||||||
protected: true,
|
protected: true,
|
||||||
input: {
|
input: {
|
||||||
|
Loading…
Reference in New Issue
Block a user