all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pbs-devel] [PATCH proxmox-backup 1/2] api2/tape/backup: add 'force-media-set' parameter to manual backup
@ 2021-05-10 14:45 Dominik Csapak
  2021-05-10 14:45 ` [pbs-devel] [PATCH proxmox-backup 2/2] ui: tape: add 'Force new Media Set' checkbox " Dominik Csapak
  2021-05-14  6:59 ` [pbs-devel] applied: [PATCH proxmox-backup 1/2] api2/tape/backup: add 'force-media-set' parameter " Dietmar Maurer
  0 siblings, 2 replies; 3+ messages in thread
From: Dominik Csapak @ 2021-05-10 14:45 UTC (permalink / raw)
  To: pbs-devel

so that a user can force a new media set, e.g. if he uses the
allocation policy 'continue', but wants to manually start a new
media-set.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 src/api2/tape/backup.rs     | 18 +++++++++++++++++-
 src/api2/tape/media.rs      |  2 +-
 src/tape/media_pool.rs      | 17 +++++++++++------
 src/tape/pool_writer/mod.rs |  3 ++-
 4 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/src/api2/tape/backup.rs b/src/api2/tape/backup.rs
index 4dc35945..77b11bb0 100644
--- a/src/api2/tape/backup.rs
+++ b/src/api2/tape/backup.rs
@@ -226,6 +226,7 @@ pub fn do_tape_backup_job(
                     &setup,
                     email.clone(),
                     &mut summary,
+                    false,
                 )
             });
 
@@ -312,6 +313,12 @@ pub fn run_tape_backup_job(
                 type: TapeBackupJobSetup,
                 flatten: true,
             },
