Prevent deadlock when multiple languages attempt to install Node at once

This commit is contained in:
Julia 2023-03-28 10:18:22 -04:00
parent df4380b066
commit d4560fe321
2 changed files with 8 additions and 12 deletions

View file

@ -793,8 +793,6 @@ impl LanguageRegistry {
})); }));
} }
dbg!();
let download_dir = self let download_dir = self
.language_server_download_dir .language_server_download_dir
.clone() .clone()
@ -805,17 +803,14 @@ impl LanguageRegistry {
let adapter = language.adapter.clone()?; let adapter = language.adapter.clone()?;
let lsp_binary_statuses = self.lsp_binary_statuses_tx.clone(); let lsp_binary_statuses = self.lsp_binary_statuses_tx.clone();
let login_shell_env_loaded = self.login_shell_env_loaded.clone(); let login_shell_env_loaded = self.login_shell_env_loaded.clone();
dbg!();
Some(cx.spawn(|cx| async move { Some(cx.spawn(|cx| async move {
login_shell_env_loaded.await; login_shell_env_loaded.await;
let binary = this let mut lock = this.lsp_binary_paths.lock();
.lsp_binary_paths let entry = lock
.lock()
.entry(adapter.name.clone()) .entry(adapter.name.clone())
.or_insert_with(|| { .or_insert_with(|| {
dbg!();
get_binary( get_binary(
adapter.clone(), adapter.clone(),
language.clone(), language.clone(),
@ -827,10 +822,9 @@ impl LanguageRegistry {
.boxed() .boxed()
.shared() .shared()
}) })
.clone() .clone();
.map_err(|e| anyhow!(e)) drop(lock);
.await?; let binary = entry.clone().map_err(|e| anyhow!(e)).await?;
dbg!();
let server = lsp::LanguageServer::new( let server = lsp::LanguageServer::new(
server_id, server_id,
@ -840,7 +834,6 @@ impl LanguageRegistry {
cx, cx,
)?; )?;
dbg!();
Ok(server) Ok(server)
})) }))
} }
@ -892,6 +885,7 @@ async fn get_binary(
statuses.clone(), statuses.clone(),
) )
.await; .await;
if let Err(error) = binary.as_ref() { if let Err(error) = binary.as_ref() {
if let Some(cached) = adapter.cached_server_binary(container_dir).await { if let Some(cached) = adapter.cached_server_binary(container_dir).await {
statuses statuses

View file

@ -62,6 +62,7 @@ impl NodeRuntime {
.output() .output()
.await .await
.context("failed to run npm info")?; .context("failed to run npm info")?;
if !output.status.success() { if !output.status.success() {
Err(anyhow!( Err(anyhow!(
"failed to execute npm info:\nstdout: {:?}\nstderr: {:?}", "failed to execute npm info:\nstdout: {:?}\nstderr: {:?}",
@ -69,6 +70,7 @@ impl NodeRuntime {
String::from_utf8_lossy(&output.stderr) String::from_utf8_lossy(&output.stderr)
))?; ))?;
} }
let mut info: NpmInfo = serde_json::from_slice(&output.stdout)?; let mut info: NpmInfo = serde_json::from_slice(&output.stdout)?;
info.dist_tags info.dist_tags
.latest .latest