diff --git a/Cargo.lock b/Cargo.lock index f07ed8c8c9..e49e7521c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3441,7 +3441,7 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "salsa" version = "0.23.0" -source = "git+https://github.com/salsa-rs/salsa?rev=f3dc2f30f9a250618161e35600a00de7fe744953#f3dc2f30f9a250618161e35600a00de7fe744953" +source = "git+https://github.com/salsa-rs/salsa.git?rev=86ca4a9d70e97dd5107e6111a09647dd10ff7535#86ca4a9d70e97dd5107e6111a09647dd10ff7535" dependencies = [ "boxcar", "compact_str", @@ -3454,7 +3454,6 @@ dependencies = [ "inventory", "parking_lot", "portable-atomic", - "rayon", "rustc-hash", "salsa-macro-rules", "salsa-macros", @@ -3466,12 +3465,12 @@ dependencies = [ [[package]] name = "salsa-macro-rules" version = "0.23.0" -source = "git+https://github.com/salsa-rs/salsa?rev=f3dc2f30f9a250618161e35600a00de7fe744953#f3dc2f30f9a250618161e35600a00de7fe744953" +source = "git+https://github.com/salsa-rs/salsa.git?rev=86ca4a9d70e97dd5107e6111a09647dd10ff7535#86ca4a9d70e97dd5107e6111a09647dd10ff7535" [[package]] name = "salsa-macros" version = "0.23.0" -source = "git+https://github.com/salsa-rs/salsa?rev=f3dc2f30f9a250618161e35600a00de7fe744953#f3dc2f30f9a250618161e35600a00de7fe744953" +source = "git+https://github.com/salsa-rs/salsa.git?rev=86ca4a9d70e97dd5107e6111a09647dd10ff7535#86ca4a9d70e97dd5107e6111a09647dd10ff7535" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index dbf310328a..12dd3b015f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -141,7 +141,12 @@ regex-automata = { version = "0.4.9" } rustc-hash = { version = "2.0.0" } rustc-stable-hash = { version = "0.1.2" } # When updating salsa, make sure to also update the revision in `fuzz/Cargo.toml` -salsa = { git = "https://github.com/salsa-rs/salsa", rev = "f3dc2f30f9a250618161e35600a00de7fe744953" } +salsa = { git = "https://github.com/salsa-rs/salsa.git", rev = "86ca4a9d70e97dd5107e6111a09647dd10ff7535", default-features = false, features = [ + "compact_str", + "macros", + "salsa_unstable", + "inventory", +] } schemars = { version = "0.8.16" } seahash = { version = "4.1.0" } serde = { version = "1.0.197", features = ["derive"] } diff --git a/crates/ty/src/lib.rs b/crates/ty/src/lib.rs index 8a0c5b9fcd..edccc6d7d8 100644 --- a/crates/ty/src/lib.rs +++ b/crates/ty/src/lib.rs @@ -24,7 +24,7 @@ use rayon::ThreadPoolBuilder; use ruff_db::diagnostic::{Diagnostic, DisplayDiagnosticConfig, Severity}; use ruff_db::max_parallelism; use ruff_db::system::{OsSystem, SystemPath, SystemPathBuf}; -use salsa::plumbing::ZalsaDatabase; +use salsa::Database; use ty_project::metadata::options::ProjectOptionsOverrides; use ty_project::watch::ProjectWatcher; use ty_project::{Db, watch}; @@ -380,9 +380,7 @@ impl MainLoop { } MainLoopMessage::Exit => { // Cancel any pending queries and wait for them to complete. - // TODO: Don't use Salsa internal APIs - // [Zulip-Thread](https://salsa.zulipchat.com/#narrow/stream/333573-salsa-3.2E0/topic/Expose.20an.20API.20to.20cancel.20other.20queries) - let _ = db.zalsa_mut(); + db.trigger_cancellation(); return Ok(ExitStatus::Success); } } diff --git a/crates/ty_project/src/db.rs b/crates/ty_project/src/db.rs index d4d9a12e40..1871e814db 100644 --- a/crates/ty_project/src/db.rs +++ b/crates/ty_project/src/db.rs @@ -12,8 +12,7 @@ use ruff_db::diagnostic::Diagnostic; use ruff_db::files::{File, Files}; use ruff_db::system::System; use ruff_db::vendored::VendoredFileSystem; -use salsa::plumbing::ZalsaDatabase; -use salsa::{Event, Setter}; +use salsa::{Database, Event, Setter}; use ty_python_semantic::lint::{LintRegistry, RuleSelection}; use ty_python_semantic::{Db as SemanticDb, Program}; @@ -34,7 +33,7 @@ pub struct ProjectDatabase { // or the "trick" to get a mutable `Arc` in `Self::system_mut` is no longer guaranteed to work. system: Arc, - // IMPORTANT: This field must be the last because we use `zalsa_mut` (drops all other storage references) + // IMPORTANT: This field must be the last because we use `trigger_cancellation` (drops all other storage references) // to drop all other references to the database, which gives us exclusive access to other `Arc`s stored on this db. // However, for this to work it's important that the `storage` is dropped AFTER any `Arc` that // we try to mutably borrow using `Arc::get_mut` (like `system`). @@ -114,12 +113,11 @@ impl ProjectDatabase { /// /// WARNING: Triggers a new revision, canceling other database handles. This can lead to deadlock. pub fn system_mut(&mut self) -> &mut dyn System { - // TODO: Use a more official method to cancel other queries. - // https://salsa.zulipchat.com/#narrow/stream/333573-salsa-3.2E0/topic/Expose.20an.20API.20to.20cancel.20other.20queries - let _ = self.zalsa_mut(); + self.trigger_cancellation(); - Arc::get_mut(&mut self.system) - .expect("ref count should be 1 because `zalsa_mut` drops all other DB references.") + Arc::get_mut(&mut self.system).expect( + "ref count should be 1 because `trigger_cancellation` drops all other DB references.", + ) } /// Returns a [`SalsaMemoryDump`] that can be use to dump Salsa memory usage information diff --git a/crates/ty_project/src/files.rs b/crates/ty_project/src/files.rs index fbf888b16d..8f1b813bc1 100644 --- a/crates/ty_project/src/files.rs +++ b/crates/ty_project/src/files.rs @@ -58,17 +58,16 @@ impl IndexedFiles { /// /// The changes are automatically written back to the database once the view is dropped. pub(super) fn indexed_mut(db: &mut dyn Db, project: Project) -> Option { - // Calling `zalsa_mut` cancels all pending salsa queries. This ensures that there are no pending - // reads to the file set. - // TODO: Use a non-internal API instead https://salsa.zulipchat.com/#narrow/stream/333573-salsa-3.2E0/topic/Expose.20an.20API.20to.20cancel.20other.20queries - let _ = db.as_dyn_database_mut().zalsa_mut(); + // Calling `trigger_cancellation` cancels all pending salsa queries. This ensures that there are no pending + // reads to the file set (this `db` is the only alive db). + db.trigger_cancellation(); // Replace the state with lazy. The `IndexedMut` guard restores the state // to `State::Indexed` or sets a new `PackageFiles` when it gets dropped to ensure the state // is restored to how it has been before replacing the value. // // It isn't necessary to hold on to the lock after this point: - // * The above call to `zalsa_mut` guarantees that there's exactly **one** DB reference. + // * The above call to `trigger_cancellation` guarantees that there's exactly **one** DB reference. // * `Indexed` has a `'db` lifetime, and this method requires a `&mut db`. // This means that there can't be any pending reference to `Indexed` because Rust // doesn't allow borrowing `db` as mutable (to call this method) and immutable (`Indexed<'db>`) at the same time. diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index b75171887e..b2d71742b7 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -30,7 +30,12 @@ ty_python_semantic = { path = "../crates/ty_python_semantic" } ty_vendored = { path = "../crates/ty_vendored" } libfuzzer-sys = { git = "https://github.com/rust-fuzz/libfuzzer", default-features = false } -salsa = { git = "https://github.com/salsa-rs/salsa", rev = "f3dc2f30f9a250618161e35600a00de7fe744953" } +salsa = { git = "https://github.com/salsa-rs/salsa.git", rev = "86ca4a9d70e97dd5107e6111a09647dd10ff7535", default-features = false, features = [ + "compact_str", + "macros", + "salsa_unstable", + "inventory", +] } similar = { version = "2.5.0" } tracing = { version = "0.1.40" }