]>
Commit | Line | Data |
---|---|---|
ba10f2b0 DM |
1 | use std::thread; |
2 | use std::path::PathBuf; | |
3 | use std::io::Write; | |
4 | ||
6ef1b649 WB |
5 | use anyhow::{bail, Error}; |
6 | ||
ba10f2b0 DM |
7 | // tar handle files that shrink during backup, by simply padding with zeros. |
8 | // | |
9 | // this binary run multiple thread which writes some large files, then truncates | |
10 | // them in a loop. | |
11 | ||
12 | // # tar cf test.tar ./dyntest1/ | |
13 | // tar: dyntest1/testfile0.dat: File shrank by 2768972800 bytes; padding with zeros | |
14 | // tar: dyntest1/testfile17.dat: File shrank by 2899853312 bytes; padding with zeros | |
15 | // tar: dyntest1/testfile2.dat: File shrank by 3093422080 bytes; padding with zeros | |
16 | // tar: dyntest1/testfile7.dat: File shrank by 2833252864 bytes; padding with zeros | |
17 | ||
18 | // # pxar create test.pxar ./dyntest1/ | |
add5861e | 19 | // Error: detected shrunk file "./dyntest1/testfile0.dat" (22020096 < 12679380992) |
ba10f2b0 DM |
20 | |
21 | fn create_large_file(path: PathBuf) { | |
22 | ||
23 | println!("TEST {:?}", path); | |
24 | ||
25 | let mut file = std::fs::OpenOptions::new() | |
26 | .write(true) | |
27 | .create_new(true) | |
28 | .open(&path).unwrap(); | |
29 | ||
30 | let buffer = vec![0u8; 64*1024]; | |
31 | ||
32 | loop { | |
33 | for _ in 0..64 { | |
34 | file.write_all(&buffer).unwrap(); | |
35 | } | |
36 | file.sync_all().unwrap(); | |
37 | //println!("TRUNCATE {:?}", path); | |
38 | file.set_len(0).unwrap(); | |
39 | } | |
40 | } | |
41 | ||
42 | fn main() -> Result<(), Error> { | |
43 | ||
44 | let base = PathBuf::from("dyntest1"); | |
45 | let _ = std::fs::create_dir(&base); | |
46 | ||
47 | let mut handles = vec![]; | |
48 | for i in 0..20 { | |
49 | let base = base.clone(); | |
50 | handles.push(thread::spawn(move || { | |
51 | create_large_file(base.join(format!("testfile{}.dat", i))); | |
52 | })); | |
53 | } | |
54 | ||
55 | for h in handles { | |
11377a47 | 56 | if h.join().is_err() { |
ba10f2b0 DM |
57 | bail!("join failed"); |
58 | } | |
59 | } | |
60 | ||
61 | Ok(()) | |
62 | } |