From: Dominik Csapak <d.csapak@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup v5 1/5] api2/tape/restore: refactor restore code into its own function
Date: Tue, 11 May 2021 12:50:03 +0200 [thread overview]
Message-ID: <20210511105007.3980-2-d.csapak@proxmox.com> (raw)
In-Reply-To: <20210511105007.3980-1-d.csapak@proxmox.com>
and create the 'email' and 'restore_owner' variable at the beginning,
so that we can reuse them and do not have to pass the sources of those
through too many functions
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
src/api2/tape/restore.rs | 189 ++++++++++++++++++++++-----------------
1 file changed, 105 insertions(+), 84 deletions(-)
diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs
index 9884b379..d1298434 100644
--- a/src/api2/tape/restore.rs
+++ b/src/api2/tape/restore.rs
@@ -281,84 +281,26 @@ pub fn restore(
set_tape_device_state(&drive, &worker.upid().to_string())?;
- let members = inventory.compute_media_set_members(&media_set_uuid)?;
+ let restore_owner = owner.as_ref().unwrap_or(&auth_id);
- let media_list = members.media_list();
-
- let mut media_id_list = Vec::new();
-
- let mut encryption_key_fingerprint = None;
+ let email = notify_user
+ .as_ref()
+ .and_then(|userid| lookup_user_email(userid))
+ .or_else(|| lookup_user_email(&auth_id.clone().into()));
- for (seq_nr, media_uuid) in media_list.iter().enumerate() {
- match media_uuid {
- None => {
- bail!("media set {} is incomplete (missing member {}).", media_set_uuid, seq_nr);
- }
- Some(media_uuid) => {
- let media_id = inventory.lookup_media(media_uuid).unwrap();
- if let Some(ref set) = media_id.media_set_label { // always true here
- if encryption_key_fingerprint.is_none() && set.encryption_key_fingerprint.is_some() {
- encryption_key_fingerprint = set.encryption_key_fingerprint.clone();
- }
- }
- media_id_list.push(media_id);
- }
- }
- }
task_log!(worker, "Restore mediaset '{}'", media_set);
- if let Some(fingerprint) = encryption_key_fingerprint {
- task_log!(worker, "Encryption key fingerprint: {}", fingerprint);
- }
task_log!(worker, "Pool: {}", pool);
- task_log!(
- worker,
- "Datastore(s): {}",
- store_map
- .used_datastores()
- .into_iter()
- .map(String::from)
- .collect::<Vec<String>>()
- .join(", "),
+ let res = restore_worker(
+ worker.clone(),
+ inventory,
+ media_set_uuid,
+ drive_config,
+ &drive,
+ store_map,
+ restore_owner,
+ email
);
-
- task_log!(worker, "Drive: {}", drive);
- task_log!(
- worker,
- "Required media list: {}",
- media_id_list.iter()
- .map(|media_id| media_id.label.label_text.as_str())
- .collect::<Vec<&str>>()
- .join(";")
- );
-
- let mut datastore_locks = Vec::new();
- for store_name in store_map.used_datastores() {
- // explicit create shared lock to prevent GC on newly created chunks
- if let Some(store) = store_map.get_datastore(store_name) {
- let shared_store_lock = store.try_shared_chunk_store_lock()?;
- datastore_locks.push(shared_store_lock);
- }
- }
-
- let mut checked_chunks_map = HashMap::new();
-
- for media_id in media_id_list.iter() {
- request_and_restore_media(
- worker.clone(),
- media_id,
- &drive_config,
- &drive,
- &store_map,
- &mut checked_chunks_map,
- &auth_id,
- ¬ify_user,
- &owner,
- )?;
- }
-
- drop(datastore_locks);
-
task_log!(worker, "Restore mediaset '{}' done", media_set);
if let Err(err) = set_tape_device_state(&drive, "") {
@@ -370,13 +312,100 @@ pub fn restore(
);
}
- Ok(())
+ res
}
)?;
Ok(upid_str.into())
}
+fn restore_worker(
+ worker: Arc<WorkerTask>,
+ inventory: Inventory,
+ media_set_uuid: Uuid,
+ drive_config: SectionConfigData,
+ drive_name: &str,
+ store_map: DataStoreMap,
+ restore_owner: &Authid,
+ email: Option<String>,
+) -> Result<(), Error> {
+ let members = inventory.compute_media_set_members(&media_set_uuid)?;
+
+ let media_list = members.media_list();
+
+ let mut media_id_list = Vec::new();
+
+ let mut encryption_key_fingerprint = None;
+
+ for (seq_nr, media_uuid) in media_list.iter().enumerate() {
+ match media_uuid {
+ None => {
+ bail!("media set {} is incomplete (missing member {}).", media_set_uuid, seq_nr);
+ }
+ Some(media_uuid) => {
+ let media_id = inventory.lookup_media(media_uuid).unwrap();
+ if let Some(ref set) = media_id.media_set_label { // always true here
+ if encryption_key_fingerprint.is_none() && set.encryption_key_fingerprint.is_some() {
+ encryption_key_fingerprint = set.encryption_key_fingerprint.clone();
+ }
+ }
+ media_id_list.push(media_id);
+ }
+ }
+ }
+
+ if let Some(fingerprint) = encryption_key_fingerprint {
+ task_log!(worker, "Encryption key fingerprint: {}", fingerprint);
+ }
+
+ task_log!(
+ worker,
+ "Datastore(s): {}",
+ store_map
+ .used_datastores()
+ .into_iter()
+ .map(String::from)
+ .collect::<Vec<String>>()
+ .join(", "),
+ );
+
+ task_log!(worker, "Drive: {}", drive_name);
+ task_log!(
+ worker,
+ "Required media list: {}",
+ media_id_list.iter()
+ .map(|media_id| media_id.label.label_text.as_str())
+ .collect::<Vec<&str>>()
+ .join(";")
+ );
+
+ let mut datastore_locks = Vec::new();
+ for store_name in store_map.used_datastores() {
+ // explicit create shared lock to prevent GC on newly created chunks
+ if let Some(store) = store_map.get_datastore(store_name) {
+ let shared_store_lock = store.try_shared_chunk_store_lock()?;
+ datastore_locks.push(shared_store_lock);
+ }
+ }
+
+ let mut checked_chunks_map = HashMap::new();
+
+ for media_id in media_id_list.iter() {
+ request_and_restore_media(
+ worker.clone(),
+ media_id,
+ &drive_config,
+ drive_name,
+ &store_map,
+ &mut checked_chunks_map,
+ restore_owner,
+ &email,
+ )?;
+ }
+
+ Ok(())
+}
+
/// Request and restore complete media without using existing catalog (create catalog instead)
pub fn request_and_restore_media(
worker: Arc<WorkerTask>,
@@ -385,21 +414,15 @@ pub fn request_and_restore_media(
drive_name: &str,
store_map: &DataStoreMap,
checked_chunks_map: &mut HashMap<String, HashSet<[u8;32]>>,
- authid: &Authid,
- notify_user: &Option<Userid>,
- owner: &Option<Authid>,
+ restore_owner: &Authid,
+ email: &Option<String>,
) -> Result<(), Error> {
let media_set_uuid = match media_id.media_set_label {
None => bail!("restore_media: no media set - internal error"),
Some(ref set) => &set.uuid,
};
- let email = notify_user
- .as_ref()
- .and_then(|userid| lookup_user_email(userid))
- .or_else(|| lookup_user_email(&authid.clone().into()));
-
- let (mut drive, info) = request_and_load_media(&worker, &drive_config, &drive_name, &media_id.label, &email)?;
+ let (mut drive, info) = request_and_load_media(&worker, &drive_config, &drive_name, &media_id.label, email)?;
match info.media_set_label {
None => {
@@ -419,8 +442,6 @@ pub fn request_and_restore_media(
}
}
- let restore_owner = owner.as_ref().unwrap_or(authid);
-
restore_media(
worker,
&mut drive,
--
2.20.1
next prev parent reply other threads:[~2021-05-11 10:50 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-11 10:50 [pbs-devel] [PATCH proxmox-backup v5 0/5] tape: single snapshot restore Dominik Csapak
2021-05-11 10:50 ` Dominik Csapak [this message]
2021-05-11 10:50 ` [pbs-devel] [PATCH proxmox-backup v5 2/5] api2/tape/restore: add optional snapshots to 'restore' Dominik Csapak
2021-05-11 10:50 ` [pbs-devel] [PATCH proxmox-backup v5 3/5] tape/inventory: add completion helper for tape snapshots Dominik Csapak
2021-05-11 10:50 ` [pbs-devel] [PATCH proxmox-backup v5 4/5] bin/proxmox-tape: add optional snapshots to restore command Dominik Csapak
2021-05-11 10:50 ` [pbs-devel] [PATCH proxmox-backup v5 5/5] ui: tape: add single snapshot restore Dominik Csapak
2021-05-11 11:11 ` [pbs-devel] applied: [PATCH proxmox-backup v5 0/5] tape: " Dietmar Maurer
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=20210511105007.3980-2-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox