[pbs-devel] applied: [PATCH backup 2/4] log rotate: factor out compression in private function
Thomas Lamprecht
t.lamprecht at proxmox.com
Tue Oct 20 11:10:42 CEST 2020
Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
---
src/tools/logrotate.rs | 58 ++++++++++++++++++++++--------------------
1 file changed, 31 insertions(+), 27 deletions(-)
diff --git a/src/tools/logrotate.rs b/src/tools/logrotate.rs
index f7d1a693..28e3b7bb 100644
--- a/src/tools/logrotate.rs
+++ b/src/tools/logrotate.rs
@@ -46,6 +46,35 @@ impl LogRotate {
}
}
+ fn compress(file: &PathBuf, options: &CreateOptions) -> Result<(), Error> {
+ let mut source = File::open(file)?;
+ let (fd, tmp_path) = make_tmp_file(file, options.clone())?;
+ let target = unsafe { File::from_raw_fd(fd) };
+ let mut encoder = match zstd::stream::write::Encoder::new(target, 0) {
+ Ok(encoder) => encoder,
+ Err(err) => {
+ let _ = unistd::unlink(&tmp_path);
+ bail!("creating zstd encoder failed - {}", err);
+ }
+ };
+
+ if let Err(err) = std::io::copy(&mut source, &mut encoder) {
+ let _ = unistd::unlink(&tmp_path);
+ bail!("zstd encoding failed for file {:?} - {}", file, err);
+ }
+
+ if let Err(err) = encoder.finish() {
+ let _ = unistd::unlink(&tmp_path);
+ bail!("zstd finish failed for file {:?} - {}", file, err);
+ }
+
+ if let Err(err) = rename(&tmp_path, file) {
+ let _ = unistd::unlink(&tmp_path);
+ bail!("rename failed for file {:?} - {}", file, err);
+ }
+ Ok(())
+ }
+
/// Rotates the files up to 'max_files'
/// if the 'compress' option was given it will compress the newest file
///
@@ -77,38 +106,13 @@ impl LogRotate {
}
if self.compress {
- let mut source = File::open(&filenames[0])?;
- let (fd, tmp_path) = make_tmp_file(&filenames[1], options.clone())?;
- let target = unsafe { File::from_raw_fd(fd) };
- let mut encoder = match zstd::stream::write::Encoder::new(target, 0) {
- Ok(encoder) => encoder,
- Err(err) => {
- let _ = unistd::unlink(&tmp_path);
- bail!("creating zstd encoder failed - {}", err);
- }
- };
-
- if let Err(err) = std::io::copy(&mut source, &mut encoder) {
- let _ = unistd::unlink(&tmp_path);
- bail!("zstd encoding failed for file {:?} - {}", &filenames[1], err);
+ if filenames[0].extension().unwrap_or(std::ffi::OsStr::new("")) != "zst" {
+ Self::compress(&filenames[0], &options)?;
}
-
- if let Err(err) = encoder.finish() {
- let _ = unistd::unlink(&tmp_path);
- bail!("zstd finish failed for file {:?} - {}", &filenames[1], err);
- }
-
- if let Err(err) = rename(&tmp_path, &filenames[1]) {
- let _ = unistd::unlink(&tmp_path);
- bail!("rename failed for file {:?} - {}", &filenames[1], err);
- }
-
- unistd::unlink(&filenames[0])?;
} else {
rename(&filenames[0], &filenames[1])?;
}
-
if let Some(max_files) = max_files {
// delete all files > max_files
for file in filenames.iter().skip(max_files) {
--
2.27.0
More information about the pbs-devel
mailing list