Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 9ba55ba

Browse files
committed
Auto merge of rust-lang#13202 - Veykril:cancelled-retry, r=Veykril
Don't retry requests that have already been cancelled
2 parents b16b041 + 1a6c159 commit 9ba55ba

File tree

7 files changed

+28
-15
lines changed

7 files changed

+28
-15
lines changed

Cargo.lock

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/rust-analyzer/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ threadpool = "1.8.1"
3434
rayon = "1.5.3"
3535
num_cpus = "1.13.1"
3636
mimalloc = { version = "0.1.29", default-features = false, optional = true }
37-
lsp-server = { version = "0.6.0", path = "../../lib/lsp-server" }
37+
lsp-server = { version = "0.7.0", path = "../../lib/lsp-server" }
3838
tracing = "0.1.35"
3939
tracing-subscriber = { version = "0.3.14", default-features = false, features = [
4040
"env-filter",

crates/rust-analyzer/src/global_state.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,10 @@ impl GlobalState {
354354
}
355355
}
356356

357+
pub(crate) fn is_completed(&self, request: &lsp_server::Request) -> bool {
358+
self.req_queue.incoming.is_completed(&request.id)
359+
}
360+
357361
fn send(&mut self, message: lsp_server::Message) {
358362
self.sender.send(message).unwrap()
359363
}

crates/rust-analyzer/src/main_loop.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,9 @@ impl GlobalState {
425425
fn handle_task(&mut self, prime_caches_progress: &mut Vec<PrimeCachesProgress>, task: Task) {
426426
match task {
427427
Task::Response(response) => self.respond(response),
428-
Task::Retry(req) => self.on_request(req),
428+
// Only retry requests that haven't been cancelled. Otherwise we do unnecessary work.
429+
Task::Retry(req) if self.is_completed(&req) => self.on_request(req),
430+
Task::Retry(_) => (),
429431
Task::Diagnostics(diagnostics_per_file) => {
430432
for (file_id, diagnostics) in diagnostics_per_file {
431433
self.diagnostics.set_native_diagnostics(file_id, diagnostics)

lib/lsp-server/Cargo.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
[package]
22
name = "lsp-server"
3-
version = "0.6.0"
3+
version = "0.7.0"
44
description = "Generic LSP server scaffold."
55
license = "MIT OR Apache-2.0"
66
repository = "https://github.com/rust-lang/rust-analyzer/tree/master/lib/lsp-server"
77
edition = "2021"
88

99
[dependencies]
1010
log = "0.4.17"
11-
serde_json = "1.0.81"
12-
serde = { version = "1.0.137", features = ["derive"] }
13-
crossbeam-channel = "0.5.5"
11+
serde_json = "1.0.85"
12+
serde = { version = "1.0.144", features = ["derive"] }
13+
crossbeam-channel = "0.5.6"
1414

1515
[dev-dependencies]
16-
lsp-types = "0.93.0"
16+
lsp-types = "0.93.1"

lib/lsp-server/src/msg.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ pub struct ResponseError {
9898
}
9999

100100
#[derive(Clone, Copy, Debug)]
101-
#[allow(unused)]
101+
#[non_exhaustive]
102102
pub enum ErrorCode {
103103
// Defined by JSON RPC:
104104
ParseError = -32700,

lib/lsp-server/src/req_queue.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ impl<I> Incoming<I> {
3535
pub fn register(&mut self, id: RequestId, data: I) {
3636
self.pending.insert(id, data);
3737
}
38+
3839
pub fn cancel(&mut self, id: RequestId) -> Option<Response> {
3940
let _data = self.complete(id.clone())?;
4041
let error = ResponseError {
@@ -44,9 +45,14 @@ impl<I> Incoming<I> {
4445
};
4546
Some(Response { id, result: None, error: Some(error) })
4647
}
48+
4749
pub fn complete(&mut self, id: RequestId) -> Option<I> {
4850
self.pending.remove(&id)
4951
}
52+
53+
pub fn is_completed(&self, id: &RequestId) -> bool {
54+
!self.pending.contains_key(id)
55+
}
5056
}
5157

5258
impl<O> Outgoing<O> {
@@ -56,6 +62,7 @@ impl<O> Outgoing<O> {
5662
self.next_id += 1;
5763
Request::new(id, method, params)
5864
}
65+
5966
pub fn complete(&mut self, id: RequestId) -> Option<O> {
6067
self.pending.remove(&id)
6168
}

0 commit comments

Comments
 (0)