Fix flakey SSH connection (#19439)
Fixes a bug due to the `select!` macro tossing futures that had partially read messages, causing us to desync our message reading with the input stream. Release Notes: - N/A --------- Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com> Co-authored-by: conrad <conrad@zed.dev>
This commit is contained in:
parent
30e081b3f7
commit
8a912726d7
3 changed files with 92 additions and 84 deletions
|
@ -12,6 +12,7 @@ use language::LanguageRegistry;
|
|||
use node_runtime::{NodeBinaryOptions, NodeRuntime};
|
||||
use paths::logs_dir;
|
||||
use project::project_settings::ProjectSettings;
|
||||
|
||||
use remote::proxy::ProxyLaunchError;
|
||||
use remote::ssh_session::ChannelClient;
|
||||
use remote::{
|
||||
|
@ -213,19 +214,27 @@ fn start_server(
|
|||
|
||||
let mut input_buffer = Vec::new();
|
||||
let mut output_buffer = Vec::new();
|
||||
|
||||
let (mut stdin_msg_tx, mut stdin_msg_rx) = mpsc::unbounded::<Envelope>();
|
||||
cx.background_executor().spawn(async move {
|
||||
while let Ok(msg) = read_message(&mut stdin_stream, &mut input_buffer).await {
|
||||
if let Err(_) = stdin_msg_tx.send(msg).await {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}).detach();
|
||||
|
||||
loop {
|
||||
|
||||
select_biased! {
|
||||
_ = app_quit_rx.next().fuse() => {
|
||||
return anyhow::Ok(());
|
||||
}
|
||||
|
||||
stdin_message = read_message(&mut stdin_stream, &mut input_buffer).fuse() => {
|
||||
let message = match stdin_message {
|
||||
Ok(message) => message,
|
||||
Err(error) => {
|
||||
log::warn!("error reading message on stdin: {}. exiting.", error);
|
||||
break;
|
||||
}
|
||||
stdin_message = stdin_msg_rx.next().fuse() => {
|
||||
let Some(message) = stdin_message else {
|
||||
log::warn!("error reading message on stdin. exiting.");
|
||||
break;
|
||||
};
|
||||
if let Err(error) = incoming_tx.unbounded_send(message) {
|
||||
log::error!("failed to send message to application: {:?}. exiting.", error);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue