rerun icon indicating copy to clipboard operation
rerun copied to clipboard

ComponentBatch::from_arrow_array is not thread safe

Open kobeever opened this issue 1 month ago • 1 comments

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});
            }
        }

kobeever avatar Nov 11 '25 18:11 kobeever

Thanks for filing! Looks like we have too simplistic schema caching there at work

Wumpf avatar Nov 12 '25 08:11 Wumpf