Skip to content

Logging a struct holding a SpanTrace causes a core dump if using OpenTelemetryLayer #763

Open
@LukeMathWalker

Description

@LukeMathWalker

Bug Report

Version

tracing-min v0.1.0 (/home/luca/Documents/code/tracing-min)
├── tracing v0.1.15
│   ├── tracing-attributes v0.1.8
│   └── tracing-core v0.1.10
├── tracing-error v0.1.2
│   ├── tracing v0.1.15 (*)
│   └── tracing-subscriber v0.2.6
│       ├── tracing-core v0.1.10 (*)
│       ├── tracing-log v0.1.1
│       │   └── tracing-core v0.1.10 (*)
│       └── tracing-serde v0.1.1
│           └── tracing-core v0.1.10 (*)
├── tracing-opentelemetry v0.5.0
│   ├── tracing v0.1.15 (*)
│   ├── tracing-core v0.1.10 (*)
│   ├── tracing-log v0.1.1 (*)
│   └── tracing-subscriber v0.2.6 (*)
└── tracing-subscriber v0.2.6 (*)

Platform

Linux luca 4.15.0-106-generic #107-Ubuntu SMP Thu Jun 4 11:27:52 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

Crates

tracing-opentelemetry / tracing-error

Description

Logging a struct that holds a SpanTrace causes a core dump due to a deadlock on the RwLock held by the Registry:

thread 'main' panicked at 'rwlock read lock would result in deadlock', /home/luca/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/macros.rs:13:23

You can check a minimum example here: https://github.com/LukeMathWalker/tracing-min
RUST_BACKTRACE=1 cargo run should reproduce the issue.

The relevant snippet is here:

#[derive(Debug)]
pub struct Dummy(SpanTrace);

#[tracing::instrument]
pub fn test() {
    let culprit = Dummy(SpanTrace::capture());
    tracing::warn!("It goes boom! - {:?}", culprit);
}

fn main() {
    init_telemetry();
    let tracer = global::tracer("test");
    tracer.in_span("span", move |_cx| {
        let _ = test();
    });
}

