Skip to content

Commit cd5d240

Browse files
author
Greg Soltis
authored
chore(Turborepo): refactor client side of daemon-backed package discovery (#7644)
### Description - Set a clientside timeout at the GRPC level for package discovery - Refactor FallbackDiscovery to not use Option, as well as drop the impl for Option - Only use FallbackDiscovery when we actually want to have a fallback - Throw an error in the case where we've requested only daemon usage, but the daemon is unavailable ### Testing Instructions Existing test suite Closes TURBO-2549
1 parent f5f9fea commit cd5d240

File tree

3 files changed

+54
-59
lines changed

3 files changed

+54
-59
lines changed

crates/turborepo-lib/src/daemon/client.rs

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
use std::io;
1+
use std::{io, time::Duration};
22

33
use globwalk::ValidatedGlob;
44
use thiserror::Error;
5-
use tonic::{Code, Status};
5+
use tonic::{Code, IntoRequest, Status};
66
use tracing::info;
77
use turbopath::AbsoluteSystemPathBuf;
88

@@ -125,11 +125,10 @@ impl<T> DaemonClient<T> {
125125
}
126126

127127
pub async fn discover_packages(&mut self) -> Result<DiscoverPackagesResponse, DaemonError> {
128-
let response = self
129-
.client
130-
.discover_packages(proto::DiscoverPackagesRequest {})
131-
.await?
132-
.into_inner();
128+
let req = proto::DiscoverPackagesRequest {};
129+
let mut req = req.into_request();
130+
req.set_timeout(Duration::from_millis(10));
131+
let response = self.client.discover_packages(req).await?.into_inner();
133132

134133
Ok(response)
135134
}

crates/turborepo-lib/src/run/mod.rs

+44-24
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ use {
4545
crate::run::package_discovery::DaemonPackageDiscovery,
4646
std::time::Duration,
4747
turborepo_repository::discovery::{
48-
FallbackPackageDiscovery, LocalPackageDiscoveryBuilder, PackageDiscoveryBuilder,
48+
Error as DiscoveryError, FallbackPackageDiscovery, LocalPackageDiscoveryBuilder,
49+
PackageDiscoveryBuilder,
4950
},
5051
};
5152

@@ -286,32 +287,51 @@ impl Run {
286287
.with_single_package_mode(self.opts.run_opts.single_package);
287288

288289
#[cfg(feature = "daemon-package-discovery")]
289-
let builder = {
290-
// if we are forcing the daemon, we don't want to fallback to local discovery
291-
let (fallback, duration) = if let Some(true) = self.opts.run_opts.daemon {
292-
(None, Duration::MAX)
293-
} else {
294-
(
295-
Some(
296-
LocalPackageDiscoveryBuilder::new(
297-
self.repo_root.clone(),
298-
None,
299-
Some(root_package_json.clone()),
300-
)
301-
.build()?,
302-
),
303-
Duration::from_millis(10),
290+
let graph = match (&daemon, self.opts.run_opts.daemon) {
291+
(None, Some(true)) => {
292+
// We've asked for the daemon, but it's not available. This is an error
293+
return Err(package_graph::builder::Error::Discovery(
294+
DiscoveryError::Unavailable,
295+
)
296+
.into());
297+
}
298+
(Some(daemon), Some(true)) => {
299+
// We have the daemon, and have explicitly asked to only use that
300+
let daemon_discovery = DaemonPackageDiscovery::new(daemon.clone());
301+
builder
302+
.with_package_discovery(daemon_discovery)
303+
.build()
304+
.await
305+
}
306+
(_, Some(false)) | (None, _) => {
307+
// We have explicitly requested to not use the daemon, or we don't have it
308+
// No change to default.
309+
builder.build().await
310+
}
311+
(Some(daemon), None) => {
312+
// We have the daemon, and it's not flagged off. Use the fallback strategy
313+
let daemon_discovery = DaemonPackageDiscovery::new(daemon.clone());
314+
let local_discovery = LocalPackageDiscoveryBuilder::new(
315+
self.repo_root.clone(),
316+
None,
317+
Some(root_package_json.clone()),
304318
)
305-
};
306-
let fallback_discovery = FallbackPackageDiscovery::new(
307-
daemon.clone().map(DaemonPackageDiscovery::new),
308-
fallback,
309-
duration,
310-
);
311-
builder.with_package_discovery(fallback_discovery)
319+
.build()?;
320+
let fallback_discover = FallbackPackageDiscovery::new(
321+
daemon_discovery,
322+
local_discovery,
323+
Duration::from_millis(10),
324+
);
325+
builder
326+
.with_package_discovery(fallback_discover)
327+
.build()
328+
.await
329+
}
312330
};
331+
#[cfg(not(feature = "daemon-package-discovery"))]
332+
let graph = builder.build().await;
313333

314-
match builder.build().await {
334+
match graph {
315335
Ok(graph) => graph,
316336
// if we can't find the package.json, it is a bug, and we should report it.
317337
// likely cause is that package discovery watching is not up to date.

crates/turborepo-repository/src/discovery.rs

+4-28
Original file line numberDiff line numberDiff line change
@@ -66,32 +66,6 @@ pub trait PackageDiscoveryBuilder {
6666
fn build(self) -> Result<Self::Output, Self::Error>;
6767
}
6868

69-
impl<T: PackageDiscovery + Send + Sync> PackageDiscovery for Option<T> {
70-
async fn discover_packages(&self) -> Result<DiscoveryResponse, Error> {
71-
tracing::debug!("discovering packages using optional strategy");
72-
73-
match self {
74-
Some(d) => d.discover_packages().await,
75-
None => {
76-
tracing::debug!("no strategy available");
77-
Err(Error::Unavailable)
78-
}
79-
}
80-
}
81-
82-
async fn discover_packages_blocking(&self) -> Result<DiscoveryResponse, Error> {
83-
tracing::debug!("discovering packages using optional strategy");
84-
85-
match self {
86-
Some(d) => d.discover_packages_blocking().await,
87-
None => {
88-
tracing::debug!("no strategy available");
89-
Err(Error::Unavailable)
90-
}
91-
}
92-
}
93-
}
94-
9569
pub struct LocalPackageDiscovery {
9670
repo_root: AbsoluteSystemPathBuf,
9771
package_manager: PackageManager,
@@ -194,13 +168,15 @@ impl PackageDiscovery for LocalPackageDiscovery {
194168

195169
/// Attempts to run the `primary` strategy for an amount of time
196170
/// specified by `timeout` before falling back to `fallback`
197-
pub struct FallbackPackageDiscovery<P, F> {
171+
pub struct FallbackPackageDiscovery<P: PackageDiscovery + Send + Sync, F> {
198172
primary: P,
199173
fallback: F,
200174
timeout: std::time::Duration,
201175
}
202176

203-
impl<P: PackageDiscovery, F: PackageDiscovery> FallbackPackageDiscovery<P, F> {
177+
impl<P: PackageDiscovery + Send + Sync, F: PackageDiscovery + Send + Sync>
178+
FallbackPackageDiscovery<P, F>
179+
{
204180
pub fn new(primary: P, fallback: F, timeout: std::time::Duration) -> Self {
205181
Self {
206182
primary,

0 commit comments

Comments
 (0)