fix? (#388)
This commit is contained in:
parent
381b8a8bfb
commit
4734d56021
1 changed files with 42 additions and 4 deletions
|
|
@ -257,7 +257,7 @@ impl ModelManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
model.is_downloaded = model_path.exists() && model_path.is_dir();
|
model.is_downloaded = model_path.exists() && model_path.is_dir();
|
||||||
model.is_downloading = partial_path.exists();
|
model.is_downloading = false;
|
||||||
|
|
||||||
// Get partial file size if it exists (for the .tar.gz being downloaded)
|
// Get partial file size if it exists (for the .tar.gz being downloaded)
|
||||||
if partial_path.exists() {
|
if partial_path.exists() {
|
||||||
|
|
@ -271,7 +271,7 @@ impl ModelManager {
|
||||||
let partial_path = self.models_dir.join(format!("{}.partial", &model.filename));
|
let partial_path = self.models_dir.join(format!("{}.partial", &model.filename));
|
||||||
|
|
||||||
model.is_downloaded = model_path.exists();
|
model.is_downloaded = model_path.exists();
|
||||||
model.is_downloading = partial_path.exists();
|
model.is_downloading = false;
|
||||||
|
|
||||||
// Get partial file size if it exists
|
// Get partial file size if it exists
|
||||||
if partial_path.exists() {
|
if partial_path.exists() {
|
||||||
|
|
@ -339,7 +339,7 @@ impl ModelManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if we have a partial download to resume
|
// Check if we have a partial download to resume
|
||||||
let resume_from = if partial_path.exists() {
|
let mut resume_from = if partial_path.exists() {
|
||||||
let size = partial_path.metadata()?.len();
|
let size = partial_path.metadata()?.len();
|
||||||
info!("Resuming download of model {} from byte {}", model_id, size);
|
info!("Resuming download of model {} from byte {}", model_id, size);
|
||||||
size
|
size
|
||||||
|
|
@ -364,7 +364,25 @@ impl ModelManager {
|
||||||
request = request.header("Range", format!("bytes={}-", resume_from));
|
request = request.header("Range", format!("bytes={}-", resume_from));
|
||||||
}
|
}
|
||||||
|
|
||||||
let response = request.send().await?;
|
let mut response = request.send().await?;
|
||||||
|
|
||||||
|
// If we tried to resume but server returned 200 (not 206 Partial Content),
|
||||||
|
// the server doesn't support range requests. Delete partial file and restart
|
||||||
|
// fresh to avoid file corruption (appending full file to partial).
|
||||||
|
if resume_from > 0 && response.status() == reqwest::StatusCode::OK {
|
||||||
|
warn!(
|
||||||
|
"Server doesn't support range requests for model {}, restarting download",
|
||||||
|
model_id
|
||||||
|
);
|
||||||
|
drop(response);
|
||||||
|
let _ = fs::remove_file(&partial_path);
|
||||||
|
|
||||||
|
// Reset resume_from since we're starting fresh
|
||||||
|
resume_from = 0;
|
||||||
|
|
||||||
|
// Restart download without range header
|
||||||
|
response = client.get(&url).send().await?;
|
||||||
|
}
|
||||||
|
|
||||||
// Check for success or partial content status
|
// Check for success or partial content status
|
||||||
if !response.status().is_success()
|
if !response.status().is_success()
|
||||||
|
|
@ -454,6 +472,26 @@ impl ModelManager {
|
||||||
file.flush()?;
|
file.flush()?;
|
||||||
drop(file); // Ensure file is closed before moving
|
drop(file); // Ensure file is closed before moving
|
||||||
|
|
||||||
|
// Verify downloaded file size matches expected size
|
||||||
|
if total_size > 0 {
|
||||||
|
let actual_size = partial_path.metadata()?.len();
|
||||||
|
if actual_size != total_size {
|
||||||
|
// Download is incomplete/corrupted - delete partial and return error
|
||||||
|
let _ = fs::remove_file(&partial_path);
|
||||||
|
{
|
||||||
|
let mut models = self.available_models.lock().unwrap();
|
||||||
|
if let Some(model) = models.get_mut(model_id) {
|
||||||
|
model.is_downloading = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Err(anyhow::anyhow!(
|
||||||
|
"Download incomplete: expected {} bytes, got {} bytes",
|
||||||
|
total_size,
|
||||||
|
actual_size
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Handle directory-based models (extract tar.gz) vs file-based models
|
// Handle directory-based models (extract tar.gz) vs file-based models
|
||||||
if model_info.is_directory {
|
if model_info.is_directory {
|
||||||
// Emit extraction started event
|
// Emit extraction started event
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue