From 93d0ac7fa0a5a9548ac07e22ac14eee46550172c Mon Sep 17 00:00:00 2001
From: Jonas Schievink <jonas.schievink@ferrous-systems.com>
Date: Fri, 3 Jul 2020 17:12:29 +0200
Subject: [PATCH 1/2] Fix memory usage accounting for interned queries

---
 crates/ra_ide_db/src/change.rs | 47 ++++++++++++++++++++++------------
 1 file changed, 30 insertions(+), 17 deletions(-)

diff --git a/crates/ra_ide_db/src/change.rs b/crates/ra_ide_db/src/change.rs
index dbe6eacc599..2504d7a3388 100644
--- a/crates/ra_ide_db/src/change.rs
+++ b/crates/ra_ide_db/src/change.rs
@@ -191,12 +191,10 @@ impl RootDatabase {
 
             // AstDatabase
             hir::db::AstIdMapQuery
-            hir::db::InternMacroQuery
             hir::db::MacroArgQuery
             hir::db::MacroDefQuery
             hir::db::ParseMacroQuery
             hir::db::MacroExpandQuery
-            hir::db::InternEagerExpansionQuery
 
             // DefDatabase
             hir::db::ItemTreeQuery
@@ -221,17 +219,6 @@ impl RootDatabase {
             hir::db::DocumentationQuery
             hir::db::ImportMapQuery
 
-            // InternDatabase
-            hir::db::InternFunctionQuery
-            hir::db::InternStructQuery
-            hir::db::InternUnionQuery
-            hir::db::InternEnumQuery
-            hir::db::InternConstQuery
-            hir::db::InternStaticQuery
-            hir::db::InternTraitQuery
-            hir::db::InternTypeAliasQuery
-            hir::db::InternImplQuery
-
             // HirDatabase
             hir::db::InferQueryQuery
             hir::db::TyQuery
@@ -246,10 +233,6 @@ impl RootDatabase {
             hir::db::InherentImplsInCrateQuery
             hir::db::TraitImplsInCrateQuery
             hir::db::TraitImplsInDepsQuery
-            hir::db::InternTypeCtorQuery
-            hir::db::InternTypeParamIdQuery
-            hir::db::InternChalkImplQuery
-            hir::db::InternAssocTyValueQuery
             hir::db::AssociatedTyDataQuery
             hir::db::TraitDatumQuery
             hir::db::StructDatumQuery
@@ -264,6 +247,36 @@ impl RootDatabase {
             // LineIndexDatabase
             crate::LineIndexQuery
         ];
+
+        // To collect interned data, we need to bump the revision counter by performing a synthetic
+        // write.
+        // We do this after collecting the non-interned queries to correctly attribute memory used
+        // by interned data.
+        self.runtime.synthetic_write(Durability::HIGH);
+
+        sweep_each_query![
+            // AstDatabase
+            hir::db::InternMacroQuery
+            hir::db::InternEagerExpansionQuery
+
+            // InternDatabase
+            hir::db::InternFunctionQuery
+            hir::db::InternStructQuery
+            hir::db::InternUnionQuery
+            hir::db::InternEnumQuery
+            hir::db::InternConstQuery
+            hir::db::InternStaticQuery
+            hir::db::InternTraitQuery
+            hir::db::InternTypeAliasQuery
+            hir::db::InternImplQuery
+
+            // HirDatabase
+            hir::db::InternTypeCtorQuery
+            hir::db::InternTypeParamIdQuery
+            hir::db::InternChalkImplQuery
+            hir::db::InternAssocTyValueQuery
+        ];
+
         acc.sort_by_key(|it| std::cmp::Reverse(it.1));
         acc
     }

From f01e7e3601423e176e16c66aebbe6aca541a5731 Mon Sep 17 00:00:00 2001
From: Jonas Schievink <jonas.schievink@ferrous-systems.com>
Date: Fri, 3 Jul 2020 17:16:01 +0200
Subject: [PATCH 2/2] Track VFS and remaining/unaccounted memory

---
 crates/rust-analyzer/src/cli/analysis_stats.rs | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/crates/rust-analyzer/src/cli/analysis_stats.rs b/crates/rust-analyzer/src/cli/analysis_stats.rs
index 14982919dbb..84626404697 100644
--- a/crates/rust-analyzer/src/cli/analysis_stats.rs
+++ b/crates/rust-analyzer/src/cli/analysis_stats.rs
@@ -273,12 +273,22 @@ pub fn analysis_stats(
     println!("Total: {:?}, {}", analysis_time.elapsed(), ra_prof::memory_usage());
 
     if memory_usage {
-        for (name, bytes) in host.per_query_memory_usage() {
-            println!("{:>8} {}", bytes, name)
-        }
+        let mut mem = host.per_query_memory_usage();
+
+        let before = ra_prof::memory_usage();
+        drop(vfs);
+        let vfs = before.allocated - ra_prof::memory_usage().allocated;
+        mem.push(("VFS".into(), vfs));
+
         let before = ra_prof::memory_usage();
         drop(host);
-        println!("leftover: {}", before.allocated - ra_prof::memory_usage().allocated)
+        mem.push(("Unaccounted".into(), before.allocated - ra_prof::memory_usage().allocated));
+
+        mem.push(("Remaining".into(), ra_prof::memory_usage().allocated));
+
+        for (name, bytes) in mem {
+            println!("{:>8} {}", bytes, name)
+        }
     }
 
     Ok(())