astral-sh / ruff

An extremely fast Python linter and code formatter, written in Rust.
https://docs.astral.sh/ruff
MIT License
30.99k stars 1.03k forks source link

Red Knot panics when changing editor text rapidly #13071

Open dhruvmanila opened 3 weeks ago

dhruvmanila commented 3 weeks ago

Discovered in https://github.com/astral-sh/ruff/pull/13042.

2024-08-22 15:33:38.802 [info] panicked at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/tracked_struct.rs:377:9:
two concurrent writers to Id(4800), should not be possible

This could very well be a Salsa bug but we need a way to reproduce there reliably.

What am I doing in the video below is to type of def and then removing all content from the file and then typing def again.

https://github.com/user-attachments/assets/502c8bbb-8f7a-47ee-8f76-b9c25cdabf6c

MichaReiser commented 2 weeks ago

A stack trace would be very helpful to understand where this is throwing. This may or may not be a salsa bug.

dhruvmanila commented 2 weeks ago
Server logs (including the panic stack trace):

``` 2024-09-02 15:14:54.781 [info] Name: Ruff 2024-09-02 15:14:54.781 [info] Module: ruff 2024-09-02 15:14:54.781 [info] Python extension loading 2024-09-02 15:14:54.781 [info] Waiting for interpreter from python extension. 2024-09-02 15:14:54.840 [info] Python extension loaded 2024-09-02 15:14:54.841 [info] Using interpreter: /Users/dhruv/playground/.venv/bin/python 2024-09-02 15:14:54.854 [info] Using 'path' setting: /Users/dhruv/work/astral/ruff/target/debug/red_knot 2024-09-02 15:14:55.108 [info] Found Ruff 0.0.0 at /Users/dhruv/work/astral/ruff/target/debug/red_knot 2024-09-02 15:14:55.108 [info] Server run command: /Users/dhruv/work/astral/ruff/target/debug/red_knot server 2024-09-02 15:14:55.108 [info] Server: Start requested. 2024-09-02 15:15:00.925 [info] panicked at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/tracked_struct.rs:377:9: two concurrent writers to Id(3400), should not be possible 2024-09-02 15:15:00.970 [info] 0: std::backtrace_rs::backtrace::libunwind::trace at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/../../backtrace/src/backtrace/libunwind.rs:116:5 1: std::backtrace_rs::backtrace::trace_unsynchronized at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5 2: std::backtrace::Backtrace::create at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/backtrace.rs:331:13 3: red_knot_server::server::Server::run::{{closure}} at /Users/dhruv/work/astral/ruff/crates/red_knot_server/src/server.rs:145:29 2024-09-02 15:15:00.970 [info] 4: as core::ops::function::Fn>::call at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/alloc/src/boxed.rs:2077:9 5: std::panicking::rust_panic_with_hook at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panicking.rs:799:13 6: std::panicking::begin_panic_handler::{{closure}} at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panicking.rs:664:13 7: std::sys_common::backtrace::__rust_end_short_backtrace at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/sys_common/backtrace.rs:171:18 8: rust_begin_unwind at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panicking.rs:652:5 9: core::panicking::panic_fmt at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/core/src/panicking.rs:72:14 10: salsa::tracked_struct::IngredientImpl::update at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/tracked_struct.rs:377:9 11: salsa::tracked_struct::IngredientImpl::new_struct at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/tracked_struct.rs:272:17 12: red_knot_python_semantic::semantic_index::symbol::_::::new at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/components/salsa-macro-rules/src/setup_tracked_struct.rs:192:21 13: red_knot_python_semantic::semantic_index::builder::SemanticIndexBuilder::push_scope_with_parent at /Users/dhruv/work/astral/ruff/crates/red_knot_python_semantic/src/semantic_index/builder.rs:109:24 14: red_knot_python_semantic::semantic_index::builder::SemanticIndexBuilder::push_scope at /Users/dhruv/work/astral/ruff/crates/red_knot_python_semantic/src/semantic_index/builder.rs:90:9 15: ::visit_stmt::{{closure}} at /Users/dhruv/work/astral/ruff/crates/red_knot_python_semantic/src/semantic_index/builder.rs:404:25 16: red_knot_python_semantic::semantic_index::builder::SemanticIndexBuilder::with_type_params at /Users/dhruv/work/astral/ruff/crates/red_knot_python_semantic/src/semantic_index/builder.rs:263:28 17: ::visit_stmt at /Users/dhruv/work/astral/ruff/crates/red_knot_python_semantic/src/semantic_index/builder.rs:395:17 18: ruff_python_ast::visitor::walk_body at /Users/dhruv/work/astral/ruff/crates/ruff_python_ast/src/visitor.rs:115:9 19: ruff_python_ast::visitor::Visitor::visit_body at /Users/dhruv/work/astral/ruff/crates/ruff_python_ast/src/visitor.rs:94:9 20: red_knot_python_semantic::semantic_index::builder::SemanticIndexBuilder::build at /Users/dhruv/work/astral/ruff/crates/red_knot_python_semantic/src/semantic_index/builder.rs:334:9 21: ::execute::inner_ at /Users/dhruv/work/astral/ruff/crates/red_knot_python_semantic/src/semantic_index.rs:42:5 22: ::execute at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/components/salsa-macro-rules/src/setup_tracked_fn.rs:179:21 23: salsa::function::execute::>::execute::{{closure}} at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/function/execute.rs:52:43 24: as core::ops::function::FnOnce<()>>::call_once at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/core/src/panic/unwind_safe.rs:272:9 25: std::panicking::try::do_call at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panicking.rs:559:40 26: ___rust_try 27: std::panicking::try at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panicking.rs:523:19 28: std::panic::catch_unwind at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panic.rs:149:14 29: salsa::cycle::Cycle::catch at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/cycle.rs:42:15 30: salsa::function::execute::>::execute at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/function/execute.rs:52:27 31: salsa::function::fetch::>::fetch_cold at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/function/fetch.rs:95:14 32: salsa::function::fetch::>::compute_value::{{closure}} at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/function/fetch.rs:35:68 33: core::option::Option::or_else at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/core/src/option.rs:1515:21 34: salsa::function::fetch::>::compute_value at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/function/fetch.rs:35:34 35: salsa::function::fetch::>::fetch at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/function/fetch.rs:17:13 36: red_knot_python_semantic::semantic_index::semantic_index::{{closure}} at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/components/salsa-macro-rules/src/setup_tracked_fn.rs:278:25 37: salsa::attach::Attached::attach at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/attach.rs:71:9 38: salsa::attach::attach::{{closure}} at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/attach.rs:91:23 39: std::thread::local::LocalKey::try_with at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/thread/local.rs:283:12 40: std::thread::local::LocalKey::with at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/thread/local.rs:260:9 41: salsa::attach::attach at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/attach.rs:91:5 42: red_knot_python_semantic::semantic_index::semantic_index at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/components/salsa-macro-rules/src/setup_tracked_fn.rs:270:13 43: red_knot_python_semantic::types::check_types at /Users/dhruv/work/astral/ruff/crates/red_knot_python_semantic/src/types.rs:31:17 2024-09-02 15:15:00.970 [info] 44: ::execute::inner_ at /Users/dhruv/work/astral/ruff/crates/red_knot_workspace/src/workspace.rs:417:23 45: ::execute at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/components/salsa-macro-rules/src/setup_tracked_fn.rs:179:21 46: salsa::function::execute::>::execute::{{closure}} at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/function/execute.rs:52:43 47: as core::ops::function::FnOnce<()>>::call_once at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/core/src/panic/unwind_safe.rs:272:9 48: std::panicking::try::do_call at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panicking.rs:559:40 49: ___rust_try 50: std::panicking::try at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panicking.rs:523:19 51: std::panic::catch_unwind at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panic.rs:149:14 52: salsa::cycle::Cycle::catch at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/cycle.rs:42:15 53: salsa::function::execute::>::execute at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/function/execute.rs:52:27 54: salsa::function::fetch::>::fetch_cold at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/function/fetch.rs:95:14 55: salsa::function::fetch::>::compute_value::{{closure}} at 2024-09-02 15:15:00.970 [info] /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/function/fetch.rs:35:68 56: core::option::Option::or_else at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/core/src/option.rs:1515:21 57: salsa::function::fetch::>::compute_value at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/function/fetch.rs:35:34 58: salsa::function::fetch::>::fetch at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/function/fetch.rs:17:13 59: red_knot_workspace::workspace::check_file::{{closure}} at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/components/salsa-macro-rules/src/setup_tracked_fn.rs:278:25 60: salsa::attach::Attached::attach at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/attach.rs:71:9 61: salsa::attach::attach::{{closure}} at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/attach.rs:91:23 62: std::thread::local::LocalKey::try_with at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/thread/local.rs:283:12 63: std:: 2024-09-02 15:15:00.970 [info] thread::local::LocalKey::with at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/thread/local.rs:260:9 64: salsa::attach::attach at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/attach.rs:91:5 65: red_knot_workspace::workspace::check_file at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/components/salsa-macro-rules/src/setup_tracked_fn.rs:270:13 66: red_knot_workspace::db::RootDatabase::check_file::{{closure}} at /Users/dhruv/work/astral/ruff/crates/red_knot_workspace/src/db.rs:61:27 67: red_knot_workspace::db::RootDatabase::with_db::{{closure}} at /Users/dhruv/work/astral/ruff/crates/red_knot_workspace/src/db.rs:79:29 68: std::panicking::try::do_call at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panicking.rs:559:40 69: ___rust_try 70: std::panicking::try at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panicking.rs:523:19 71: std::panic 2024-09-02 15:15:00.970 [info] ::catch_unwind at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panic.rs:149:14 72: salsa::cancelled::Cancelled::catch at /Users/dhruv/.cargo/git/checkouts/salsa-61760caba2b17ca5/f608ff8/src/cancelled.rs:36:15 73: red_knot_workspace::db::RootDatabase::with_db at /Users/dhruv/work/astral/ruff/crates/red_knot_workspace/src/db.rs:79:9 74: red_knot_workspace::db::RootDatabase::check_file at /Users/dhruv/work/astral/ruff/crates/red_knot_workspace/src/db.rs:61:9 75: red_knot_server::server::api::requests::diagnostic::compute_diagnostics at /Users/dhruv/work/astral/ruff/crates/red_knot_server/src/server/api/requests/diagnostic.rs:56:29 76: ::run_with_snapshot at /Users/dhruv/work/astral/ruff/crates/red_knot_server/src/server/api/requests/diagnostic.rs:33:27 77: red_knot_server::server::api::background_request_task 2024-09-02 15:15:00.970 [info] ::{{closure}}::{{closure}} at /Users/dhruv/work/astral/ruff/crates/red_knot_server/src/server/api.rs:106:26 78: core::ops::function::FnOnce::call_once{{vtable.shim}} at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/core/src/ops/function.rs:250:5 79: as core::ops::function::FnOnce>::call_once at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/alloc/src/boxed.rs:2063:9 80: red_knot_server::server::schedule::Scheduler::dispatch::{{closure}} at /Users/dhruv/work/astral/ruff/crates/red_knot_server/src/server/schedule.rs:97:36 81: red_knot_server::server::schedule::thread::pool::Pool::spawn::{{closure}} at /Users/dhruv/work/astral/ruff/crates/red_knot_server/src/server/schedule/thread/pool.rs:99:13 82: core::ops::function::FnOnce::call_once{{vtable.shim}} at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/core/src/ops/function.rs:250:5 83: as core::ops::function::FnOnce>::call_once at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/alloc/src/boxed.rs:2063:9 84: red_knot_server::server::schedule::thread::pool::Pool::new::{{closure}} at /Users/dhruv/work/astral/ruff/crates/red_knot_server/src/server/schedule/thread/pool.rs:74:29 85: red_knot_server::server::schedule::thread::Builder::spawn::{{closure}} at /Users/dhruv/work/astral/ruff/crates/red_knot_server/src/server/schedule/thread.rs:70:13 86: 2024-09-02 15:15:00.970 [info] std::sys_common::backtrace::__rust_begin_short_backtrace at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/sys_common/backtrace.rs:155:18 87: std::thread::Builder::spawn_unchecked_::{{closure}}::{{closure}} at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/thread/mod.rs:542:17 88: as core::ops::function::FnOnce<()>>::call_once at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/core/src/panic/unwind_safe.rs:272:9 89: std::panicking::try::do_call at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panicking.rs:559:40 90: ___rust_try 91: std::panicking::try at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panicking.rs:523:19 92: std::panic::catch_unwind at 2024-09-02 15:15:00.970 [info] /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/panic.rs:149:14 93: std::thread::Builder::spawn_unchecked_::{{closure}} at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/thread/mod.rs:541:30 94: core::ops::function::FnOnce::call_once{{vtable.shim}} at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/core/src/ops/function.rs:250:5 95: as core::ops::function::FnOnce>::call_once at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/alloc/src/boxed.rs:2063:9 96: as core::ops::function::FnOnce>::call_once at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/alloc/src/boxed.rs:2063:9 97: std::sys::pal::unix::thread::Thread::new::thread_start at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library/std/src/sys/pal/unix/thread.rs:108:17 98: __pthread_joiner_wake ```

MichaReiser commented 2 weeks ago

Thx. Yeah, I think this is a salsa bug. I wasn't sure if it panics inside of apply_changes.

carljm commented 1 week ago

Even if this is a Salsa bug, we should probably prioritize tracking it down soon? Seems like a serious issue.

dhruvmanila commented 3 days ago

We've reproduced this in Salsa at https://github.com/salsa-rs/salsa/pull/573