client: only start catalog upload if we have one

else we start a dynamic writer and never close it, leading to a backup error

this fixes an issue with backing up vm templates
(and possibly vms without disks)

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
Dominik Csapak 2020-06-12 10:04:59 +02:00 committed by Wolfgang Bumiller
parent 476b4acadc
commit 5d85847f91
1 changed files with 15 additions and 8 deletions

View File

@ -849,8 +849,6 @@ async fn create_backup(
let mut upload_list = vec![]; let mut upload_list = vec![];
let mut upload_catalog = false;
for backupspec in backupspec_list { for backupspec in backupspec_list {
let spec = parse_backup_specification(backupspec.as_str().unwrap())?; let spec = parse_backup_specification(backupspec.as_str().unwrap())?;
let filename = &spec.config_string; let filename = &spec.config_string;
@ -868,7 +866,6 @@ async fn create_backup(
bail!("got unexpected file type (expected directory)"); bail!("got unexpected file type (expected directory)");
} }
upload_list.push((BackupSpecificationType::PXAR, filename.to_owned(), format!("{}.didx", target), 0)); upload_list.push((BackupSpecificationType::PXAR, filename.to_owned(), format!("{}.didx", target), 0));
upload_catalog = true;
} }
BackupSpecificationType::IMAGE => { BackupSpecificationType::IMAGE => {
if !(file_type.is_file() || file_type.is_block_device()) { if !(file_type.is_file() || file_type.is_block_device()) {
@ -940,7 +937,8 @@ async fn create_backup(
let snapshot = BackupDir::new(backup_type, backup_id, backup_time.timestamp()); let snapshot = BackupDir::new(backup_type, backup_id, backup_time.timestamp());
let mut manifest = BackupManifest::new(snapshot); let mut manifest = BackupManifest::new(snapshot);
let (catalog, catalog_result_rx) = spawn_catalog_upload(client.clone(), crypt_config.clone())?; let mut catalog = None;
let mut catalog_result_tx = None;
for (backup_type, filename, target, size) in upload_list { for (backup_type, filename, target, size) in upload_list {
match backup_type { match backup_type {
@ -959,6 +957,14 @@ async fn create_backup(
manifest.add_file(target, stats.size, stats.csum)?; manifest.add_file(target, stats.size, stats.csum)?;
} }
BackupSpecificationType::PXAR => { BackupSpecificationType::PXAR => {
// start catalog upload on first use
if catalog.is_none() {
let (cat, res) = spawn_catalog_upload(client.clone(), crypt_config.clone())?;
catalog = Some(cat);
catalog_result_tx = Some(res);
}
let catalog = catalog.as_ref().unwrap();
println!("Upload directory '{}' to '{:?}' as {}", filename, repo, target); println!("Upload directory '{}' to '{:?}' as {}", filename, repo, target);
catalog.lock().unwrap().start_directory(std::ffi::CString::new(target.as_str())?.as_c_str())?; catalog.lock().unwrap().start_directory(std::ffi::CString::new(target.as_str())?.as_c_str())?;
let stats = backup_directory( let stats = backup_directory(
@ -994,7 +1000,7 @@ async fn create_backup(
} }
// finalize and upload catalog // finalize and upload catalog
if upload_catalog { if let Some(catalog) = catalog {
let mutex = Arc::try_unwrap(catalog) let mutex = Arc::try_unwrap(catalog)
.map_err(|_| format_err!("unable to get catalog (still used)"))?; .map_err(|_| format_err!("unable to get catalog (still used)"))?;
let mut catalog = mutex.into_inner().unwrap(); let mut catalog = mutex.into_inner().unwrap();
@ -1003,10 +1009,11 @@ async fn create_backup(
drop(catalog); // close upload stream drop(catalog); // close upload stream
if let Some(catalog_result_rx) = catalog_result_tx {
let stats = catalog_result_rx.await??; let stats = catalog_result_rx.await??;
manifest.add_file(CATALOG_NAME.to_owned(), stats.size, stats.csum)?; manifest.add_file(CATALOG_NAME.to_owned(), stats.size, stats.csum)?;
} }
}
if let Some(rsa_encrypted_key) = rsa_encrypted_key { if let Some(rsa_encrypted_key) = rsa_encrypted_key {
let target = "rsa-encrypted.key"; let target = "rsa-encrypted.key";