summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2024-08-08 11:41:30 +0200
committerGitHub <noreply@github.com>2024-08-08 09:41:30 +0000
commit6fce23c54ec619168eee096fc7bf801d0cec0cb6 (patch)
tree211d715cf75817a09c63e6dad943d6623eef67f1 /cli
parent93d479252b5a18e6e782c74b808240bd3ef036bd (diff)
perf: skip saving to emit cache after first failure (#24896)
Diffstat (limited to 'cli')
-rw-r--r--cli/cache/emit.rs22
-rw-r--r--cli/cache/mod.rs4
-rw-r--r--cli/emit.rs4
-rw-r--r--cli/factory.rs6
-rw-r--r--cli/graph_util.rs4
5 files changed, 24 insertions, 16 deletions
diff --git a/cli/cache/emit.rs b/cli/cache/emit.rs
index 1d903fbba..fcec9e84b 100644
--- a/cli/cache/emit.rs
+++ b/cli/cache/emit.rs
@@ -6,6 +6,7 @@ use deno_ast::ModuleSpecifier;
use deno_core::anyhow::anyhow;
use deno_core::error::AnyError;
use deno_core::serde_json;
+use deno_core::unsync::sync::AtomicFlag;
use serde::Deserialize;
use serde::Serialize;
@@ -19,10 +20,10 @@ struct EmitMetadata {
}
/// The cache that stores previously emitted files.
-#[derive(Clone)]
pub struct EmitCache {
disk_cache: DiskCache,
cli_version: &'static str,
+ emit_failed_flag: AtomicFlag,
}
impl EmitCache {
@@ -30,6 +31,7 @@ impl EmitCache {
Self {
disk_cache,
cli_version: crate::version::deno(),
+ emit_failed_flag: Default::default(),
}
}
@@ -87,12 +89,10 @@ impl EmitCache {
code: &[u8],
) {
if let Err(err) = self.set_emit_code_result(specifier, source_hash, code) {
- // should never error here, but if it ever does don't fail
- if cfg!(debug_assertions) {
- panic!("Error saving emit data ({specifier}): {err}");
- } else {
- log::debug!("Error saving emit data({}): {}", specifier, err);
- }
+ // might error in cases such as a readonly file system
+ log::debug!("Error saving emit data ({}): {}", specifier, err);
+ // assume the cache can't be written to and disable caching to it
+ self.emit_failed_flag.raise();
}
}
@@ -102,6 +102,11 @@ impl EmitCache {
source_hash: u64,
code: &[u8],
) -> Result<(), AnyError> {
+ if self.emit_failed_flag.is_raised() {
+ log::debug!("Skipped emit cache save of {}", specifier);
+ return Ok(());
+ }
+
let meta_filename = self
.get_meta_filename(specifier)
.ok_or_else(|| anyhow!("Could not get meta filename."))?;
@@ -161,6 +166,7 @@ mod test {
let cache = EmitCache {
disk_cache: disk_cache.clone(),
cli_version: "1.0.0",
+ emit_failed_flag: Default::default(),
};
let to_string =
|bytes: Vec<u8>| -> String { String::from_utf8(bytes).unwrap() };
@@ -192,6 +198,7 @@ mod test {
let cache = EmitCache {
disk_cache: disk_cache.clone(),
cli_version: "2.0.0",
+ emit_failed_flag: Default::default(),
};
assert_eq!(cache.get_emit_code(&specifier1, 10), None);
cache.set_emit_code(&specifier1, 5, emit_code1.as_bytes());
@@ -200,6 +207,7 @@ mod test {
let cache = EmitCache {
disk_cache,
cli_version: "2.0.0",
+ emit_failed_flag: Default::default(),
};
assert_eq!(
cache.get_emit_code(&specifier1, 5).map(to_string),
diff --git a/cli/cache/mod.rs b/cli/cache/mod.rs
index 3430f74f7..772d2359d 100644
--- a/cli/cache/mod.rs
+++ b/cli/cache/mod.rs
@@ -106,7 +106,7 @@ pub use deno_cache_dir::HttpCache;
/// A "wrapper" for the FileFetcher and DiskCache for the Deno CLI that provides
/// a concise interface to the DENO_DIR when building module graphs.
pub struct FetchCacher {
- emit_cache: EmitCache,
+ emit_cache: Arc<EmitCache>,
file_fetcher: Arc<FileFetcher>,
file_header_overrides: HashMap<ModuleSpecifier, HashMap<String, String>>,
global_http_cache: Arc<GlobalHttpCache>,
@@ -118,7 +118,7 @@ pub struct FetchCacher {
impl FetchCacher {
pub fn new(
- emit_cache: EmitCache,
+ emit_cache: Arc<EmitCache>,
file_fetcher: Arc<FileFetcher>,
file_header_overrides: HashMap<ModuleSpecifier, HashMap<String, String>>,
global_http_cache: Arc<GlobalHttpCache>,
diff --git a/cli/emit.rs b/cli/emit.rs
index 98ee59fab..61397d1ab 100644
--- a/cli/emit.rs
+++ b/cli/emit.rs
@@ -18,7 +18,7 @@ use deno_graph::ModuleGraph;
use std::sync::Arc;
pub struct Emitter {
- emit_cache: EmitCache,
+ emit_cache: Arc<EmitCache>,
parsed_source_cache: Arc<ParsedSourceCache>,
transpile_and_emit_options:
Arc<(deno_ast::TranspileOptions, deno_ast::EmitOptions)>,
@@ -28,7 +28,7 @@ pub struct Emitter {
impl Emitter {
pub fn new(
- emit_cache: EmitCache,
+ emit_cache: Arc<EmitCache>,
parsed_source_cache: Arc<ParsedSourceCache>,
transpile_options: deno_ast::TranspileOptions,
emit_options: deno_ast::EmitOptions,
diff --git a/cli/factory.rs b/cli/factory.rs
index 90dc6dd2e..ed288b22f 100644
--- a/cli/factory.rs
+++ b/cli/factory.rs
@@ -164,7 +164,7 @@ struct CliFactoryServices {
global_http_cache: Deferred<Arc<GlobalHttpCache>>,
http_cache: Deferred<Arc<dyn HttpCache>>,
http_client_provider: Deferred<Arc<HttpClientProvider>>,
- emit_cache: Deferred<EmitCache>,
+ emit_cache: Deferred<Arc<EmitCache>>,
emitter: Deferred<Arc<Emitter>>,
fs: Deferred<Arc<dyn deno_fs::FileSystem>>,
main_graph_container: Deferred<Arc<MainModuleGraphContainer>>,
@@ -492,9 +492,9 @@ impl CliFactory {
.get_or_init(|| maybe_file_watcher_reporter)
}
- pub fn emit_cache(&self) -> Result<&EmitCache, AnyError> {
+ pub fn emit_cache(&self) -> Result<&Arc<EmitCache>, AnyError> {
self.services.emit_cache.get_or_try_init(|| {
- Ok(EmitCache::new(self.deno_dir()?.gen_cache.clone()))
+ Ok(Arc::new(EmitCache::new(self.deno_dir()?.gen_cache.clone())))
})
}
diff --git a/cli/graph_util.rs b/cli/graph_util.rs
index 77d086fa8..647307bd9 100644
--- a/cli/graph_util.rs
+++ b/cli/graph_util.rs
@@ -364,7 +364,7 @@ pub struct ModuleGraphBuilder {
parsed_source_cache: Arc<ParsedSourceCache>,
lockfile: Option<Arc<CliLockfile>>,
maybe_file_watcher_reporter: Option<FileWatcherReporter>,
- emit_cache: cache::EmitCache,
+ emit_cache: Arc<cache::EmitCache>,
file_fetcher: Arc<FileFetcher>,
global_http_cache: Arc<GlobalHttpCache>,
}
@@ -381,7 +381,7 @@ impl ModuleGraphBuilder {
parsed_source_cache: Arc<ParsedSourceCache>,
lockfile: Option<Arc<CliLockfile>>,
maybe_file_watcher_reporter: Option<FileWatcherReporter>,
- emit_cache: cache::EmitCache,
+ emit_cache: Arc<cache::EmitCache>,
file_fetcher: Arc<FileFetcher>,
global_http_cache: Arc<GlobalHttpCache>,
) -> Self {