Skip to content

Commit 3876e7a

Browse files
committed
add retry support to recursive_remove
1 parent 58c2dd9 commit 3876e7a

File tree

1 file changed

+36
-14
lines changed

1 file changed

+36
-14
lines changed

src/build_helper/src/fs/mod.rs

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,47 @@ where
3131
///
3232
/// FIXME: this implementation is insufficiently robust to replace bootstrap's clean `rm_rf`
3333
/// implementation:
34-
///
35-
/// - This implementation currently does not perform retries.
3634
#[track_caller]
3735
pub fn recursive_remove<P: AsRef<Path>>(path: P) -> io::Result<()> {
3836
let path = path.as_ref();
39-
let metadata = fs::symlink_metadata(path)?;
40-
#[cfg(windows)]
41-
let is_dir_like = |meta: &fs::Metadata| {
42-
use std::os::windows::fs::FileTypeExt;
43-
meta.is_dir() || meta.file_type().is_symlink_dir()
44-
};
45-
#[cfg(not(windows))]
46-
let is_dir_like = fs::Metadata::is_dir;
4737

48-
if is_dir_like(&metadata) {
49-
fs::remove_dir_all(path)
50-
} else {
51-
try_remove_op_set_perms(fs::remove_file, path, metadata)
38+
for retry in 0..5 {
39+
match fs::symlink_metadata(path) {
40+
Ok(metadata) => {
41+
#[cfg(windows)]
42+
let is_dir_like = |meta: &fs::Metadata| {
43+
use std::os::windows::fs::FileTypeExt;
44+
meta.is_dir() || meta.file_type().is_symlink_dir()
45+
};
46+
#[cfg(not(windows))]
47+
let is_dir_like = fs::Metadata::is_dir;
48+
49+
let result = if is_dir_like(&metadata) {
50+
fs::remove_dir_all(path)
51+
} else {
52+
try_remove_op_set_perms(fs::remove_file, path, metadata)
53+
};
54+
55+
match result {
56+
Ok(()) => return Ok(()),
57+
Err(_) if retry < 4 => {
58+
continue;
59+
}
60+
Err(e) => return Err(e),
61+
}
62+
}
63+
64+
Err(e) if e.kind() == io::ErrorKind::NotFound => return Ok(()),
65+
66+
Err(_) if retry < 4 => {
67+
continue;
68+
}
69+
70+
Err(e) => return Err(e),
71+
}
5272
}
73+
74+
Ok(())
5375
}
5476

5577
fn try_remove_op_set_perms<'p, Op>(mut op: Op, path: &'p Path, metadata: Metadata) -> io::Result<()>

0 commit comments

Comments
 (0)