]> git.proxmox.com Git - proxmox-backup.git/commitdiff
log rotate: factor out compression in private function
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 20 Oct 2020 08:24:46 +0000 (10:24 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 20 Oct 2020 09:09:17 +0000 (11:09 +0200)
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
src/tools/logrotate.rs

index f7d1a693322166ff1d680c91e8444190a6618931..28e3b7bb69138f0bf081d18d2e6f8b2d72b2f985 100644 (file)
@@ -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 let Err(err) = encoder.finish() {
-                let _ = unistd::unlink(&tmp_path);
-                bail!("zstd finish 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) = 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) {