Arm wake repaint retry from input paths
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:
DuProcess
2026-07-12 21:51:02 -04:00
parent 695f356411
commit 0a05c68e94
+54 -15
View File
@@ -5914,6 +5914,13 @@ async fn run_terminal(
forward_only,
input_status_tick_gap,
) {
let reconnect_started_at = Instant::now();
if let Some(deadline) =
wake_repaint_retry_deadline(reconnect_started_at, input_status_tick_gap)
{
wake_repaint_retry_until = Some(deadline);
trace_wake_repaint_retry_arm("input_sleep_gap", input_status_tick_gap);
}
dosh::trace::event(
"client.local_sleep_input_reconnect_start",
&[(
@@ -5921,7 +5928,7 @@ async fn run_terminal(
input_status_tick_gap.as_millis().to_string(),
)],
);
last_status_tick_at = Instant::now();
last_status_tick_at = reconnect_started_at;
arm_stale_terminal_input_suppression(
&mut stale_terminal_input_suppress_until,
);
@@ -5973,6 +5980,9 @@ async fn run_terminal(
&[("silent_ms", last_packet_at.elapsed().as_millis().to_string())],
);
last_focus_repaint_at = Instant::now();
wake_repaint_retry_until =
Some(last_focus_repaint_at + LOCAL_SLEEP_REPAINT_RETRY_WINDOW);
trace_wake_repaint_retry_arm("focus", last_packet_at.elapsed());
if let Some(frame) = reconnect(
&socket,
&mut cred,
@@ -6369,6 +6379,7 @@ async fn run_terminal(
render_frame(&frame)?;
predictor.observe_output(&frame.bytes);
last_terminal_frame_at = Instant::now();
wake_repaint_retry_until = None;
flush_startup_input_if_ready(
&socket,
addr,
@@ -6885,19 +6896,11 @@ async fn run_terminal(
let status_tick_at = Instant::now();
let status_tick_gap = status_tick_at.duration_since(last_status_tick_at);
last_status_tick_at = status_tick_at;
if status_tick_gap >= LOCAL_SLEEP_REPAINT_AFTER {
wake_repaint_retry_until =
Some(status_tick_at + LOCAL_SLEEP_REPAINT_RETRY_WINDOW);
dosh::trace::event(
"client.wake_repaint_retry_arm",
&[
("tick_gap_ms", status_tick_gap.as_millis().to_string()),
(
"window_ms",
LOCAL_SLEEP_REPAINT_RETRY_WINDOW.as_millis().to_string(),
),
],
);
if let Some(deadline) =
wake_repaint_retry_deadline(status_tick_at, status_tick_gap)
{
wake_repaint_retry_until = Some(deadline);
trace_wake_repaint_retry_arm("status_tick_gap", status_tick_gap);
}
let mut repainted_this_tick = false;
let stale = last_packet_at.elapsed();
@@ -7457,6 +7460,24 @@ fn should_reconnect_before_input_for_local_sleep(
!forward_only && status_tick_gap >= LOCAL_SLEEP_REPAINT_AFTER
}
fn wake_repaint_retry_deadline(now: Instant, status_tick_gap: Duration) -> Option<Instant> {
(status_tick_gap >= LOCAL_SLEEP_REPAINT_AFTER).then_some(now + LOCAL_SLEEP_REPAINT_RETRY_WINDOW)
}
fn trace_wake_repaint_retry_arm(trigger: &str, elapsed: Duration) {
dosh::trace::event(
"client.wake_repaint_retry_arm",
&[
("trigger", trigger.to_string()),
("elapsed_ms", elapsed.as_millis().to_string()),
(
"window_ms",
LOCAL_SLEEP_REPAINT_RETRY_WINDOW.as_millis().to_string(),
),
],
);
}
fn should_strip_unowned_terminal_reports(alternate_screen: bool, mouse_tracking: bool) -> bool {
// Only a full-screen app that explicitly enabled mouse reporting owns these
// bytes. In every other state, local terminal mouse reports are stale UI
@@ -9496,7 +9517,8 @@ mod tests {
summarize_trace_file_with_mode, terminal_private_mode_transition, toml_bare_key_or_quoted,
top_trace_events, trace_report_warnings, unix_update_script,
update_binary_version_for_installer, update_installer_url, update_version_status,
upsert_managed_block, valid_forward_host, vscode_safe_alias, windows_update_script,
upsert_managed_block, valid_forward_host, vscode_safe_alias, wake_repaint_retry_deadline,
windows_update_script,
};
use dosh::config::{ClientConfig, CommandExtension, HostConfig};
use dosh::native::EnvVar;
@@ -11816,6 +11838,23 @@ mod tests {
));
}
#[test]
fn local_sleep_gap_arms_wake_repaint_retry_window() {
let now = Instant::now();
assert_eq!(
wake_repaint_retry_deadline(now, LOCAL_SLEEP_REPAINT_AFTER - Duration::from_millis(1)),
None
);
assert_eq!(
wake_repaint_retry_deadline(now, LOCAL_SLEEP_REPAINT_AFTER),
Some(now + LOCAL_SLEEP_REPAINT_RETRY_WINDOW)
);
assert_eq!(
wake_repaint_retry_deadline(now, LOCAL_SLEEP_REPAINT_AFTER + Duration::from_secs(30)),
Some(now + LOCAL_SLEEP_REPAINT_RETRY_WINDOW)
);
}
#[test]
fn reconnect_mouse_quarantine_is_long_enough_for_sleep_wake_noise() {
assert!(POST_RECONNECT_STALE_INPUT_GRACE >= LOCAL_SLEEP_REPAINT_AFTER);