-
Couldn't load subscription status.
- Fork 1.5k
Closed
Labels
Description
Repo with a minimal reproducible demo: https://github.com/Kinrany/sqlx_transaction_panic
Dropping a transaction causes a panic in a worker thread.
Only happens with a connection pool and the fetch_one method.
Possibly related: #1078
Code
- Uses a MySQL connection pool
- Runs
"SELECT 1"in a transaction - Explicitly drops the transaction, intending to rollback
- Waits two seconds, to make sure there's time for the panic to happen
// main.rs use sqlx::mysql::MySqlPoolOptions; use std::time::Duration; #[tokio::main] async fn main() { let conn = MySqlPoolOptions::new() .connect(&std::env::var("DATABASE_URL").unwrap()) .await .unwrap(); let handle = tokio::spawn(tokio::time::sleep(Duration::from_secs(2))); let mut tx = conn.begin().await.unwrap(); sqlx::query("SELECT 1").fetch_one(&mut tx).await.unwrap(); drop(tx); handle.await.unwrap(); }Output
kinrany:~/projects/sqlx_transaction_panic$ DATABASE_URL="mysql://root:example@localhost/Db" cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.06s Running `target/debug/sqlx_transaction_panic` thread 'tokio-runtime-worker' panicked at 'assertion failed: self.remaining() >= dst.len()', /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/bytes-1.0.1/src/buf/buf_impl.rs:250:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace With backtrace:
kinrany:~/projects/sqlx_transaction_panic$ DATABASE_URL="mysql://root:example@localhost/Db" RUST_BACKTRACE=1 cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.06s Running `target/debug/sqlx_transaction_panic` thread 'tokio-runtime-worker' panicked at 'assertion failed: self.remaining() >= dst.len()', /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/bytes-1.0.1/src/buf/buf_impl.rs:250:9 stack backtrace: 0: rust_begin_unwind at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/panicking.rs:515:5 1: core::panicking::panic_fmt at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/panicking.rs:92:14 2: core::panicking::panic at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/panicking.rs:50:5 3: bytes::buf::buf_impl::Buf::copy_to_slice at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/bytes-1.0.1/src/buf/buf_impl.rs:250:9 4: bytes::buf::buf_impl::Buf::get_u64_le at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/bytes-1.0.1/src/buf/buf_impl.rs:511:9 5: <bytes::bytes::Bytes as sqlx_core::mysql::io::buf::MySqlBufExt>::get_uint_lenenc at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/sqlx-core-0.5.5/src/mysql/io/buf.rs:25:21 6: sqlx_core::mysql::connection::stream::MySqlStream::skip_result_metadata::{{closure}} at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/sqlx-core-0.5.5/src/mysql/connection/stream.rs:185:32 7: <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/future/mod.rs:80:19 8: sqlx_core::mysql::connection::stream::MySqlStream::wait_until_ready::{{closure}} at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/sqlx-core-0.5.5/src/mysql/connection/stream.rs:109:21 9: <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/future/mod.rs:80:19 10: <sqlx_core::mysql::connection::MySqlConnection as sqlx_core::connection::Connection>::ping::{{closure}} at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/sqlx-core-0.5.5/src/mysql/connection/mod.rs:61:13 11: <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/future/mod.rs:80:19 12: <core::pin::Pin<P> as core::future::future::Future>::poll at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/future/future.rs:119:9 13: <sqlx_core::pool::connection::PoolConnection<DB> as core::ops::drop::Drop>::drop::{{closure}} at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/sqlx-core-0.5.5/src/pool/connection.rs:83:33 14: <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/future/mod.rs:80:19 15: tokio::runtime::task::core::CoreStage<T>::poll::{{closure}} at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/core.rs:147:17 16: tokio::loom::std::unsafe_cell::UnsafeCell<T>::with_mut at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/loom/std/unsafe_cell.rs:14:9 17: tokio::runtime::task::core::CoreStage<T>::poll at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/core.rs:137:13 18: tokio::runtime::task::harness::poll_future::{{closure}} at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/harness.rs:437:23 19: <std::panic::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/panic.rs:347:9 20: std::panicking::try::do_call at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/panicking.rs:401:40 21: __rust_try 22: std::panicking::try at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/panicking.rs:365:19 23: std::panic::catch_unwind at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/panic.rs:434:14 24: tokio::runtime::task::harness::poll_future at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/harness.rs:424:19 25: tokio::runtime::task::harness::Harness<T,S>::poll_inner at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/harness.rs:89:9 26: tokio::runtime::task::harness::Harness<T,S>::poll at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/harness.rs:59:15 27: tokio::runtime::task::raw::poll at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/raw.rs:113:5 28: tokio::runtime::task::raw::RawTask::poll at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/raw.rs:70:18 29: tokio::runtime::task::Notified<S>::run at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/mod.rs:166:9 30: tokio::runtime::thread_pool::worker::Context::run_task::{{closure}} at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/thread_pool/worker.rs:396:13 31: tokio::coop::with_budget::{{closure}} at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/coop.rs:106:9 32: std::thread::local::LocalKey<T>::try_with at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/thread/local.rs:400:16 33: std::thread::local::LocalKey<T>::with at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/thread/local.rs:376:9 34: tokio::coop::with_budget at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/coop.rs:99:5 35: tokio::coop::budget at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/coop.rs:76:5 36: tokio::runtime::thread_pool::worker::Context::run_task at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/thread_pool/worker.rs:395:9 37: tokio::runtime::thread_pool::worker::Context::run at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/thread_pool/worker.rs:365:24 38: tokio::runtime::thread_pool::worker::run::{{closure}} at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/thread_pool/worker.rs:350:17 39: tokio::macros::scoped_tls::ScopedKey<T>::set at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/macros/scoped_tls.rs:61:9 40: tokio::runtime::thread_pool::worker::run at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/thread_pool/worker.rs:347:5 41: tokio::runtime::thread_pool::worker::Launch::launch::{{closure}} at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/thread_pool/worker.rs:326:45 42: <tokio::runtime::blocking::task::BlockingTask<T> as core::future::future::Future>::poll at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/blocking/task.rs:42:21 43: tokio::runtime::task::core::CoreStage<T>::poll::{{closure}} at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/core.rs:147:17 44: tokio::loom::std::unsafe_cell::UnsafeCell<T>::with_mut at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/loom/std/unsafe_cell.rs:14:9 45: tokio::runtime::task::core::CoreStage<T>::poll at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/core.rs:137:13 46: tokio::runtime::task::harness::poll_future::{{closure}} at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/harness.rs:437:23 47: <std::panic::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/panic.rs:347:9 48: std::panicking::try::do_call at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/panicking.rs:401:40 49: __rust_try 50: std::panicking::try at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/panicking.rs:365:19 51: std::panic::catch_unwind at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/panic.rs:434:14 52: tokio::runtime::task::harness::poll_future at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/harness.rs:424:19 53: tokio::runtime::task::harness::Harness<T,S>::poll_inner at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/harness.rs:89:9 54: tokio::runtime::task::harness::Harness<T,S>::poll at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/harness.rs:59:15 55: tokio::runtime::task::raw::poll at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/raw.rs:113:5 56: tokio::runtime::task::raw::RawTask::poll at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/raw.rs:70:18 57: tokio::runtime::task::Notified<S>::run at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/task/mod.rs:166:9 58: tokio::runtime::blocking::pool::Inner::run at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/blocking/pool.rs:265:17 59: tokio::runtime::blocking::pool::Spawner::spawn_thread::{{closure}} at /home/kinrany/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.9.0/src/runtime/blocking/pool.rs:245:17 note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.