Skip to content

Commit b79295a

Browse files
committed
Fix Windows model loading: detect truncated copies in cache
1 parent 8362270 commit b79295a

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

src/models/cache.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,19 @@ impl ModelCache {
5858
pub fn link_model(&self, spec: &ModelSpec, source: &Path) -> Result<PathBuf, NodeError> {
5959
let dest = self.cache_dir.join(&spec.hf_file);
6060
if dest.exists() {
61-
// Already linked or copied
61+
// On non-unix (Windows) we copy files, so verify the copy isn't truncated.
62+
// A previous interrupted copy could leave a 0-byte or partial file.
63+
#[cfg(not(unix))]
64+
{
65+
let src_len = std::fs::metadata(source).map(|m| m.len()).unwrap_or(0);
66+
let dst_len = std::fs::metadata(&dest).map(|m| m.len()).unwrap_or(0);
67+
if src_len > 0 && dst_len != src_len {
68+
std::fs::remove_file(&dest)?;
69+
} else {
70+
return Ok(dest);
71+
}
72+
}
73+
#[cfg(unix)]
6274
return Ok(dest);
6375
}
6476

@@ -81,6 +93,17 @@ impl ModelCache {
8193
let prefixed = format!("{}_{}", spec.name.replace(':', "-"), file);
8294
let dest = self.cache_dir.join(&prefixed);
8395
if dest.exists() {
96+
#[cfg(not(unix))]
97+
{
98+
let src_len = std::fs::metadata(source).map(|m| m.len()).unwrap_or(0);
99+
let dst_len = std::fs::metadata(&dest).map(|m| m.len()).unwrap_or(0);
100+
if src_len > 0 && dst_len != src_len {
101+
std::fs::remove_file(&dest)?;
102+
} else {
103+
return Ok(dest);
104+
}
105+
}
106+
#[cfg(unix)]
84107
return Ok(dest);
85108
}
86109

0 commit comments

Comments
 (0)