Zackriya-Solutions/meetily · error
Download timeout - No data received for 30 seconds
Error message
Download timeout - No data received for 30 seconds
What it means
The per-chunk 30-second timeout expired with zero bytes from the stream: the connection is open but stalled. Unlike the parakeet variant, model status is set to Error (with this message) so the UI can show a retry button; the partial file remains and the next attempt resumes via the Range header.
Source
Thrown at frontend/src-tauri/src/summary/summary_engine/model_manager.rs:608
let chunk = match next_result {
// Timeout - no data received for 30 seconds
Err(_) => {
log::warn!("Download timeout for {}: no data received for 30 seconds", model_name);
let _ = writer.flush().await;
// Cleanup: Remove from active downloads
let mut active = self.active_downloads.write().await;
active.remove(model_name);
// Set model status to Error (NOT NotDownloaded) so UI can show retry button
{
let mut models = self.available_models.write().await;
if let Some(model_info) = models.get_mut(model_name) {
model_info.status = ModelStatus::Error("Download timeout - No data received for 30 seconds".to_string());
}
}
return Err(anyhow!("Download timeout - No data received for 30 seconds"));
},
// Stream ended
Ok(None) => break,
// Got chunk result
Ok(Some(chunk_result)) => {
match chunk_result {
Ok(c) => c,
// Detect error type for better user feedback
Err(e) => {
log::error!("Download error for {}: {:?}", model_name, e);
let _ = writer.flush().await;
// Cleanup: Remove from active downloads
let mut active = self.active_downloads.write().await;
active.remove(model_name);
// Categorize error for user-friendly message
let error_msg = if e.is_timeout() {View on GitHub (pinned to 0281737d87)
Solutions
- Retry the download — resume continues from the preserved partial file
- If it stalls at the same offset repeatedly, delete the partial file and retry fresh
- Bypass or diagnose interfering proxies/VPNs (curl the same URL)
- For persistently slow links, increase the 30 s chunk timeout rather than retrying in a loop
Defensive patterns
Strategy: retry
Try / catch
let mut attempt = 0;
loop {
match manager.download_model_detailed(name, cb).await {
Err(e) if e.to_string().contains("Download timeout") && attempt < 3 => {
attempt += 1;
tokio::time::sleep(Duration::from_secs(2u64.pow(attempt))).await; // resumes from partial
}
other => break other,
}
} Prevention
- Retry with backoff and rely on Range-based resume instead of restarting
- Delete the partial file if stalls repeat at the same byte offset (corrupt resume state)
- Expose model status Error in the UI with a retry action, matching the manager's intent
When it happens
Trigger: CDN stalls the body mid-transfer; proxy/captive portal accepting the connection but never streaming; VPN rekey or Wi-Fi roam freezing the socket; server throttling that pauses after headers.
Common situations: Corporate proxies rate-limiting large GGUF downloads; network switch mid-download; slow origin after long pauses.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- Download timeout - No data received for 30 seconds
- {}: {}
- Failed to start download: {}
- Download failed with status: {}
- Failed to read chunk: {}
AI-assisted analysis of Zackriya-Solutions/meetily@0281737d87 (2026-08-16).
Data as JSON: /api/errors/15d54d5286153c8c.
Report an issue: GitHub.