+            "force-media-set": {
+                description: "Ignore the allocation policy and start a new media-set.",
+                optional: true,
+                type: bool,
+                default: false,
+            },
         },
     },
     returns: {
@@ -327,6 +334,7 @@ pub fn run_tape_backup_job(
 /// Backup datastore to tape media pool
 pub fn backup(
     setup: TapeBackupJobSetup,
+    force_media_set: bool,
     rpcenv: &mut dyn RpcEnvironment,
 ) -> Result<Value, Error> {
 
@@ -373,6 +381,7 @@ pub fn backup(
                 &setup,
                 email.clone(),
                 &mut summary,
+                force_media_set,
             );
 
             if let Some(email) = email {
@@ -403,6 +412,7 @@ fn backup_worker(
     setup: &TapeBackupJobSetup,
     email: Option<String>,
     summary: &mut TapeBackupJobSummary,
+    force_media_set: bool,
 ) -> Result<(), Error> {
 
     let status_path = Path::new(TAPE_STATUS_DIR);
@@ -413,7 +423,13 @@ fn backup_worker(
 
     let pool = MediaPool::with_config(status_path, &pool_config, changer_name, false)?;
 
-    let mut pool_writer = PoolWriter::new(pool, &setup.drive, worker, email)?;
+    let mut pool_writer = PoolWriter::new(
+        pool,
+        &setup.drive,
+        worker,
+        email,
+        force_media_set
+    )?;
 
     let mut group_list = BackupInfo::list_backup_groups(&datastore.base_path())?;
 
diff --git a/src/api2/tape/media.rs b/src/api2/tape/media.rs
index 811fcb7e..683c74b8 100644
--- a/src/api2/tape/media.rs
+++ b/src/api2/tape/media.rs
@@ -129,7 +129,7 @@ pub async fn list_media(
         // Call start_write_session, so that we show the same status a
         // backup job would see.
         pool.force_media_availability();
-        pool.start_write_session(current_time)?;
+        pool.start_write_session(current_time, false)?;
 
         for media in pool.list_media() {
             let expired = pool.media_is_expired(&media, current_time);
diff --git a/src/tape/media_pool.rs b/src/tape/media_pool.rs
index 039b46fc..dd471551 100644
--- a/src/tape/media_pool.rs
+++ b/src/tape/media_pool.rs
@@ -258,7 +258,7 @@ impl MediaPool {
     /// Make sure the current media set is usable for writing
     ///
     /// If not, starts a new media set. Also creates a new
-    /// set if media_set_policy implies it.
+    /// set if media_set_policy implies it, or if 'force' is true.
     ///
     /// Note: We also call this in list_media to compute correct media
     /// status, so this must not change persistent/saved state.
@@ -267,6 +267,7 @@ impl MediaPool {
     pub fn start_write_session(
         &mut self,
         current_time: i64,
+        force: bool,
     ) -> Result<Option<String>, Error> {
 
         let _pool_lock = if self.no_media_set_locking {
@@ -277,11 +278,15 @@ impl MediaPool {
 
         self.inventory.reload()?;
 
-        let mut create_new_set = match self.current_set_usable() {
-             Err(err) => {
-                 Some(err.to_string())
-             }
-             Ok(_) => None,
+        let mut create_new_set = if force {
+            Some(String::from("forced"))
+        } else {
+            match self.current_set_usable() {
+                Err(err) => {
+                    Some(err.to_string())
+                }
+                Ok(_) => None,
+            }
         };
 
         if create_new_set.is_none() {
diff --git a/src/tape/pool_writer/mod.rs b/src/tape/pool_writer/mod.rs
index 99fdb48c..a788cbeb 100644
--- a/src/tape/pool_writer/mod.rs
+++ b/src/tape/pool_writer/mod.rs
@@ -71,11 +71,12 @@ impl PoolWriter {
         drive_name: &str,
         worker: &WorkerTask,
         notify_email: Option<String>,
+        force_media_set: bool,
     ) -> Result<Self, Error> {
 
         let current_time = proxmox::tools::time::epoch_i64();
 
-        let new_media_set_reason = pool.start_write_session(current_time)?;
+        let new_media_set_reason = pool.start_write_session(current_time, force_media_set)?;
         if let Some(reason) = new_media_set_reason {
             task_log!(
                 worker,
-- 
2.20.1





^ permalink raw reply	[flat|nested] 3+ messages in thread

* [pbs-devel] [PATCH proxmox-backup 2/2] ui: tape: add 'Force new Media Set' checkbox to manual backup
  2021-05-10 14:45 [pbs-devel] [PATCH proxmox-backup 1/2] api2/tape/backup: add 'force-media-set' parameter to manual backup Dominik Csapak
@ 2021-05-10 14:45 ` Dominik Csapak
  2021-05-14  6:59 ` [pbs-devel] applied: [PATCH proxmox-backup 1/2] api2/tape/backup: add 'force-media-set' parameter " Dietmar Maurer
  1 sibling, 0 replies; 3+ messages in thread
From: Dominik Csapak @ 2021-05-10 14:45 UTC (permalink / raw)
  To: pbs-devel

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 www/tape/window/TapeBackup.js | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/www/tape/window/TapeBackup.js b/www/tape/window/TapeBackup.js
index b6a08bb5..0a5cb3c5 100644
--- a/www/tape/window/TapeBackup.js
+++ b/www/tape/window/TapeBackup.js
@@ -10,7 +10,7 @@ Ext.define('PBS.TapeManagement.TapeBackupWindow', {
     isCreate: true,
 
     defaults: {
-	labelWidth: 120,
+	labelWidth: 150,
     },
 
     items: [
@@ -29,6 +29,11 @@ Ext.define('PBS.TapeManagement.TapeBackupWindow', {
 	    fieldLabel: gettext('Drive'),
 	    name: 'drive',
 	},
+	{
+	    xtype: 'proxmoxcheckbox',
+	    name: 'force-media-set',
+	    fieldLabel: gettext('Force new Media Set'),
+	},
 	{
 	    xtype: 'proxmoxcheckbox',
 	    name: 'export-media-set',
-- 
2.20.1





^ permalink raw reply	[flat|nested] 3+ messages in thread

* [pbs-devel] applied: [PATCH proxmox-backup 1/2] api2/tape/backup: add 'force-media-set' parameter to manual backup
  2021-05-10 14:45 [pbs-devel] [PATCH proxmox-backup 1/2] api2/tape/backup: add 'force-media-set' parameter to manual backup Dominik Csapak
  2021-05-10 14:45 ` [pbs-devel] [PATCH proxmox-backup 2/2] ui: tape: add 'Force new Media Set' checkbox " Dominik Csapak
@ 2021-05-14  6:59 ` Dietmar Maurer
  1 sibling, 0 replies; 3+ messages in thread
From: Dietmar Maurer @ 2021-05-14  6:59 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion, Dominik Csapak

applied both patches

On 5/10/21 4:45 PM, Dominik Csapak wrote:
> so that a user can force a new media set, e.g. if he uses the
> allocation policy 'continue', but wants to manually start a new
> media-set.
>
> Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
> ---
>   src/api2/tape/backup.rs     | 18 +++++++++++++++++-
>   src/api2/tape/media.rs      |  2 +-
>   src/tape/media_pool.rs      | 17 +++++++++++------
>   src/tape/pool_writer/mod.rs |  3 ++-
>   4 files changed, 31 insertions(+), 9 deletions(-)
>
> diff --git a/src/api2/tape/backup.rs b/src/api2/tape/backup.rs
> index 4dc35945..77b11bb0 100644
> --- a/src/api2/tape/backup.rs
> +++ b/src/api2/tape/backup.rs
> @@ -226,6 +226,7 @@ pub fn do_tape_backup_job(
>                       &setup,
>                       email.clone(),
>                       &mut summary,
> +                    false,
>                   )
>               });
>   
> @@ -312,6 +313,12 @@ pub fn run_tape_backup_job(
>                   type: TapeBackupJobSetup,
>                   flatten: true,
>               },
> +            "force-media-set": {
> +                description: "Ignore the allocation policy and start a new media-set.",
> +                optional: true,
> +                type: bool,
> +                default: false,
> +            },
>           },
>       },
>       returns: {
> @@ -327,6 +334,7 @@ pub fn run_tape_backup_job(
>   /// Backup datastore to tape media pool
>   pub fn backup(
>       setup: TapeBackupJobSetup,
> +    force_media_set: bool,
>       rpcenv: &mut dyn RpcEnvironment,
>   ) -> Result<Value, Error> {
>   
> @@ -373,6 +381,7 @@ pub fn backup(
>                   &setup,
>                   email.clone(),
>                   &mut summary,
> +                force_media_set,
>               );
>   
>               if let Some(email) = email {
> @@ -403,6 +412,7 @@ fn backup_worker(
>       setup: &TapeBackupJobSetup,
>       email: Option<String>,
>       summary: &mut TapeBackupJobSummary,
> +    force_media_set: bool,
>   ) -> Result<(), Error> {
>   
>       let status_path = Path::new(TAPE_STATUS_DIR);
> @@ -413,7 +423,13 @@ fn backup_worker(
>   
>       let pool = MediaPool::with_config(status_path, &pool_config, changer_name, false)?;
>   
> -    let mut pool_writer = PoolWriter::new(pool, &setup.drive, worker, email)?;
> +    let mut pool_writer = PoolWriter::new(
> +        pool,
> +        &setup.drive,
> +        worker,
> +        email,
> +        force_media_set
> +    )?;
>   
>       let mut group_list = BackupInfo::list_backup_groups(&datastore.base_path())?;
>   
> diff --git a/src/api2/tape/media.rs b/src/api2/tape/media.rs
> index 811fcb7e..683c74b8 100644
> --- a/src/api2/tape/media.rs
> +++ b/src/api2/tape/media.rs
> @@ -129,7 +129,7 @@ pub async fn list_media(
>           // Call start_write_session, so that we show the same status a
>           // backup job would see.
>           pool.force_media_availability();
> -        pool.start_write_session(current_time)?;
> +        pool.start_write_session(current_time, false)?;
>   
>           for media in pool.list_media() {
>               let expired = pool.media_is_expired(&media, current_time);
> diff --git a/src/tape/media_pool.rs b/src/tape/media_pool.rs
> index 039b46fc..dd471551 100644
> --- a/src/tape/media_pool.rs
> +++ b/src/tape/media_pool.rs
> @@ -258,7 +258,7 @@ impl MediaPool {
>       /// Make sure the current media set is usable for writing
>       ///
>       /// If not, starts a new media set. Also creates a new
> -    /// set if media_set_policy implies it.
> +    /// set if media_set_policy implies it, or if 'force' is true.
>       ///
>       /// Note: We also call this in list_media to compute correct media
>       /// status, so this must not change persistent/saved state.
> @@ -267,6 +267,7 @@ impl MediaPool {
>       pub fn start_write_session(
>           &mut self,
>           current_time: i64,
> +        force: bool,
>       ) -> Result<Option<String>, Error> {
>   
>           let _pool_lock = if self.no_media_set_locking {
> @@ -277,11 +278,15 @@ impl MediaPool {
>   
>           self.inventory.reload()?;
>   
> -        let mut create_new_set = match self.current_set_usable() {
> -             Err(err) => {
> -                 Some(err.to_string())
> -             }
> -             Ok(_) => None,
> +        let mut create_new_set = if force {
> +            Some(String::from("forced"))
> +        } else {
> +            match self.current_set_usable() {
> +                Err(err) => {
> +                    Some(err.to_string())
> +                }
> +                Ok(_) => None,
> +            }
>           };
>   
>           if create_new_set.is_none() {
> diff --git a/src/tape/pool_writer/mod.rs b/src/tape/pool_writer/mod.rs
> index 99fdb48c..a788cbeb 100644
> --- a/src/tape/pool_writer/mod.rs
> +++ b/src/tape/pool_writer/mod.rs
> @@ -71,11 +71,12 @@ impl PoolWriter {
>           drive_name: &str,
>           worker: &WorkerTask,
>           notify_email: Option<String>,
> +        force_media_set: bool,
>       ) -> Result<Self, Error> {
>   
>           let current_time = proxmox::tools::time::epoch_i64();
>   
> -        let new_media_set_reason = pool.start_write_session(current_time)?;
> +        let new_media_set_reason = pool.start_write_session(current_time, force_media_set)?;
>           if let Some(reason) = new_media_set_reason {
>               task_log!(
>                   worker,




^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-05-14  7:00 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-10 14:45 [pbs-devel] [PATCH proxmox-backup 1/2] api2/tape/backup: add 'force-media-set' parameter to manual backup Dominik Csapak
2021-05-10 14:45 ` [pbs-devel] [PATCH proxmox-backup 2/2] ui: tape: add 'Force new Media Set' checkbox " Dominik Csapak
2021-05-14  6:59 ` [pbs-devel] applied: [PATCH proxmox-backup 1/2] api2/tape/backup: add 'force-media-set' parameter " Dietmar Maurer

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