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:
parent
476b4acadc
commit
5d85847f91
|
@ -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,9 +1009,10 @@ async fn create_backup(
|
||||||
|
|
||||||
drop(catalog); // close upload stream
|
drop(catalog); // close upload stream
|
||||||
|
|
||||||
let stats = catalog_result_rx.await??;
|
if let Some(catalog_result_rx) = catalog_result_tx {
|
||||||
|
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 {
|
||||||
|
|
Loading…
Reference in New Issue