From: Stefan Lendl <s.lendl@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup] fix #4374: create a prune job upon datastore creation
Date: Tue, 26 Sep 2023 17:19:40 +0200 [thread overview]
Message-ID: <20230926151940.2854416-1-s.lendl@proxmox.com> (raw)
creates a default prune job if prune-schedule is set
prune settings are not stored in the datastore config anymore
Signed-off-by: Stefan Lendl <s.lendl@proxmox.com>
---
The API for creating a datastore allows settings for prune-schedule and keep-*.
This options are currently ignored but even show up in the config.
With this patch, a prune-job is created from the provided prune options in the
datastore create API.
The datastore create options are kept as-is for backward compatibility but the
options will not be stored in the config.
Updating prune related options on the datastore has been disabled for a year
already.
src/api2/config/datastore.rs | 49 +++++++++++++++++++++++++++++-------
src/api2/config/prune.rs | 43 ++++++++++++++++++++-----------
2 files changed, 68 insertions(+), 24 deletions(-)
diff --git a/src/api2/config/datastore.rs b/src/api2/config/datastore.rs
index 5e013c39..746a5c01 100644
--- a/src/api2/config/datastore.rs
+++ b/src/api2/config/datastore.rs
@@ -9,11 +9,12 @@ use proxmox_router::{http_bail, Permission, Router, RpcEnvironment, RpcEnvironme
use proxmox_schema::{api, param_bail, ApiType};
use proxmox_section_config::SectionConfigData;
use proxmox_sys::{task_warn, WorkerTaskContext};
+use proxmox_uuid::Uuid;
use pbs_api_types::{
- Authid, DataStoreConfig, DataStoreConfigUpdater, DatastoreNotify, DatastoreTuning,
- DATASTORE_SCHEMA, PRIV_DATASTORE_ALLOCATE, PRIV_DATASTORE_AUDIT, PRIV_DATASTORE_MODIFY,
- PROXMOX_CONFIG_DIGEST_SCHEMA, UPID_SCHEMA,
+ Authid, DataStoreConfig, DataStoreConfigUpdater, DatastoreNotify, DatastoreTuning, KeepOptions,
+ PruneJobConfig, PruneJobOptions, DATASTORE_SCHEMA, PRIV_DATASTORE_ALLOCATE,
+ PRIV_DATASTORE_AUDIT, PRIV_DATASTORE_MODIFY, PROXMOX_CONFIG_DIGEST_SCHEMA, UPID_SCHEMA,
};
use pbs_config::BackupLockGuard;
use pbs_datastore::chunk_store::ChunkStore;
@@ -21,7 +22,7 @@ use pbs_datastore::chunk_store::ChunkStore;
use crate::api2::admin::{
prune::list_prune_jobs, sync::list_sync_jobs, verify::list_verification_jobs,
};
-use crate::api2::config::prune::delete_prune_job;
+use crate::api2::config::prune::{delete_prune_job, do_create_prune_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::verify::delete_verification_job;
@@ -91,10 +92,7 @@ pub(crate) fn do_create_datastore(
pbs_config::datastore::save_config(&config)?;
- jobstate::create_state_file("prune", &datastore.name)?;
- jobstate::create_state_file("garbage_collection", &datastore.name)?;
-
- Ok(())
+ jobstate::create_state_file("garbage_collection", &datastore.name)
}
#[api(
@@ -127,12 +125,45 @@ pub fn create_datastore(
let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
let to_stdout = rpcenv.env_type() == RpcEnvironmentType::CLI;
+ let prune_job_config = config.prune_schedule.as_ref().and_then(|schedule| {
+ let mut id = format!("default-{}-{}", config.name, Uuid::generate());
+ id.truncate(32);
+
+ Some(PruneJobConfig {
+ id,
+ store: config.name.clone(),
+ comment: None,
+ disable: false,
+ schedule: schedule.clone(),
+ options: PruneJobOptions {
+ keep: config.keep.clone(),
+ max_depth: None,
+ ns: None,
+ },
+ })
+ });
+
+ // clearing prune settings in the datastore config, as they are now handled by prune jobs
+ let config = DataStoreConfig {
+ prune_schedule: None,
+ keep: KeepOptions::default(),
+ ..config
+ };
+
WorkerTask::new_thread(
"create-datastore",
Some(config.name.to_string()),
auth_id.to_string(),
to_stdout,
- move |worker| do_create_datastore(lock, section_config, config, Some(&worker)),
+ move |worker| {
+ do_create_datastore(lock, section_config, config, Some(&worker))?;
+
+ if let Some(prune_job_config) = prune_job_config {
+ do_create_prune_job(prune_job_config, Some(&worker))
+ } else {
+ Ok(())
+ }
+ },
)
}
diff --git a/src/api2/config/prune.rs b/src/api2/config/prune.rs
index 6f391722..4f7ce39c 100644
--- a/src/api2/config/prune.rs
+++ b/src/api2/config/prune.rs
@@ -1,5 +1,7 @@
use anyhow::Error;
use hex::FromHex;
+use proxmox_sys::task_log;
+use proxmox_sys::WorkerTaskContext;
use serde::{Deserialize, Serialize};
use serde_json::Value;
@@ -56,6 +58,31 @@ pub fn list_prune_jobs(
Ok(list)
}
+pub fn do_create_prune_job(
+ config: PruneJobConfig,
+ worker: Option<&dyn WorkerTaskContext>,
+) -> Result<(), Error> {
+ let _lock = prune::lock_config()?;
+
+ let (mut section_config, _digest) = prune::config()?;
+
+ if section_config.sections.get(&config.id).is_some() {
+ param_bail!("id", "job '{}' already exists.", config.id);
+ }
+
+ section_config.set_data(&config.id, "prune", &config)?;
+
+ prune::save_config(§ion_config)?;
+
+ crate::server::jobstate::create_state_file("prunejob", &config.id)?;
+
+ if let Some(worker) = worker {
+ task_log!(worker, "Prune job created: {}", config.id);
+ }
+
+ Ok(())
+}
+
#[api(
protected: true,
input: {
@@ -81,21 +108,7 @@ pub fn create_prune_job(
user_info.check_privs(&auth_id, &config.acl_path(), PRIV_DATASTORE_MODIFY, true)?;
- let _lock = prune::lock_config()?;
-
- let (mut section_config, _digest) = prune::config()?;
-
- if section_config.sections.get(&config.id).is_some() {
- param_bail!("id", "job '{}' already exists.", config.id);
- }
-
- section_config.set_data(&config.id, "prune", &config)?;
-
- prune::save_config(§ion_config)?;
-
- crate::server::jobstate::create_state_file("prunejob", &config.id)?;
-
- Ok(())
+ do_create_prune_job(config, None)
}
#[api(
--
2.41.0
next reply other threads:[~2023-09-26 15:19 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-26 15:19 Stefan Lendl [this message]
2023-11-21 16:23 ` Stefan Lendl
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230926151940.2854416-1-s.lendl@proxmox.com \
--to=s.lendl@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal