Skip to content

Commit b333f85

Browse files
committed
Auto merge of #17639 - Veykril:salsa-perf, r=Veykril
Some more small salsa memory improvements This does limit our lru limits to 2^16 but if you want to set them higher than that you might as well not set them at all. Also makes `LRU` opt-in per query now, allowing us to drop all the unnecessary LRU stuff for most queries
2 parents 2c2b6c9 + 09ef75c commit b333f85

File tree

18 files changed

+1241
-403
lines changed

18 files changed

+1241
-403
lines changed

crates/base-db/src/lib.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ pub trait Upcast<T: ?Sized> {
4242
fn upcast(&self) -> &T;
4343
}
4444

45-
pub const DEFAULT_FILE_TEXT_LRU_CAP: usize = 16;
46-
pub const DEFAULT_PARSE_LRU_CAP: usize = 128;
47-
pub const DEFAULT_BORROWCK_LRU_CAP: usize = 2024;
45+
pub const DEFAULT_FILE_TEXT_LRU_CAP: u16 = 16;
46+
pub const DEFAULT_PARSE_LRU_CAP: u16 = 128;
47+
pub const DEFAULT_BORROWCK_LRU_CAP: u16 = 2024;
4848

4949
pub trait FileLoader {
5050
/// Text of the file.
@@ -59,6 +59,7 @@ pub trait FileLoader {
5959
#[salsa::query_group(SourceDatabaseStorage)]
6060
pub trait SourceDatabase: FileLoader + std::fmt::Debug {
6161
/// Parses the file into the syntax tree.
62+
#[salsa::lru]
6263
fn parse(&self, file_id: EditionedFileId) -> Parse<ast::SourceFile>;
6364

6465
/// Returns the set of errors obtained from parsing the file including validation errors.
@@ -105,6 +106,7 @@ pub trait SourceDatabaseExt: SourceDatabase {
105106
#[salsa::input]
106107
fn compressed_file_text(&self, file_id: FileId) -> Arc<[u8]>;
107108

109+
#[salsa::lru]
108110
fn file_text(&self, file_id: FileId) -> Arc<str>;
109111

110112
/// Path to a file, relative to the root of its source root.

crates/hir-expand/src/db.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ pub trait ExpandDatabase: SourceDatabase {
6565
#[salsa::transparent]
6666
fn parse_or_expand_with_err(&self, file_id: HirFileId) -> ExpandResult<Parse<SyntaxNode>>;
6767
/// Implementation for the macro case.
68-
// This query is LRU cached
68+
#[salsa::lru]
6969
fn parse_macro_expansion(
7070
&self,
7171
macro_file: MacroFileId,

crates/hir-ty/src/db.rs

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
6161
) -> Result<Arc<MirBody>, MirLowerError>;
6262

6363
#[salsa::invoke(crate::mir::borrowck_query)]
64+
#[salsa::lru]
6465
fn borrowck(&self, def: DefWithBodyId) -> Result<Arc<[BorrowckResult]>, MirLowerError>;
6566

6667
#[salsa::invoke(crate::consteval::const_eval_query)]

crates/ide-db/src/lib.rs

+3-132
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ impl Default for RootDatabase {
145145
}
146146

147147
impl RootDatabase {
148-
pub fn new(lru_capacity: Option<usize>) -> RootDatabase {
148+
pub fn new(lru_capacity: Option<u16>) -> RootDatabase {
149149
let mut db = RootDatabase { storage: ManuallyDrop::new(salsa::Storage::default()) };
150150
db.set_crate_graph_with_durability(Default::default(), Durability::HIGH);
151151
db.set_proc_macros_with_durability(Default::default(), Durability::HIGH);
@@ -161,7 +161,7 @@ impl RootDatabase {
161161
self.set_expand_proc_attr_macros_with_durability(true, Durability::HIGH);
162162
}
163163

164-
pub fn update_base_query_lru_capacities(&mut self, lru_capacity: Option<usize>) {
164+
pub fn update_base_query_lru_capacities(&mut self, lru_capacity: Option<u16>) {
165165
let lru_capacity = lru_capacity.unwrap_or(base_db::DEFAULT_PARSE_LRU_CAP);
166166
base_db::FileTextQuery.in_db_mut(self).set_lru_capacity(DEFAULT_FILE_TEXT_LRU_CAP);
167167
base_db::ParseQuery.in_db_mut(self).set_lru_capacity(lru_capacity);
@@ -170,7 +170,7 @@ impl RootDatabase {
170170
hir::db::BorrowckQuery.in_db_mut(self).set_lru_capacity(base_db::DEFAULT_BORROWCK_LRU_CAP);
171171
}
172172

173-
pub fn update_lru_capacities(&mut self, lru_capacities: &FxHashMap<Box<str>, usize>) {
173+
pub fn update_lru_capacities(&mut self, lru_capacities: &FxHashMap<Box<str>, u16>) {
174174
use hir::db as hir_db;
175175

176176
base_db::FileTextQuery.in_db_mut(self).set_lru_capacity(DEFAULT_FILE_TEXT_LRU_CAP);
@@ -192,135 +192,6 @@ impl RootDatabase {
192192
.copied()
193193
.unwrap_or(base_db::DEFAULT_BORROWCK_LRU_CAP),
194194
);
195-
196-
macro_rules! update_lru_capacity_per_query {
197-
($( $module:ident :: $query:ident )*) => {$(
198-
if let Some(&cap) = lru_capacities.get(stringify!($query)) {
199-
$module::$query.in_db_mut(self).set_lru_capacity(cap);
200-
}
201-
)*}
202-
}
203-
update_lru_capacity_per_query![
204-
// SourceDatabase
205-
// base_db::ParseQuery
206-
// base_db::CrateGraphQuery
207-
// base_db::ProcMacrosQuery
208-
209-
// SourceDatabaseExt
210-
base_db::FileTextQuery
211-
// base_db::FileSourceRootQuery
212-
// base_db::SourceRootQuery
213-
base_db::SourceRootCratesQuery
214-
215-
// ExpandDatabase
216-
hir_db::AstIdMapQuery
217-
// hir_db::ParseMacroExpansionQuery
218-
// hir_db::InternMacroCallQuery
219-
hir_db::MacroArgQuery
220-
hir_db::DeclMacroExpanderQuery
221-
// hir_db::MacroExpandQuery
222-
hir_db::ExpandProcMacroQuery
223-
hir_db::ParseMacroExpansionErrorQuery
224-
225-
// DefDatabase
226-
hir_db::FileItemTreeQuery
227-
hir_db::BlockDefMapQuery
228-
hir_db::StructDataWithDiagnosticsQuery
229-
hir_db::UnionDataWithDiagnosticsQuery
230-
hir_db::EnumDataQuery
231-
hir_db::EnumVariantDataWithDiagnosticsQuery
232-
hir_db::ImplDataWithDiagnosticsQuery
233-
hir_db::TraitDataWithDiagnosticsQuery
234-
hir_db::TraitAliasDataQuery
235-
hir_db::TypeAliasDataQuery
236-
hir_db::FunctionDataQuery
237-
hir_db::ConstDataQuery
238-
hir_db::StaticDataQuery
239-
hir_db::Macro2DataQuery
240-
hir_db::MacroRulesDataQuery
241-
hir_db::ProcMacroDataQuery
242-
hir_db::BodyWithSourceMapQuery
243-
hir_db::BodyQuery
244-
hir_db::ExprScopesQuery
245-
hir_db::GenericParamsQuery
246-
hir_db::FieldsAttrsQuery
247-
hir_db::FieldsAttrsSourceMapQuery
248-
hir_db::AttrsQuery
249-
hir_db::CrateLangItemsQuery
250-
hir_db::LangItemQuery
251-
hir_db::ImportMapQuery
252-
hir_db::FieldVisibilitiesQuery
253-
hir_db::FunctionVisibilityQuery
254-
hir_db::ConstVisibilityQuery
255-
hir_db::CrateSupportsNoStdQuery
256-
257-
// HirDatabase
258-
hir_db::MirBodyQuery
259-
hir_db::BorrowckQuery
260-
hir_db::TyQuery
261-
hir_db::ValueTyQuery
262-
hir_db::ImplSelfTyQuery
263-
hir_db::ConstParamTyQuery
264-
hir_db::ConstEvalQuery
265-
hir_db::ConstEvalDiscriminantQuery
266-
hir_db::ImplTraitQuery
267-
hir_db::FieldTypesQuery
268-
hir_db::LayoutOfAdtQuery
269-
hir_db::TargetDataLayoutQuery
270-
hir_db::CallableItemSignatureQuery
271-
hir_db::ReturnTypeImplTraitsQuery
272-
hir_db::GenericPredicatesForParamQuery
273-
hir_db::GenericPredicatesQuery
274-
hir_db::TraitEnvironmentQuery
275-
hir_db::GenericDefaultsQuery
276-
hir_db::InherentImplsInCrateQuery
277-
hir_db::InherentImplsInBlockQuery
278-
hir_db::IncoherentInherentImplCratesQuery
279-
hir_db::TraitImplsInCrateQuery
280-
hir_db::TraitImplsInBlockQuery
281-
hir_db::TraitImplsInDepsQuery
282-
// hir_db::InternCallableDefQuery
283-
// hir_db::InternLifetimeParamIdQuery
284-
// hir_db::InternImplTraitIdQuery
285-
// hir_db::InternTypeOrConstParamIdQuery
286-
// hir_db::InternClosureQuery
287-
// hir_db::InternCoroutineQuery
288-
hir_db::AssociatedTyDataQuery
289-
hir_db::TraitDatumQuery
290-
hir_db::AdtDatumQuery
291-
hir_db::ImplDatumQuery
292-
hir_db::FnDefDatumQuery
293-
hir_db::FnDefVarianceQuery
294-
hir_db::AdtVarianceQuery
295-
hir_db::AssociatedTyValueQuery
296-
hir_db::ProgramClausesForChalkEnvQuery
297-
298-
// SymbolsDatabase
299-
symbol_index::ModuleSymbolsQuery
300-
symbol_index::LibrarySymbolsQuery
301-
// symbol_index::LocalRootsQuery
302-
// symbol_index::LibraryRootsQuery
303-
304-
// LineIndexDatabase
305-
crate::LineIndexQuery
306-
307-
// InternDatabase
308-
// hir_db::InternFunctionQuery
309-
// hir_db::InternStructQuery
310-
// hir_db::InternUnionQuery
311-
// hir_db::InternEnumQuery
312-
// hir_db::InternConstQuery
313-
// hir_db::InternStaticQuery
314-
// hir_db::InternTraitQuery
315-
// hir_db::InternTraitAliasQuery
316-
// hir_db::InternTypeAliasQuery
317-
// hir_db::InternImplQuery
318-
// hir_db::InternExternBlockQuery
319-
// hir_db::InternBlockQuery
320-
// hir_db::InternMacro2Query
321-
// hir_db::InternProcMacroQuery
322-
// hir_db::InternMacroRulesQuery
323-
];
324195
}
325196
}
326197

crates/ide/src/lib.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -161,19 +161,19 @@ pub struct AnalysisHost {
161161
}
162162

163163
impl AnalysisHost {
164-
pub fn new(lru_capacity: Option<usize>) -> AnalysisHost {
164+
pub fn new(lru_capacity: Option<u16>) -> AnalysisHost {
165165
AnalysisHost { db: RootDatabase::new(lru_capacity) }
166166
}
167167

168168
pub fn with_database(db: RootDatabase) -> AnalysisHost {
169169
AnalysisHost { db }
170170
}
171171

172-
pub fn update_lru_capacity(&mut self, lru_capacity: Option<usize>) {
172+
pub fn update_lru_capacity(&mut self, lru_capacity: Option<u16>) {
173173
self.db.update_base_query_lru_capacities(lru_capacity);
174174
}
175175

176-
pub fn update_lru_capacities(&mut self, lru_capacities: &FxHashMap<Box<str>, usize>) {
176+
pub fn update_lru_capacities(&mut self, lru_capacities: &FxHashMap<Box<str>, u16>) {
177177
self.db.update_lru_capacities(lru_capacities);
178178
}
179179

crates/load-cargo/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ fn load_crate_graph(
377377
) -> RootDatabase {
378378
let ProjectWorkspace { toolchain, target_layout, .. } = ws;
379379

380-
let lru_cap = std::env::var("RA_LRU_CAP").ok().and_then(|it| it.parse::<usize>().ok());
380+
let lru_cap = std::env::var("RA_LRU_CAP").ok().and_then(|it| it.parse::<u16>().ok());
381381
let mut db = RootDatabase::new(lru_cap);
382382
let mut analysis_change = ChangeWithProcMacros::new();
383383

crates/rust-analyzer/src/config.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -283,9 +283,9 @@ config_data! {
283283
linkedProjects: Vec<ManifestOrProjectJson> = vec![],
284284

285285
/// Number of syntax trees rust-analyzer keeps in memory. Defaults to 128.
286-
lru_capacity: Option<usize> = None,
286+
lru_capacity: Option<u16> = None,
287287
/// Sets the LRU capacity of the specified queries.
288-
lru_query_capacities: FxHashMap<Box<str>, usize> = FxHashMap::default(),
288+
lru_query_capacities: FxHashMap<Box<str>, u16> = FxHashMap::default(),
289289

290290
/// These proc-macros will be ignored when trying to expand them.
291291
///
@@ -1743,11 +1743,11 @@ impl Config {
17431743
extra_env
17441744
}
17451745

1746-
pub fn lru_parse_query_capacity(&self) -> Option<usize> {
1746+
pub fn lru_parse_query_capacity(&self) -> Option<u16> {
17471747
self.lru_capacity().to_owned()
17481748
}
17491749

1750-
pub fn lru_query_capacities_config(&self) -> Option<&FxHashMap<Box<str>, usize>> {
1750+
pub fn lru_query_capacities_config(&self) -> Option<&FxHashMap<Box<str>, u16>> {
17511751
self.lru_query_capacities().is_empty().not().then(|| self.lru_query_capacities())
17521752
}
17531753

@@ -2926,7 +2926,7 @@ fn field_props(field: &str, ty: &str, doc: &[&str], default: &str) -> serde_json
29262926
"FxHashMap<String, String>" => set! {
29272927
"type": "object",
29282928
},
2929-
"FxHashMap<Box<str>, usize>" => set! {
2929+
"FxHashMap<Box<str>, u16>" => set! {
29302930
"type": "object",
29312931
},
29322932
"FxHashMap<String, Option<String>>" => set! {
@@ -2936,6 +2936,11 @@ fn field_props(field: &str, ty: &str, doc: &[&str], default: &str) -> serde_json
29362936
"type": ["null", "integer"],
29372937
"minimum": 0,
29382938
},
2939+
"Option<u16>" => set! {
2940+
"type": ["null", "integer"],
2941+
"minimum": 0,
2942+
"maximum": 65535,
2943+
},
29392944
"Option<String>" => set! {
29402945
"type": ["null", "string"],
29412946
},

crates/salsa/salsa-macros/src/query_group.rs

+14-6
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ pub(crate) fn query_group(args: TokenStream, input: TokenStream) -> TokenStream
5353
num_storages += 1;
5454
}
5555
"dependencies" => {
56-
storage = QueryStorage::Dependencies;
56+
storage = QueryStorage::LruDependencies;
57+
num_storages += 1;
58+
}
59+
"lru" => {
60+
storage = QueryStorage::LruMemoized;
5761
num_storages += 1;
5862
}
5963
"input" => {
@@ -235,7 +239,7 @@ pub(crate) fn query_group(args: TokenStream, input: TokenStream) -> TokenStream
235239

236240
queries_with_storage.push(fn_name);
237241

238-
let tracing = if let QueryStorage::Memoized = query.storage {
242+
let tracing = if let QueryStorage::Memoized | QueryStorage::LruMemoized = query.storage {
239243
let s = format!("{trait_name}::{fn_name}");
240244
Some(quote! {
241245
let _p = tracing::debug_span!(#s, #(#key_names = tracing::field::debug(&#key_names)),*).entered();
@@ -376,8 +380,9 @@ pub(crate) fn query_group(args: TokenStream, input: TokenStream) -> TokenStream
376380

377381
let storage = match &query.storage {
378382
QueryStorage::Memoized => quote!(salsa::plumbing::MemoizedStorage<Self>),
379-
QueryStorage::Dependencies => {
380-
quote!(salsa::plumbing::DependencyStorage<Self>)
383+
QueryStorage::LruMemoized => quote!(salsa::plumbing::LruMemoizedStorage<Self>),
384+
QueryStorage::LruDependencies => {
385+
quote!(salsa::plumbing::LruDependencyStorage<Self>)
381386
}
382387
QueryStorage::Input if query.keys.is_empty() => {
383388
quote!(salsa::plumbing::UnitInputStorage<Self>)
@@ -724,7 +729,8 @@ impl Query {
724729
#[derive(Debug, Clone, PartialEq, Eq)]
725730
enum QueryStorage {
726731
Memoized,
727-
Dependencies,
732+
LruDependencies,
733+
LruMemoized,
728734
Input,
729735
Interned,
730736
InternedLookup { intern_query_type: Ident },
@@ -739,7 +745,9 @@ impl QueryStorage {
739745
| QueryStorage::Interned
740746
| QueryStorage::InternedLookup { .. }
741747
| QueryStorage::Transparent => false,
742-
QueryStorage::Memoized | QueryStorage::Dependencies => true,
748+
QueryStorage::Memoized | QueryStorage::LruMemoized | QueryStorage::LruDependencies => {
749+
true
750+
}
743751
}
744752
}
745753
}

0 commit comments

Comments
 (0)