Looking at the backtrace

   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/libunwind.rs:86
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at src/libstd/sys_common/backtrace.rs:78
   3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
             at src/libstd/sys_common/backtrace.rs:59
   4: core::fmt::write
             at src/libcore/fmt/mod.rs:1069
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1504
   6: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:62
   7: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:49
   8: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:198
   9: std::panicking::default_hook
             at src/libstd/panicking.rs:218
  10: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:511
  11: std::panicking::begin_panic
             at /home/luca/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/panicking.rs:438
  12: std::sys::unix::rwlock::RWLock::read
             at /home/luca/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/macros.rs:13
  13: std::sys_common::rwlock::RWLock::read
             at /home/luca/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/sys_common/rwlock.rs:26
  14: std::sync::rwlock::RwLock<T>::read
             at /home/luca/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/sync/rwlock.rs:185
  15: <tracing_subscriber::registry::sharded::Data as tracing_subscriber::registry::SpanData>::extensions
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-subscriber-0.2.6/src/registry/sharded.rs:349
  16: tracing_subscriber::registry::SpanRef<R>::extensions
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-subscriber-0.2.6/src/registry/mod.rs:279
  17: tracing_error::layer::ErrorLayer<S,F>::get_context
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-error-0.1.2/src/layer.rs:95
  18: tracing_error::layer::WithContext::with_context
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-error-0.1.2/src/layer.rs:114
  19: tracing_error::backtrace::SpanTrace::with_spans::{{closure}}
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-error-0.1.2/src/backtrace.rs:119
  20: tracing::span::Span::with_subscriber::{{closure}}
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-0.1.15/src/span.rs:883
  21: core::option::Option<T>::map
             at /home/luca/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/option.rs:456
  22: tracing::span::Span::with_subscriber
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-0.1.15/src/span.rs:881
  23: tracing_error::backtrace::SpanTrace::with_spans
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-error-0.1.2/src/backtrace.rs:117
  24: <tracing_error::backtrace::SpanTrace as core::fmt::Debug>::fmt
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-error-0.1.2/src/backtrace.rs:257
  25: <&T as core::fmt::Debug>::fmt
             at /home/luca/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/fmt/mod.rs:1973
  26: core::fmt::builders::DebugTuple::field::{{closure}}
             at src/libcore/fmt/builders.rs:347
  27: core::result::Result<T,E>::and_then
             at src/libcore/result.rs:729
  28: core::fmt::builders::DebugTuple::field
             at src/libcore/fmt/builders.rs:334
  29: <tracing_min::Dummy as core::fmt::Debug>::fmt
             at src/main.rs:42
  30: core::fmt::write
             at src/libcore/fmt/mod.rs:1069
  31: <core::fmt::Arguments as core::fmt::Display>::fmt
             at src/libcore/fmt/mod.rs:422
  32: <core::fmt::Arguments as core::fmt::Debug>::fmt
             at src/libcore/fmt/mod.rs:415
  33: <&T as core::fmt::Debug>::fmt
             at /home/luca/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libcore/fmt/mod.rs:1973
  34: core::fmt::write
             at src/libcore/fmt/mod.rs:1069
  35: core::fmt::Write::write_fmt
             at /rustc/49cae55760da0a43428eba73abcb659bb70cf2e4/src/libcore/fmt/mod.rs:193
  36: alloc::fmt::format
             at src/liballoc/fmt.rs:586
  37: <tracing_opentelemetry::layer::SpanEventVisitor as tracing_core::field::Visit>::record_debug
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-opentelemetry-0.5.0/src/layer.rs:160
  38: <core::fmt::Arguments as tracing_core::field::Value>::record
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-core-0.1.10/src/field.rs:426
  39: <&T as tracing_core::field::Value>::record
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-core-0.1.10/src/field.rs:418
  40: tracing_core::field::ValueSet::record
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-core-0.1.10/src/field.rs:685
  41: tracing_core::event::Event::record
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-core-0.1.10/src/event.rs:89
  42: <tracing_opentelemetry::layer::OpenTelemetryLayer<S,T> as tracing_subscriber::layer::Layer<S>>::on_event
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-opentelemetry-0.5.0/src/layer.rs:521
  43: <tracing_subscriber::layer::Layered<L,S> as tracing_core::subscriber::Subscriber>::event
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-subscriber-0.2.6/src/layer.rs:599
  44: <tracing_subscriber::layer::Layered<L,S> as tracing_core::subscriber::Subscriber>::event
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-subscriber-0.2.6/src/layer.rs:598
  45: tracing_core::dispatcher::Dispatch::event
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-core-0.1.10/src/dispatcher.rs:471
  46: tracing_core::event::Event::dispatch::{{closure}}
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-core-0.1.10/src/event.rs:36
  47: tracing_core::dispatcher::get_default::{{closure}}
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-core-0.1.10/src/dispatcher.rs:330
  48: std::thread::local::LocalKey<T>::try_with
             at /home/luca/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/thread/local.rs:263
  49: tracing_core::dispatcher::get_default
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-core-0.1.10/src/dispatcher.rs:317
  50: tracing_core::event::Event::dispatch
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/tracing-core-0.1.10/src/event.rs:35
  51: tracing_min::test
             at src/main.rs:48
  52: tracing_min::main::{{closure}}
             at src/main.rs:55
  53: opentelemetry::api::trace::tracer::Tracer::in_span
             at /home/luca/.cargo/registry/src/g.yxqyang.asia-1ecc6299db9ec823/opentelemetry-0.6.0/src/api/trace/tracer.rs:330
  54: tracing_min::main
             at src/main.rs:54
  55: std::rt::lang_start::{{closure}}
             at /home/luca/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/rt.rs:67
  56: std::rt::lang_start_internal::{{closure}}
             at src/libstd/rt.rs:52
  57: std::panicking::try::do_call
             at src/libstd/panicking.rs:331
  58: std::panicking::try
             at src/libstd/panicking.rs:274
  59: std::panic::catch_unwind
             at src/libstd/panic.rs:394
  60: std::rt::lang_start_internal
             at src/libstd/rt.rs:51
  61: std::rt::lang_start
             at /home/luca/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/rt.rs:67
  62: main
  63: __libc_start_main
  64: _start

I think the story goes more or less like this:

Metadata

Metadata

Assignees

Labels

crate/opentelemetryRelated to the `tracing-opentelemetry` crate.kind/bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions