From fc2658b0749b03f365a3f176582311efd2bc6462 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 7 Jun 2019 09:50:32 +0300 Subject: use salsa's LRU for syntax trees --- crates/ra_batch/src/lib.rs | 4 +++- crates/ra_db/Cargo.toml | 2 +- crates/ra_ide_api/src/change.rs | 1 - crates/ra_ide_api/src/db.rs | 4 +++- 4 files changed, 7 insertions(+), 4 deletions(-) (limited to 'crates') diff --git a/crates/ra_batch/src/lib.rs b/crates/ra_batch/src/lib.rs index a445dcb4d..02ea89306 100644 --- a/crates/ra_batch/src/lib.rs +++ b/crates/ra_batch/src/lib.rs @@ -7,7 +7,7 @@ use std::collections::HashSet; use rustc_hash::FxHashMap; use ra_db::{ - CrateGraph, FileId, SourceRoot, SourceRootId, SourceDatabase, salsa, + CrateGraph, FileId, SourceRoot, SourceRootId, SourceDatabase, salsa::{self, Database}, }; use ra_hir::db; use ra_project_model::ProjectWorkspace; @@ -43,6 +43,8 @@ fn vfs_root_to_id(r: ra_vfs::VfsRoot) -> SourceRootId { impl BatchDatabase { pub fn load(crate_graph: CrateGraph, vfs: &mut Vfs) -> BatchDatabase { let mut db = BatchDatabase { runtime: salsa::Runtime::default() }; + db.query_mut(ra_db::ParseQuery).set_lru_capacity(128); + db.query_mut(ra_hir::db::ParseMacroQuery).set_lru_capacity(128); db.set_crate_graph(Arc::new(crate_graph)); // wait until Vfs has loaded all roots diff --git a/crates/ra_db/Cargo.toml b/crates/ra_db/Cargo.toml index 827855b2f..f73dd739a 100644 --- a/crates/ra_db/Cargo.toml +++ b/crates/ra_db/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" authors = ["rust-analyzer developers"] [dependencies] -salsa = "0.12.1" +salsa = "0.12.3" relative-path = "0.4.0" rustc-hash = "1.0" diff --git a/crates/ra_ide_api/src/change.rs b/crates/ra_ide_api/src/change.rs index 247dc0fee..ce03a0f95 100644 --- a/crates/ra_ide_api/src/change.rs +++ b/crates/ra_ide_api/src/change.rs @@ -225,7 +225,6 @@ impl RootDatabase { let sweep = SweepStrategy::default().discard_values().sweep_all_revisions(); self.query(ra_db::ParseQuery).sweep(sweep); - self.query(hir::db::ParseMacroQuery).sweep(sweep); self.query(hir::db::MacroDefQuery).sweep(sweep); self.query(hir::db::MacroArgQuery).sweep(sweep); diff --git a/crates/ra_ide_api/src/db.rs b/crates/ra_ide_api/src/db.rs index d1a452ecb..4f19b01c4 100644 --- a/crates/ra_ide_api/src/db.rs +++ b/crates/ra_ide_api/src/db.rs @@ -5,7 +5,7 @@ use std::{ use ra_db::{ CheckCanceled, FileId, Canceled, SourceDatabase, - salsa, + salsa::{self, Database}, }; use crate::{LineIndex, symbol_index::{self, SymbolsDatabase}}; @@ -49,6 +49,8 @@ impl Default for RootDatabase { db.set_crate_graph(Default::default()); db.set_local_roots(Default::default()); db.set_library_roots(Default::default()); + db.query_mut(ra_db::ParseQuery).set_lru_capacity(128); + db.query_mut(hir::db::ParseMacroQuery).set_lru_capacity(128); db } } -- cgit v1.2.3 From 15668119de40b97011a1f2e2d065d11f25a5833a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 7 Jun 2019 12:46:49 +0300 Subject: make LRU_CAP configurable for batch db --- crates/ra_batch/src/lib.rs | 8 ++++++-- crates/ra_db/src/lib.rs | 2 ++ crates/ra_ide_api/src/db.rs | 5 +++-- 3 files changed, 11 insertions(+), 4 deletions(-) (limited to 'crates') diff --git a/crates/ra_batch/src/lib.rs b/crates/ra_batch/src/lib.rs index 02ea89306..c59821f44 100644 --- a/crates/ra_batch/src/lib.rs +++ b/crates/ra_batch/src/lib.rs @@ -43,8 +43,12 @@ fn vfs_root_to_id(r: ra_vfs::VfsRoot) -> SourceRootId { impl BatchDatabase { pub fn load(crate_graph: CrateGraph, vfs: &mut Vfs) -> BatchDatabase { let mut db = BatchDatabase { runtime: salsa::Runtime::default() }; - db.query_mut(ra_db::ParseQuery).set_lru_capacity(128); - db.query_mut(ra_hir::db::ParseMacroQuery).set_lru_capacity(128); + let lru_cap = std::env::var("RA_LRU_CAP") + .ok() + .and_then(|it| it.parse::().ok()) + .unwrap_or(ra_db::DEFAULT_LRU_CAP); + db.query_mut(ra_db::ParseQuery).set_lru_capacity(lru_cap); + db.query_mut(ra_hir::db::ParseMacroQuery).set_lru_capacity(lru_cap); db.set_crate_graph(Arc::new(crate_graph)); // wait until Vfs has loaded all roots diff --git a/crates/ra_db/src/lib.rs b/crates/ra_db/src/lib.rs index 7c49c585b..f08616100 100644 --- a/crates/ra_db/src/lib.rs +++ b/crates/ra_db/src/lib.rs @@ -65,6 +65,8 @@ pub struct FileRange { pub range: TextRange, } +pub const DEFAULT_LRU_CAP: usize = 128; + /// Database which stores all significant input facts: source code and project /// model. Everything else in rust-analyzer is derived from these queries. #[salsa::query_group(SourceDatabaseStorage)] diff --git a/crates/ra_ide_api/src/db.rs b/crates/ra_ide_api/src/db.rs index 4f19b01c4..cccf0ada4 100644 --- a/crates/ra_ide_api/src/db.rs +++ b/crates/ra_ide_api/src/db.rs @@ -49,8 +49,9 @@ impl Default for RootDatabase { db.set_crate_graph(Default::default()); db.set_local_roots(Default::default()); db.set_library_roots(Default::default()); - db.query_mut(ra_db::ParseQuery).set_lru_capacity(128); - db.query_mut(hir::db::ParseMacroQuery).set_lru_capacity(128); + let lru_cap = ra_db::DEFAULT_LRU_CAP; + db.query_mut(ra_db::ParseQuery).set_lru_capacity(lru_cap); + db.query_mut(hir::db::ParseMacroQuery).set_lru_capacity(lru_cap); db } } -- cgit v1.2.3 From fed52706def9a9f5d33edc7dd9848a02ae475ba5 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 7 Jun 2019 20:49:29 +0300 Subject: make LRU cache configurable --- crates/ra_ide_api/src/db.rs | 12 +++++++++--- crates/ra_ide_api/src/lib.rs | 11 ++++++++++- crates/ra_lsp_server/src/init.rs | 14 +++++++++++--- crates/ra_lsp_server/src/main_loop.rs | 2 +- crates/ra_lsp_server/src/world.rs | 8 ++++++-- 5 files changed, 37 insertions(+), 10 deletions(-) (limited to 'crates') diff --git a/crates/ra_ide_api/src/db.rs b/crates/ra_ide_api/src/db.rs index cccf0ada4..b3f395502 100644 --- a/crates/ra_ide_api/src/db.rs +++ b/crates/ra_ide_api/src/db.rs @@ -41,6 +41,12 @@ impl salsa::Database for RootDatabase { impl Default for RootDatabase { fn default() -> RootDatabase { + RootDatabase::new(None) + } +} + +impl RootDatabase { + pub fn new(lru_capacity: Option) -> RootDatabase { let mut db = RootDatabase { runtime: salsa::Runtime::default(), last_gc: time::Instant::now(), @@ -49,9 +55,9 @@ impl Default for RootDatabase { db.set_crate_graph(Default::default()); db.set_local_roots(Default::default()); db.set_library_roots(Default::default()); - let lru_cap = ra_db::DEFAULT_LRU_CAP; - db.query_mut(ra_db::ParseQuery).set_lru_capacity(lru_cap); - db.query_mut(hir::db::ParseMacroQuery).set_lru_capacity(lru_cap); + let lru_capacity = lru_capacity.unwrap_or(ra_db::DEFAULT_LRU_CAP); + db.query_mut(ra_db::ParseQuery).set_lru_capacity(lru_capacity); + db.query_mut(hir::db::ParseMacroQuery).set_lru_capacity(lru_capacity); db } } diff --git a/crates/ra_ide_api/src/lib.rs b/crates/ra_ide_api/src/lib.rs index dbebf50a6..8741e736f 100644 --- a/crates/ra_ide_api/src/lib.rs +++ b/crates/ra_ide_api/src/lib.rs @@ -242,12 +242,21 @@ pub struct CallInfo { } /// `AnalysisHost` stores the current state of the world. -#[derive(Debug, Default)] +#[derive(Debug)] pub struct AnalysisHost { db: db::RootDatabase, } +impl Default for AnalysisHost { + fn default() -> AnalysisHost { + AnalysisHost::new(None) + } +} + impl AnalysisHost { + pub fn new(lru_capcity: Option) -> AnalysisHost { + AnalysisHost { db: db::RootDatabase::new(lru_capcity) } + } /// Returns a snapshot of the current state, which you can query for /// semantic information. pub fn analysis(&self) -> Analysis { diff --git a/crates/ra_lsp_server/src/init.rs b/crates/ra_lsp_server/src/init.rs index 1b77e0312..b894b449d 100644 --- a/crates/ra_lsp_server/src/init.rs +++ b/crates/ra_lsp_server/src/init.rs @@ -17,11 +17,17 @@ pub struct InitializationOptions { /// Defaults to `true` #[serde(deserialize_with = "nullable_bool_true")] pub show_workspace_loaded: bool, + + pub lru_capacity: Option, } impl Default for InitializationOptions { fn default() -> InitializationOptions { - InitializationOptions { publish_decorations: false, show_workspace_loaded: true } + InitializationOptions { + publish_decorations: false, + show_workspace_loaded: true, + lru_capacity: None, + } } } @@ -54,8 +60,10 @@ mod test { assert_eq!(default, serde_json::from_str(r#"{}"#).unwrap()); assert_eq!( default, - serde_json::from_str(r#"{"publishDecorations":null, "showWorkspaceLoaded":null}"#) - .unwrap() + serde_json::from_str( + r#"{"publishDecorations":null, "showWorkspaceLoaded":null, "lruCapacity":null}"# + ) + .unwrap() ); } } diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 090fb9b1b..0790ea472 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -73,7 +73,7 @@ pub fn main_loop( loaded_workspaces }; - let mut state = WorldState::new(ws_roots, workspaces); + let mut state = WorldState::new(ws_roots, workspaces, options.lru_capacity); let pool = ThreadPool::new(THREADPOOL_SIZE); let (task_sender, task_receiver) = unbounded::(); diff --git a/crates/ra_lsp_server/src/world.rs b/crates/ra_lsp_server/src/world.rs index cd8df4fdb..f9ce570ca 100644 --- a/crates/ra_lsp_server/src/world.rs +++ b/crates/ra_lsp_server/src/world.rs @@ -46,7 +46,11 @@ pub struct WorldSnapshot { } impl WorldState { - pub fn new(folder_roots: Vec, workspaces: Vec) -> WorldState { + pub fn new( + folder_roots: Vec, + workspaces: Vec, + lru_capacity: Option, + ) -> WorldState { let mut change = AnalysisChange::new(); let mut roots = Vec::new(); @@ -74,7 +78,7 @@ impl WorldState { } change.set_crate_graph(crate_graph); - let mut analysis_host = AnalysisHost::default(); + let mut analysis_host = AnalysisHost::new(lru_capacity); analysis_host.apply_change(change); WorldState { roots_to_scan, -- cgit v1.2.3