rerun
rerun copied to clipboard
ComponentBatch::from_arrow_array is not thread safe
Describe the bug When logging data from multiple threads, there will be a crash
To Reproduce Simply call the log function with some objects from multiple threads
Expected behavior no crash
Backtrace
********** Crash dump: **********
Build fingerprint: 'Meta/diamond/diamond:14/UKQ1.250303.001/344830000002781:userdebug/test-keys'
Abort message: 'assertion `left != right` failed: Component type with the same descriptor already registered
#00 0x00000000000aa238 /apex/com.android.runtime/lib64/bionic/libc.so (tgkill+8) (BuildId: 250a5ac456b689dd08870d4bd16b1635)
#01 0x00000000054f1fd4 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
folly::symbolizer::(anonymous namespace)::callPreviousSignalHandler(int, siginfo*)
./xplat/folly/debugging/symbolizer/SignalHandler.cpp:213:7
folly::symbolizer::(anonymous namespace)::signalHandler(int, siginfo*, void*)
./xplat/folly/debugging/symbolizer/SignalHandler.cpp:551:3
#02 0x0000000000000860 [vdso]
#03 0x0000000000059aa0 /apex/com.android.runtime/lib64/bionic/libc.so (abort+160) (BuildId: 250a5ac456b689dd08870d4bd16b1635)
#04 0x00000000027a3b6c /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
std::sys::pal::unix::abort_internal
./xplat/rust/toolchain/sysroot/1.90.0/library/std/src/sys/pal/unix/mod.rs:382:14
#05 0x000000000279ace0 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
std::process::abort
./xplat/rust/toolchain/sysroot/1.90.0/library/std/src/process.rs:2499:5
#06 0x00000000027a49c4 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
__rustc::__rust_abort
./xplat/rust/toolchain/sysroot/1.90.0/library/std/src/rt.rs:33:5
#07 0x00000000027aefd8 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
__rustc::__rust_start_panic
./xplat/rust/toolchain/sysroot/1.90.0/library/panic_abort/src/lib.rs:50:5
#08 0x000000000279b824 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
__rustc::rust_panic
./xplat/rust/toolchain/sysroot/1.90.0/library/std/src/panicking.rs:894:25
#09 0x000000000279b7dc /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
std::panicking::rust_panic_with_hook
./xplat/rust/toolchain/sysroot/1.90.0/library/std/src/panicking.rs:858:5
#10 0x000000000279b38c /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
std::panicking::begin_panic_handler::{closure#0}
./xplat/rust/toolchain/sysroot/1.90.0/library/std/src/panicking.rs:706:13
#11 0x000000000279afc8 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
std::sys::backtrace::__rust_end_short_backtrace::<std::panicking::begin_panic_handler::{closure#0}, !>
./xplat/rust/toolchain/sysroot/1.90.0/library/std/src/sys/backtrace.rs:174:18
__rustc::rust_begin_unwind
./xplat/rust/toolchain/sysroot/1.90.0/library/std/src/panicking.rs:697:5
#12 0x00000000027bbc78 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
core::panicking::panic_fmt
./xplat/rust/toolchain/sysroot/1.90.0/library/core/src/panicking.rs:75:14
#13 0x00000000027bbfa4 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
core::panicking::assert_failed_inner
./xplat/rust/toolchain/sysroot/1.90.0/library/core/src/panicking.rs:0:0
#14 0x00000000021a727c /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
core::panicking::assert_failed::<re_types_core::component_descriptor::ComponentDescriptor, re_types_core::component_descriptor::ComponentDescriptor>
./xplat/rust/toolchain/sysroot/1.90.0/library/core/src/panicking.rs:403:5
#15 0x00000000021a842c /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
<rerun_c::component_type_registry::ComponentTypeRegistry>::register
./third-party/rust/vendor/rerun_c-0.22.1/src/component_type_registry.rs:27:17
#16 0x00000000021976a4 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
rerun_c::rr_register_component_type_impl
./third-party/rust/vendor/rerun_c-0.22.1/src/lib.rs:389:10
#17 0x00000000021977a0 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
rr_register_component_type
./third-party/rust/vendor/rerun_c-0.22.1/src/lib.rs:399:11
#18 0x000000000218af24 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
rerun::ComponentType::register_component() const
./third-party/rerun_cpp_sdk/src/rerun/component_type.cpp:17:23
#19 0x000000000218a1e0 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
rerun::ComponentBatch::from_arrow_array(std::__ndk1::shared_ptr<arrow::Array>, rerun::ComponentDescriptor const&)
./third-party/rerun_cpp_sdk/src/rerun/component_batch.cpp:30:27
#20 0x00000000021852f4 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
rerun::Result<rerun::ComponentBatch> rerun::ComponentBatch::from_loggable<rerun::components::PinholeProjection>(rerun::Collection<rerun::components::PinholeProjection> const&, rerun::ComponentDescriptor const&)
./third-party/rerun_cpp_sdk/src/rerun/archetypes/../component_batch.hpp:62:20
#21 0x00000000021860a8 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
rerun::Result<rerun::ComponentBatch> rerun::ComponentBatch::from_loggable<rerun::components::PinholeProjection>(rerun::components::PinholeProjection const&, rerun::ComponentDescriptor const&)
./third-party/rerun_cpp_sdk/src/rerun/archetypes/../component_batch.hpp:75:20
#22 0x0000000002185d40 /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
rerun::archetypes::Pinhole::Pinhole(rerun::components::PinholeProjection)
./third-party/rerun_cpp_sdk/src/rerun/archetypes/pinhole.hpp:217:33
#23 0x0000000002185bbc /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
rerun::archetypes::Pinhole::from_focal_length_and_resolution(rerun::datatypes::Vec2D const&, rerun::datatypes::Vec2D const&)
./third-party/rerun_cpp_sdk/src/rerun/archetypes/pinhole_ext.cpp:70:20
#24 0x0000000002175fcc /data/local/tests/skadi/SkadiApp (BuildId: 1d5e51e8beb15b93edfbdf4be176af855721a973)
void rerun_utils::log<skadi::Frustum>(rerun::RecordingStream const&, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&, skadi::Frustum const&)
./arvr/firmware/ar/projects/skadi/core/rerun/conversions/common/Frustum.cpp:32:9
Desktop (please complete the following information): Linux
Rerun version 0.22
Additional context Adding a mutex will solve the problem
{
-> std::lock_guard<std::mutex> lock(comp_types_mutex);
auto search = comp_types_per_descr.find(descr_hash);
if (search != comp_types_per_descr.end()) {
comp_type_handle = search->second;
} else {
auto comp_type = ComponentType(descriptor, array->type());
const Result<ComponentTypeHandle> comp_type_handle_result =
comp_type.register_component();
RR_RETURN_NOT_OK(comp_type_handle_result.error);
comp_type_handle = comp_type_handle_result.value;
comp_types_per_descr.insert({descr_hash, comp_type_handle});
}
}
Thanks for filing! Looks like we have too simplistic schema caching there at work