Fix failure to upload panics when multiple panics happen at the same time

This commit is contained in:
Max Brunsfeld 2023-06-15 15:16:26 -07:00
parent 5f93a4effd
commit e525706581

View file

@ -435,22 +435,24 @@ fn init_panic_hook(app: &App) {
backtrace, backtrace,
}; };
if let Some(panic_data_json) = serde_json::to_string_pretty(&panic_data).log_err() { if is_pty {
if is_pty { if let Some(panic_data_json) = serde_json::to_string_pretty(&panic_data).log_err() {
eprintln!("{}", panic_data_json); eprintln!("{}", panic_data_json);
return; return;
} }
} else {
let timestamp = chrono::Utc::now().format("%Y_%m_%d %H_%M_%S").to_string(); if let Some(panic_data_json) = serde_json::to_string(&panic_data).log_err() {
let panic_file_path = paths::LOGS_DIR.join(format!("zed-{}.panic", timestamp)); let timestamp = chrono::Utc::now().format("%Y_%m_%d %H_%M_%S").to_string();
let panic_file = std::fs::OpenOptions::new() let panic_file_path = paths::LOGS_DIR.join(format!("zed-{}.panic", timestamp));
.append(true) let panic_file = std::fs::OpenOptions::new()
.create(true) .append(true)
.open(&panic_file_path) .create(true)
.log_err(); .open(&panic_file_path)
if let Some(mut panic_file) = panic_file { .log_err();
write!(&mut panic_file, "{}\n", panic_data_json).log_err(); if let Some(mut panic_file) = panic_file {
panic_file.flush().log_err(); writeln!(&mut panic_file, "{}", panic_data_json).log_err();
panic_file.flush().log_err();
}
} }
} }
})); }));
@ -482,23 +484,45 @@ fn upload_previous_panics(http: Arc<dyn HttpClient>, cx: &mut AppContext) {
} }
if telemetry_settings.diagnostics { if telemetry_settings.diagnostics {
let panic_data_text = smol::fs::read_to_string(&child_path) let panic_file_content = smol::fs::read_to_string(&child_path)
.await .await
.context("error reading panic file")?; .context("error reading panic file")?;
let body = serde_json::to_string(&PanicRequest { let panic = serde_json::from_str(&panic_file_content)
panic: serde_json::from_str(&panic_data_text)?, .ok()
token: ZED_SECRET_CLIENT_TOKEN.into(), .or_else(|| {
}) panic_file_content
.unwrap(); .lines()
.next()
.and_then(|line| serde_json::from_str(line).ok())
})
.unwrap_or_else(|| {
log::error!(
"failed to deserialize panic file {:?}",
panic_file_content
);
None
});
let request = Request::post(&panic_report_url) if let Some(panic) = panic {
.redirect_policy(isahc::config::RedirectPolicy::Follow) let body = serde_json::to_string(&PanicRequest {
.header("Content-Type", "application/json") panic,
.body(body.into())?; token: ZED_SECRET_CLIENT_TOKEN.into(),
let response = http.send(request).await.context("error sending panic")?; })
if !response.status().is_success() { .unwrap();
log::error!("Error uploading panic to server: {}", response.status());
let request = Request::post(&panic_report_url)
.redirect_policy(isahc::config::RedirectPolicy::Follow)
.header("Content-Type", "application/json")
.body(body.into())?;
let response =
http.send(request).await.context("error sending panic")?;
if !response.status().is_success() {
log::error!(
"Error uploading panic to server: {}",
response.status()
);
}
} }
} }