Skip to content

Commit 00f6a7a

Browse files
committed
Auto merge of #16772 - Veykril:salsa-tracing, r=Veykril
internal: Add tracing spans to macro generated database
2 parents ce15e73 + 9c2fa76 commit 00f6a7a

File tree

16 files changed

+174
-176
lines changed

16 files changed

+174
-176
lines changed

crates/base-db/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub trait Upcast<T: ?Sized> {
4343
}
4444

4545
pub const DEFAULT_PARSE_LRU_CAP: usize = 128;
46-
pub const DEFAULT_BORROWCK_LRU_CAP: usize = 256;
46+
pub const DEFAULT_BORROWCK_LRU_CAP: usize = 1024;
4747

4848
pub trait FileLoader {
4949
/// Text of the file.

crates/hir-def/src/attr.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ impl AttrsWithOwner {
348348
.raw_attrs(AttrOwner::ModItem(definition_tree_id.value.into()))
349349
.clone(),
350350
ModuleOrigin::BlockExpr { id, .. } => {
351-
let tree = db.block_item_tree_query(id);
351+
let tree = db.block_item_tree(id);
352352
tree.raw_attrs(AttrOwner::TopLevel).clone()
353353
}
354354
}

crates/hir-def/src/db.rs

+2-11
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,10 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + Upcast<dyn ExpandDataba
8787
fn file_item_tree(&self, file_id: HirFileId) -> Arc<ItemTree>;
8888

8989
#[salsa::invoke(ItemTree::block_item_tree_query)]
90-
fn block_item_tree_query(&self, block_id: BlockId) -> Arc<ItemTree>;
91-
92-
#[salsa::invoke(crate_def_map_wait)]
93-
#[salsa::transparent]
94-
fn crate_def_map(&self, krate: CrateId) -> Arc<DefMap>;
90+
fn block_item_tree(&self, block_id: BlockId) -> Arc<ItemTree>;
9591

9692
#[salsa::invoke(DefMap::crate_def_map_query)]
97-
fn crate_def_map_query(&self, krate: CrateId) -> Arc<DefMap>;
93+
fn crate_def_map(&self, krate: CrateId) -> Arc<DefMap>;
9894

9995
/// Computes the block-level `DefMap`.
10096
#[salsa::invoke(DefMap::block_def_map_query)]
@@ -253,11 +249,6 @@ fn include_macro_invoc(db: &dyn DefDatabase, krate: CrateId) -> Vec<(MacroCallId
253249
.collect()
254250
}
255251

256-
fn crate_def_map_wait(db: &dyn DefDatabase, krate: CrateId) -> Arc<DefMap> {
257-
let _p = tracing::span!(tracing::Level::INFO, "crate_def_map:wait").entered();
258-
db.crate_def_map_query(krate)
259-
}
260-
261252
fn crate_supports_no_std(db: &dyn DefDatabase, crate_id: CrateId) -> bool {
262253
let file = db.crate_graph()[crate_id].root_file_id;
263254
let item_tree = db.file_item_tree(file.into());

crates/hir-def/src/item_tree.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ impl TreeId {
392392

393393
pub(crate) fn item_tree(&self, db: &dyn DefDatabase) -> Arc<ItemTree> {
394394
match self.block {
395-
Some(block) => db.block_item_tree_query(block),
395+
Some(block) => db.block_item_tree(block),
396396
None => db.file_item_tree(self.file),
397397
}
398398
}

crates/hir-ty/src/db.rs

+2-47
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,8 @@ use hir_expand::name::Name;
3131

3232
#[salsa::query_group(HirDatabaseStorage)]
3333
pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
34-
#[salsa::invoke(infer_wait)]
35-
#[salsa::transparent]
36-
fn infer(&self, def: DefWithBodyId) -> Arc<InferenceResult>;
37-
3834
#[salsa::invoke(crate::infer::infer_query)]
39-
fn infer_query(&self, def: DefWithBodyId) -> Arc<InferenceResult>;
35+
fn infer(&self, def: DefWithBodyId) -> Arc<InferenceResult>;
4036

4137
// region:mir
4238

@@ -258,17 +254,8 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
258254
env: Arc<TraitEnvironment>,
259255
) -> Ty;
260256

261-
#[salsa::invoke(trait_solve_wait)]
262-
#[salsa::transparent]
263-
fn trait_solve(
264-
&self,
265-
krate: CrateId,
266-
block: Option<BlockId>,
267-
goal: crate::Canonical<crate::InEnvironment<crate::Goal>>,
268-
) -> Option<crate::Solution>;
269-
270257
#[salsa::invoke(crate::traits::trait_solve_query)]
271-
fn trait_solve_query(
258+
fn trait_solve(
272259
&self,
273260
krate: CrateId,
274261
block: Option<BlockId>,
@@ -284,38 +271,6 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
284271
) -> chalk_ir::ProgramClauses<Interner>;
285272
}
286273

287-
fn infer_wait(db: &dyn HirDatabase, def: DefWithBodyId) -> Arc<InferenceResult> {
288-
let detail = match def {
289-
DefWithBodyId::FunctionId(it) => db.function_data(it).name.display(db.upcast()).to_string(),
290-
DefWithBodyId::StaticId(it) => {
291-
db.static_data(it).name.clone().display(db.upcast()).to_string()
292-
}
293-
DefWithBodyId::ConstId(it) => db
294-
.const_data(it)
295-
.name
296-
.clone()
297-
.unwrap_or_else(Name::missing)
298-
.display(db.upcast())
299-
.to_string(),
300-
DefWithBodyId::VariantId(it) => {
301-
db.enum_variant_data(it).name.display(db.upcast()).to_string()
302-
}
303-
DefWithBodyId::InTypeConstId(it) => format!("in type const {it:?}"),
304-
};
305-
let _p = tracing::span!(tracing::Level::INFO, "infer:wait", ?detail).entered();
306-
db.infer_query(def)
307-
}
308-
309-
fn trait_solve_wait(
310-
db: &dyn HirDatabase,
311-
krate: CrateId,
312-
block: Option<BlockId>,
313-
goal: crate::Canonical<crate::InEnvironment<crate::Goal>>,
314-
) -> Option<crate::Solution> {
315-
let _p = tracing::span!(tracing::Level::INFO, "trait_solve::wait").entered();
316-
db.trait_solve_query(krate, block, goal)
317-
}
318-
319274
#[test]
320275
fn hir_database_is_object_safe() {
321276
fn _assert_object_safe(_: &dyn HirDatabase) {}

crates/hir/src/db.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@
44
//!
55
//! But we need this for at least LRU caching at the query level.
66
pub use hir_def::db::{
7-
AttrsQuery, BlockDefMapQuery, BlockItemTreeQueryQuery, BodyQuery, BodyWithSourceMapQuery,
8-
ConstDataQuery, ConstVisibilityQuery, CrateDefMapQueryQuery, CrateLangItemsQuery,
9-
CrateSupportsNoStdQuery, DefDatabase, DefDatabaseStorage, EnumDataQuery,
10-
EnumVariantDataWithDiagnosticsQuery, ExprScopesQuery, ExternCrateDeclDataQuery,
11-
FieldVisibilitiesQuery, FieldsAttrsQuery, FieldsAttrsSourceMapQuery, FileItemTreeQuery,
12-
FunctionDataQuery, FunctionVisibilityQuery, GenericParamsQuery, ImplDataWithDiagnosticsQuery,
13-
ImportMapQuery, InternAnonymousConstQuery, InternBlockQuery, InternConstQuery, InternDatabase,
14-
InternDatabaseStorage, InternEnumQuery, InternExternBlockQuery, InternExternCrateQuery,
15-
InternFunctionQuery, InternImplQuery, InternInTypeConstQuery, InternMacro2Query,
16-
InternMacroRulesQuery, InternProcMacroQuery, InternStaticQuery, InternStructQuery,
17-
InternTraitAliasQuery, InternTraitQuery, InternTypeAliasQuery, InternUnionQuery,
18-
InternUseQuery, LangItemQuery, Macro2DataQuery, MacroRulesDataQuery, ProcMacroDataQuery,
19-
StaticDataQuery, StructDataWithDiagnosticsQuery, TraitAliasDataQuery,
20-
TraitDataWithDiagnosticsQuery, TypeAliasDataQuery, UnionDataWithDiagnosticsQuery,
7+
AttrsQuery, BlockDefMapQuery, BodyQuery, BodyWithSourceMapQuery, ConstDataQuery,
8+
ConstVisibilityQuery, CrateLangItemsQuery, CrateSupportsNoStdQuery, DefDatabase,
9+
DefDatabaseStorage, EnumDataQuery, EnumVariantDataWithDiagnosticsQuery, ExprScopesQuery,
10+
ExternCrateDeclDataQuery, FieldVisibilitiesQuery, FieldsAttrsQuery, FieldsAttrsSourceMapQuery,
11+
FileItemTreeQuery, FunctionDataQuery, FunctionVisibilityQuery, GenericParamsQuery,
12+
ImplDataWithDiagnosticsQuery, ImportMapQuery, InternAnonymousConstQuery, InternBlockQuery,
13+
InternConstQuery, InternDatabase, InternDatabaseStorage, InternEnumQuery,
14+
InternExternBlockQuery, InternExternCrateQuery, InternFunctionQuery, InternImplQuery,
15+
InternInTypeConstQuery, InternMacro2Query, InternMacroRulesQuery, InternProcMacroQuery,
16+
InternStaticQuery, InternStructQuery, InternTraitAliasQuery, InternTraitQuery,
17+
InternTypeAliasQuery, InternUnionQuery, InternUseQuery, LangItemQuery, Macro2DataQuery,
18+
MacroRulesDataQuery, ProcMacroDataQuery, StaticDataQuery, StructDataWithDiagnosticsQuery,
19+
TraitAliasDataQuery, TraitDataWithDiagnosticsQuery, TypeAliasDataQuery,
20+
UnionDataWithDiagnosticsQuery,
2121
};
2222
pub use hir_expand::db::{
2323
AstIdMapQuery, DeclMacroExpanderQuery, ExpandDatabase, ExpandDatabaseStorage,

crates/ide-db/src/apply_change.rs

-4
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ impl RootDatabase {
9191
crate::symbol_index::LocalRootsQuery
9292
crate::symbol_index::LibraryRootsQuery
9393
// HirDatabase
94-
hir::db::InferQueryQuery
9594
hir::db::MirBodyQuery
9695
hir::db::BorrowckQuery
9796
hir::db::TyQuery
@@ -130,12 +129,10 @@ impl RootDatabase {
130129
hir::db::FnDefVarianceQuery
131130
hir::db::AdtVarianceQuery
132131
hir::db::AssociatedTyValueQuery
133-
hir::db::TraitSolveQueryQuery
134132
hir::db::ProgramClausesForChalkEnvQuery
135133

136134
// DefDatabase
137135
hir::db::FileItemTreeQuery
138-
hir::db::CrateDefMapQueryQuery
139136
hir::db::BlockDefMapQuery
140137
hir::db::StructDataWithDiagnosticsQuery
141138
hir::db::UnionDataWithDiagnosticsQuery
@@ -165,7 +162,6 @@ impl RootDatabase {
165162
hir::db::FunctionVisibilityQuery
166163
hir::db::ConstVisibilityQuery
167164
hir::db::CrateSupportsNoStdQuery
168-
hir::db::BlockItemTreeQueryQuery
169165
hir::db::ExternCrateDeclDataQuery
170166
hir::db::InternAnonymousConstQuery
171167
hir::db::InternExternCrateQuery

crates/ide-db/src/lib.rs

-3
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,6 @@ impl RootDatabase {
216216

217217
// DefDatabase
218218
hir_db::FileItemTreeQuery
219-
hir_db::CrateDefMapQueryQuery
220219
hir_db::BlockDefMapQuery
221220
hir_db::StructDataWithDiagnosticsQuery
222221
hir_db::UnionDataWithDiagnosticsQuery
@@ -248,7 +247,6 @@ impl RootDatabase {
248247
hir_db::CrateSupportsNoStdQuery
249248

250249
// HirDatabase
251-
hir_db::InferQueryQuery
252250
hir_db::MirBodyQuery
253251
hir_db::BorrowckQuery
254252
hir_db::TyQuery
@@ -287,7 +285,6 @@ impl RootDatabase {
287285
hir_db::FnDefVarianceQuery
288286
hir_db::AdtVarianceQuery
289287
hir_db::AssociatedTyValueQuery
290-
hir_db::TraitSolveQueryQuery
291288
hir_db::ProgramClausesForChalkEnvQuery
292289

293290
// SymbolsDatabase

crates/rust-analyzer/src/integrated_benchmarks.rs

+78-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
//! which you can use to paste the command in terminal and add `--release` manually.
1212
1313
use hir::ChangeWithProcMacros;
14-
use ide::{AnalysisHost, CallableSnippets, CompletionConfig, FilePosition, TextSize};
14+
use ide::{
15+
AnalysisHost, CallableSnippets, CompletionConfig, DiagnosticsConfig, FilePosition, TextSize,
16+
};
1517
use ide_db::{
1618
imports::insert_use::{ImportGranularity, InsertUseConfig},
1719
SnippetCap,
@@ -157,7 +159,7 @@ fn integrated_completion_benchmark() {
157159
analysis.completions(&config, position, None).unwrap();
158160
}
159161

160-
crate::tracing::hprof::init("*>5");
162+
let _g = crate::tracing::hprof::init("*");
161163

162164
let completion_offset = {
163165
let _it = stdx::timeit("change");
@@ -244,6 +246,80 @@ fn integrated_completion_benchmark() {
244246
}
245247
}
246248

249+
#[test]
250+
fn integrated_diagnostics_benchmark() {
251+
if std::env::var("RUN_SLOW_BENCHES").is_err() {
252+
return;
253+
}
254+
255+
// Load rust-analyzer itself.
256+
let workspace_to_load = project_root();
257+
let file = "./crates/hir/src/lib.rs";
258+
259+
let cargo_config = CargoConfig {
260+
sysroot: Some(project_model::RustLibSource::Discover),
261+
..CargoConfig::default()
262+
};
263+
let load_cargo_config = LoadCargoConfig {
264+
load_out_dirs_from_check: true,
265+
with_proc_macro_server: ProcMacroServerChoice::None,
266+
prefill_caches: true,
267+
};
268+
269+
let (db, vfs, _proc_macro) = {
270+
let _it = stdx::timeit("workspace loading");
271+
load_workspace_at(&workspace_to_load, &cargo_config, &load_cargo_config, &|_| {}).unwrap()
272+
};
273+
let mut host = AnalysisHost::with_database(db);
274+
275+
let file_id = {
276+
let file = workspace_to_load.join(file);
277+
let path = VfsPath::from(AbsPathBuf::assert(file));
278+
vfs.file_id(&path).unwrap_or_else(|| panic!("can't find virtual file for {path}"))
279+
};
280+
281+
let diagnostics_config = DiagnosticsConfig {
282+
enabled: false,
283+
proc_macros_enabled: true,
284+
proc_attr_macros_enabled: true,
285+
disable_experimental: true,
286+
disabled: Default::default(),
287+
expr_fill_default: Default::default(),
288+
style_lints: false,
289+
insert_use: InsertUseConfig {
290+
granularity: ImportGranularity::Crate,
291+
enforce_granularity: false,
292+
prefix_kind: hir::PrefixKind::ByCrate,
293+
group: true,
294+
skip_glob_imports: true,
295+
},
296+
prefer_no_std: false,
297+
prefer_prelude: false,
298+
};
299+
host.analysis()
300+
.diagnostics(&diagnostics_config, ide::AssistResolveStrategy::None, file_id)
301+
.unwrap();
302+
303+
let _g = crate::tracing::hprof::init("*>1");
304+
305+
{
306+
let _it = stdx::timeit("change");
307+
let mut text = host.analysis().file_text(file_id).unwrap().to_string();
308+
patch(&mut text, "db.struct_data(self.id)", "();\ndb.struct_data(self.id)");
309+
let mut change = ChangeWithProcMacros::new();
310+
change.change_file(file_id, Some(Arc::from(text)));
311+
host.apply_change(change);
312+
};
313+
314+
{
315+
let _p = tracing::span!(tracing::Level::INFO, "diagnostics").entered();
316+
let _span = profile::cpu_span();
317+
host.analysis()
318+
.diagnostics(&diagnostics_config, ide::AssistResolveStrategy::None, file_id)
319+
.unwrap();
320+
}
321+
}
322+
247323
fn patch(what: &mut String, from: &str, to: &str) -> usize {
248324
let idx = what.find(from).unwrap();
249325
*what = what.replacen(from, to, 1);

crates/rust-analyzer/src/tracing/config.rs

+5-36
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,10 @@
44
use std::io;
55

66
use anyhow::Context;
7-
use tracing::{level_filters::LevelFilter, Level};
7+
use tracing::level_filters::LevelFilter;
88
use tracing_subscriber::{
9-
filter::{self, Targets},
10-
fmt::{format::FmtSpan, MakeWriter},
11-
layer::SubscriberExt,
12-
util::SubscriberInitExt,
13-
Layer, Registry,
9+
filter::Targets, fmt::MakeWriter, layer::SubscriberExt, util::SubscriberInitExt, Layer,
10+
Registry,
1411
};
1512
use tracing_tree::HierarchicalLayer;
1613

@@ -50,10 +47,7 @@ where
5047

5148
let writer = self.writer;
5249

53-
let ra_fmt_layer = tracing_subscriber::fmt::layer()
54-
.with_span_events(FmtSpan::CLOSE)
55-
.with_writer(writer)
56-
.with_filter(filter);
50+
let ra_fmt_layer = tracing_subscriber::fmt::layer().with_writer(writer).with_filter(filter);
5751

5852
let mut chalk_layer = None;
5953
if let Some(chalk_filter) = self.chalk_filter {
@@ -74,32 +68,7 @@ where
7468
);
7569
};
7670

77-
let mut profiler_layer = None;
78-
if let Some(spec) = self.profile_filter {
79-
let (write_filter, allowed_names) = hprof::WriteFilter::from_spec(&spec);
80-
81-
// this filter the first pass for `tracing`: these are all the "profiling" spans, but things like
82-
// span depth or duration are not filtered here: that only occurs at write time.
83-
let profile_filter = filter::filter_fn(move |metadata| {
84-
let allowed = match &allowed_names {
85-
Some(names) => names.contains(metadata.name()),
86-
None => true,
87-
};
88-
89-
metadata.is_span()
90-
&& allowed
91-
&& metadata.level() >= &Level::INFO
92-
&& !metadata.target().starts_with("salsa")
93-
&& !metadata.target().starts_with("chalk")
94-
});
95-
96-
let layer = hprof::SpanTree::default()
97-
.aggregate(true)
98-
.spec_filter(write_filter)
99-
.with_filter(profile_filter);
100-
101-
profiler_layer = Some(layer);
102-
}
71+
let profiler_layer = self.profile_filter.map(|spec| hprof::layer(&spec));
10372

10473
Registry::default().with(ra_fmt_layer).with(chalk_layer).with(profiler_layer).try_init()?;
10574

0 commit comments

Comments
 (0)