From: Dominik Csapak <d.csapak@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup 3/5] api/tape/inventory: optionally try to restore catalogs
Date: Thu, 19 May 2022 12:08:18 +0200 [thread overview]
Message-ID: <20220519100820.1829147-4-d.csapak@proxmox.com> (raw)
In-Reply-To: <20220519100820.1829147-1-d.csapak@proxmox.com>
in a disaster recovery case, it is useful to not only re-invetorize
the labels + media-sets, but also to try to recover the catalogs
from the tape (to know whats on there). This adds an option to
the inventory api call that tries to do a fast catalog restore
from each tape to be inventorized.
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
src/api2/tape/drive.rs | 41 +++++++++++++++++++++++++++++++++++------
1 file changed, 35 insertions(+), 6 deletions(-)
diff --git a/src/api2/tape/drive.rs b/src/api2/tape/drive.rs
index 28c0f0f5..3394afe9 100644
--- a/src/api2/tape/drive.rs
+++ b/src/api2/tape/drive.rs
@@ -848,6 +848,13 @@ pub async fn inventory(drive: String) -> Result<Vec<LabelUuidMap>, Error> {
"read-all-labels": {
description: "Load all tapes and try read labels (even if already inventoried)",
type: bool,
+ default: false,
+ optional: true,
+ },
+ "catalog": {
+ description: "Restore the catalog from tape.",
+ type: bool,
+ default: false,
optional: true,
},
},
@@ -867,10 +874,13 @@ pub async fn inventory(drive: String) -> Result<Vec<LabelUuidMap>, Error> {
/// then loads any unknown media into the drive, reads the label, and
/// store the result to the media database.
///
+/// If `catalog` is true, also tries to restore the catalog from tape.
+///
/// Note: This updates the media online status.
pub fn update_inventory(
drive: String,
read_all_labels: Option<bool>,
+ catalog: Option<bool>,
rpcenv: &mut dyn RpcEnvironment,
) -> Result<Value, Error> {
let upid_str = run_drive_worker(
@@ -889,6 +899,8 @@ pub fn update_inventory(
let mut inventory = Inventory::load(TAPE_STATUS_DIR)?;
update_changer_online_status(&config, &mut inventory, &changer_name, &label_text_list)?;
+ let catalog = catalog.unwrap_or(false);
+ let read_all_labels = read_all_labels.unwrap_or(false);
for label_text in label_text_list.iter() {
if label_text.starts_with("CLN") {
@@ -898,11 +910,13 @@ pub fn update_inventory(
let label_text = label_text.to_string();
- if !read_all_labels.unwrap_or(false)
- && inventory.find_media_by_label_text(&label_text).is_some()
- {
- task_log!(worker, "media '{}' already inventoried", label_text);
- continue;
+ if !read_all_labels {
+ if let Some(media_id) = inventory.find_media_by_label_text(&label_text) {
+ if !catalog || MediaCatalog::exists(TAPE_STATUS_DIR, &media_id.label.uuid) {
+ task_log!(worker, "media '{}' already inventoried", label_text);
+ continue;
+ }
+ }
}
if let Err(err) = changer.load_media(&label_text) {
@@ -947,7 +961,22 @@ pub fn update_inventory(
let _pool_lock = lock_media_pool(TAPE_STATUS_DIR, pool)?;
let _lock = lock_media_set(TAPE_STATUS_DIR, uuid, None)?;
MediaCatalog::destroy_unrelated_catalog(TAPE_STATUS_DIR, &media_id)?;
- inventory.store(media_id, false)?;
+ inventory.store(media_id.clone(), false)?;
+
+ if catalog {
+ let media_set = inventory.compute_media_set_members(uuid)?;
+ if let Err(err) = fast_catalog_restore(
+ &worker,
+ &mut drive,
+ &media_set,
+ &media_id.label.uuid,
+ ) {
+ task_warn!(
+ worker,
+ "could not restore catalog for {label_text}: {err}"
+ );
+ }
+ }
} else {
let _lock = lock_unassigned_media_pool(TAPE_STATUS_DIR)?;
MediaCatalog::destroy(TAPE_STATUS_DIR, &media_id.label.uuid)?;
--
2.30.2
next prev parent reply other threads:[~2022-05-19 10:08 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-19 10:08 [pbs-devel] [PATCH proxmox-backup 0/5] allow restoring catalogs during inventory Dominik Csapak
2022-05-19 10:08 ` [pbs-devel] [PATCH proxmox-backup 1/5] tape/inventory: make 'load_media_db' a method Dominik Csapak
2022-10-05 17:32 ` [pbs-devel] applied: " Thomas Lamprecht
2022-05-19 10:08 ` [pbs-devel] [PATCH proxmox-backup 2/5] tape: replace '&Path' with 'AsRef<Path>' in function parameters Dominik Csapak
2022-05-19 10:08 ` Dominik Csapak [this message]
2022-05-19 10:08 ` [pbs-devel] [PATCH proxmox-backup 4/5] proxmox-tape: add 'catalog' option to 'proxmox-tape inventory' Dominik Csapak
2022-05-19 10:08 ` [pbs-devel] [PATCH proxmox-backup 5/5] ui: tape/ChangerStatus: adding parameter selection to inventory Dominik Csapak
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=20220519100820.1829147-4-d.csapak@proxmox.com \
--to=d.csapak@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