aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/headless.rs43
1 files changed, 41 insertions, 2 deletions
diff --git a/src/server/headless.rs b/src/server/headless.rs
index bc64f0a8..7725954c 100644
--- a/src/server/headless.rs
+++ b/src/server/headless.rs
@@ -71,6 +71,26 @@ use crate::server::client_transport::ClientWriter;
#[cfg(test)]
use std::fs;
+const LIVE_HANDOFF_RESPONSE_WRITE_TIMEOUT: Duration = Duration::from_secs(6);
+
+fn wait_for_live_handoff_response_write(
+ response_write_complete: Option<std::sync::mpsc::Receiver<()>>,
+) {
+ let Some(response_write_complete) = response_write_complete else {
+ return;
+ };
+
+ match response_write_complete.recv_timeout(LIVE_HANDOFF_RESPONSE_WRITE_TIMEOUT) {
+ Ok(()) => {}
+ Err(std::sync::mpsc::RecvTimeoutError::Timeout) => {
+ warn!("timed out waiting for live handoff response write; old server exiting");
+ }
+ Err(std::sync::mpsc::RecvTimeoutError::Disconnected) => {
+ warn!("live handoff response writer disconnected; old server exiting");
+ }
+ }
+}
+
fn sound_notify_message(sound: crate::sound::Sound) -> &'static str {
match sound {
crate::sound::Sound::Done => "agent done",
@@ -771,6 +791,7 @@ impl HeadlessServer {
method,
},
respond_to,
+ response_write_complete: None,
},
true,
);
@@ -1101,11 +1122,14 @@ impl HeadlessServer {
}
crate::server::handoff::wait_owned_ack(&mut stream);
+ Ok(())
+ }
+
+ fn finish_live_handoff_shutdown(&mut self) {
self.shutting_down = true;
self.app.state.should_quit = true;
self.app.no_session = true;
info!("live handoff completed; old server exiting");
- Ok(())
}
#[cfg(not(unix))]
@@ -2812,7 +2836,9 @@ impl HeadlessServer {
let metadata_expired = self.app.expire_due_metadata(Instant::now());
if let api::schema::Method::ServerLiveHandoff(params) = &msg.request.method {
- let response = match self.perform_live_handoff(params.clone()) {
+ let handoff_result = self.perform_live_handoff(params.clone());
+ let handoff_succeeded = handoff_result.is_ok();
+ let response = match handoff_result {
Ok(()) => serde_json::to_string(&api::schema::SuccessResponse {
id: msg.request.id,
result: api::schema::ResponseResult::Ok {},
@@ -2827,6 +2853,10 @@ impl HeadlessServer {
}
.unwrap_or_else(|_| "{}".to_string());
let _ = msg.respond_to.send(response);
+ if handoff_succeeded {
+ wait_for_live_handoff_response_write(msg.response_write_complete);
+ self.finish_live_handoff_shutdown();
+ }
return true;
}
@@ -4374,6 +4404,7 @@ mod tests {
method: api::schema::Method::PaneList(api::schema::PaneListParams::default()),
},
respond_to,
+ response_write_complete: None,
});
let response: api::schema::SuccessResponse =
serde_json::from_str(&response_rx.recv().unwrap()).unwrap();
@@ -4413,6 +4444,7 @@ mod tests {
method: api::schema::Method::ServerStop(api::schema::EmptyParams::default()),
},
respond_to,
+ response_write_complete: None,
})
);
let response = response_rx
@@ -8395,6 +8427,7 @@ next_tab = ""
),
},
respond_to,
+ response_write_complete: None,
});
assert!(changed);
@@ -8480,6 +8513,7 @@ next_tab = ""
),
},
respond_to,
+ response_write_complete: None,
});
assert!(changed);
@@ -8531,6 +8565,7 @@ next_tab = ""
),
},
respond_to,
+ response_write_complete: None,
});
assert!(changed);
@@ -8562,6 +8597,7 @@ next_tab = ""
),
},
respond_to,
+ response_write_complete: None,
});
assert!(changed);
@@ -8598,6 +8634,7 @@ next_tab = ""
),
},
respond_to,
+ response_write_complete: None,
})
);
@@ -8653,6 +8690,7 @@ next_tab = ""
),
},
respond_to,
+ response_write_complete: None,
})
);
@@ -8924,6 +8962,7 @@ next_tab = ""
}),
},
respond_to,
+ response_write_complete: None,
});
assert!(changed);