src/client/pull.rs: also download client.log.blob
This commit is contained in:
		| @ -11,7 +11,7 @@ use super::backup_info::{BackupGroup, BackupDir}; | ||||
| use super::chunk_store::ChunkStore; | ||||
| use super::dynamic_index::{DynamicIndexReader, DynamicIndexWriter}; | ||||
| use super::fixed_index::{FixedIndexReader, FixedIndexWriter}; | ||||
| use super::manifest::{MANIFEST_BLOB_NAME, BackupManifest}; | ||||
| use super::manifest::{MANIFEST_BLOB_NAME, CLIENT_LOG_BLOB_NAME, BackupManifest}; | ||||
| use super::index::*; | ||||
| use super::{DataBlob, ArchiveType, archive_type}; | ||||
| use crate::config::datastore; | ||||
| @ -149,6 +149,7 @@ impl DataStore { | ||||
|  | ||||
|         let mut wanted_files = HashSet::new(); | ||||
|         wanted_files.insert(MANIFEST_BLOB_NAME.to_string()); | ||||
|         wanted_files.insert(CLIENT_LOG_BLOB_NAME.to_string()); | ||||
|         manifest.files().iter().for_each(|item| { wanted_files.insert(item.filename.clone()); }); | ||||
|  | ||||
|         for item in tools::fs::read_subdir(libc::AT_FDCWD, &full_path)? { | ||||
|  | ||||
| @ -106,6 +106,34 @@ async fn pull_single_archive( | ||||
|     Ok(()) | ||||
| } | ||||
|  | ||||
| // Note: The client.log.blob is uploaded after the backup, so it is | ||||
| // not mentioned in the manifest. | ||||
| async fn try_client_log_download( | ||||
|     worker: &WorkerTask, | ||||
|     reader: Arc<BackupReader>, | ||||
|     path: &std::path::Path, | ||||
| ) -> Result<(), Error> { | ||||
|  | ||||
|     let mut tmp_path = path.to_owned(); | ||||
|     tmp_path.set_extension("tmp"); | ||||
|  | ||||
|     let tmpfile = std::fs::OpenOptions::new() | ||||
|         .write(true) | ||||
|         .create(true) | ||||
|         .read(true) | ||||
|         .open(&tmp_path)?; | ||||
|  | ||||
|     // Note: be silent if there is no log - only log sucessful download | ||||
|     if let Ok(_) = reader.download(CLIENT_LOG_BLOB_NAME, tmpfile).await { | ||||
|         if let Err(err) = std::fs::rename(&tmp_path, &path) { | ||||
|             bail!("Atomic rename file {:?} failed - {}", path, err); | ||||
|         } | ||||
|         worker.log(format!("got bakup log file {:?}", CLIENT_LOG_BLOB_NAME)); | ||||
|     } | ||||
|  | ||||
|     Ok(()) | ||||
| } | ||||
|  | ||||
| async fn pull_snapshot( | ||||
|     worker: &WorkerTask, | ||||
|     reader: Arc<BackupReader>, | ||||
| @ -117,6 +145,10 @@ async fn pull_snapshot( | ||||
|     manifest_name.push(snapshot.relative_path()); | ||||
|     manifest_name.push(MANIFEST_BLOB_NAME); | ||||
|  | ||||
|     let mut client_log_name = tgt_store.base_path(); | ||||
|     client_log_name.push(snapshot.relative_path()); | ||||
|     client_log_name.push(CLIENT_LOG_BLOB_NAME); | ||||
|  | ||||
|     let mut tmp_manifest_name = manifest_name.clone(); | ||||
|     tmp_manifest_name.set_extension("tmp"); | ||||
|  | ||||
| @ -137,7 +169,10 @@ async fn pull_snapshot( | ||||
|         })?; | ||||
|  | ||||
|         if manifest_blob.raw_data() == tmp_manifest_blob.raw_data() { | ||||
|             worker.log("nothing changed - skip sync"); | ||||
|             if !client_log_name.exists() { | ||||
|                 try_client_log_download(worker, reader, &client_log_name).await?; | ||||
|             } | ||||
|             worker.log("no data changes"); | ||||
|             return Ok(()); // nothing changed | ||||
|         } | ||||
|     } | ||||
| @ -200,6 +235,10 @@ async fn pull_snapshot( | ||||
|         bail!("Atomic rename file {:?} failed - {}", manifest_name, err); | ||||
|     } | ||||
|  | ||||
|     if !client_log_name.exists() { | ||||
|         try_client_log_download(worker, reader, &client_log_name).await?; | ||||
|     } | ||||
|  | ||||
|     // cleanup - remove stale files | ||||
|     tgt_store.cleanup_backup_dir(snapshot, &manifest)?; | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user