Trace reconnect failure reasons
ci / test (push) Waiting to run
ci / fuzz-smoke (push) Waiting to run
ci / windows-client (push) Waiting to run
ci / package-release (linux-x86_64, ubuntu-latest) (push) Waiting to run
ci / package-release (macos-aarch64, macos-14) (push) Waiting to run
ci / package-release (macos-x86_64, macos-13) (push) Waiting to run
ci / package-release (windows-x86_64, windows-latest) (push) Waiting to run
ci / publish-gitea-release (push) Blocked by required conditions
ci / remote-bench (push) Waiting to run
ci / test (push) Waiting to run
ci / fuzz-smoke (push) Waiting to run
ci / windows-client (push) Waiting to run
ci / package-release (linux-x86_64, ubuntu-latest) (push) Waiting to run
ci / package-release (macos-aarch64, macos-14) (push) Waiting to run
ci / package-release (macos-x86_64, macos-13) (push) Waiting to run
ci / package-release (windows-x86_64, windows-latest) (push) Waiting to run
ci / publish-gitea-release (push) Blocked by required conditions
ci / remote-bench (push) Waiting to run
This commit is contained in:
Generated
+1
-1
@@ -436,7 +436,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "dosh"
|
||||
version = "1.0.0-rc38"
|
||||
version = "1.0.0-rc39"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"base64",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "dosh"
|
||||
version = "1.0.0-rc38"
|
||||
version = "1.0.0-rc39"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
|
||||
|
||||
+65
-4
@@ -828,6 +828,9 @@ struct TraceReport {
|
||||
sent_input_events: usize,
|
||||
pty_write_events: usize,
|
||||
reconnect_events: usize,
|
||||
reconnect_none_events: usize,
|
||||
reconnect_live_fail_events: usize,
|
||||
reconnect_ticket_fail_events: usize,
|
||||
unknown_resume_events: usize,
|
||||
ticket_attach_start_events: usize,
|
||||
ticket_attach_ok_events: usize,
|
||||
@@ -1345,6 +1348,15 @@ fn summarize_trace_file_with_mode(
|
||||
if event.contains("reconnect") || event.contains("resume") {
|
||||
report.reconnect_events += 1;
|
||||
}
|
||||
if event == "client.reconnect_none" {
|
||||
report.reconnect_none_events += 1;
|
||||
}
|
||||
if event == "client.reconnect_live_fail" {
|
||||
report.reconnect_live_fail_events += 1;
|
||||
}
|
||||
if event == "client.reconnect_ticket_fail" {
|
||||
report.reconnect_ticket_fail_events += 1;
|
||||
}
|
||||
if event == "server.resume_unknown_client" {
|
||||
report.unknown_resume_events += 1;
|
||||
}
|
||||
@@ -1413,8 +1425,11 @@ fn print_trace_report(label: &str, report: &TraceReport) {
|
||||
report.hex_events
|
||||
);
|
||||
println!(
|
||||
" reconnect: events={} unknown_resume={} ticket_attach={}/{}/{} roam={}",
|
||||
" reconnect: events={} none={} live_fail={} ticket_fail={} unknown_resume={} ticket_attach={}/{}/{} roam={}",
|
||||
report.reconnect_events,
|
||||
report.reconnect_none_events,
|
||||
report.reconnect_live_fail_events,
|
||||
report.reconnect_ticket_fail_events,
|
||||
report.unknown_resume_events,
|
||||
report.ticket_attach_start_events,
|
||||
report.ticket_attach_ok_events,
|
||||
@@ -1452,6 +1467,12 @@ fn trace_report_warnings(report: &TraceReport) -> Vec<String> {
|
||||
report.ticket_attach_reject_events
|
||||
));
|
||||
}
|
||||
if report.reconnect_none_events > 0 {
|
||||
warnings.push(format!(
|
||||
"{} reconnect attempt(s) exhausted live resume and ticket attach",
|
||||
report.reconnect_none_events
|
||||
));
|
||||
}
|
||||
if report.server_mouseish_pty_write_events > 0 {
|
||||
warnings.push(format!(
|
||||
"{} mouse-like input event(s) reached the server PTY",
|
||||
@@ -7106,7 +7127,8 @@ async fn reconnect(
|
||||
("last_rendered_seq", cred.last_rendered_seq.to_string()),
|
||||
],
|
||||
);
|
||||
if let Ok((frame, next)) = try_live_resume(socket, cred, send_seq, size.0, size.1).await {
|
||||
match try_live_resume(socket, cred, send_seq, size.0, size.1).await {
|
||||
Ok((frame, next)) => {
|
||||
*cred = next;
|
||||
frame_buffer.clear();
|
||||
predictor.reset();
|
||||
@@ -7127,11 +7149,24 @@ async fn reconnect(
|
||||
);
|
||||
return Ok(Some(frame));
|
||||
}
|
||||
Err(err) => {
|
||||
dosh::trace::event(
|
||||
"client.reconnect_live_fail",
|
||||
&[("reason", format!("{err:#}"))],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
let Ok((frame, next)) = try_ticket_attach(socket, cred, size.0, size.1, Vec::new()).await
|
||||
else {
|
||||
let (frame, next) = match try_ticket_attach(socket, cred, size.0, size.1, Vec::new()).await {
|
||||
Ok(value) => value,
|
||||
Err(err) => {
|
||||
dosh::trace::event(
|
||||
"client.reconnect_ticket_fail",
|
||||
&[("reason", format!("{err:#}"))],
|
||||
);
|
||||
dosh::trace::event("client.reconnect_none", &[]);
|
||||
return Ok(None);
|
||||
}
|
||||
};
|
||||
*cred = next;
|
||||
*send_seq = 2;
|
||||
@@ -10832,6 +10867,32 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn trace_report_warns_when_reconnect_exhausts_all_paths() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let path = dir.path().join("client.log");
|
||||
fs::write(
|
||||
&path,
|
||||
concat!(
|
||||
"ts_ms=10 pid=1 event=client.start version=1.0.0\n",
|
||||
"ts_ms=11 pid=1 event=client.reconnect_start session=term mode=read-write last_rendered_seq=9\n",
|
||||
"ts_ms=12 pid=1 event=client.reconnect_live_fail reason='live resume timed out'\n",
|
||||
"ts_ms=13 pid=1 event=client.reconnect_ticket_fail reason='ticket attach timed out'\n",
|
||||
"ts_ms=14 pid=1 event=client.reconnect_none\n",
|
||||
),
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let report = summarize_trace_file(&path, 10).unwrap();
|
||||
let warnings = trace_report_warnings(&report);
|
||||
assert_eq!(report.reconnect_none_events, 1);
|
||||
assert_eq!(report.reconnect_live_fail_events, 1);
|
||||
assert_eq!(report.reconnect_ticket_fail_events, 1);
|
||||
assert!(warnings.iter().any(|warning| {
|
||||
warning == "1 reconnect attempt(s) exhausted live resume and ticket attach"
|
||||
}));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn update_installer_uses_platform_native_script() {
|
||||
assert_eq!(
|
||||
|
||||
Reference in New Issue
Block a user