aldanor / hdf5-rust

HDF5 for Rust
https://docs.rs/hdf5
Apache License 2.0
310 stars 85 forks source link

Segfault during drop #159

Closed Rikorose closed 3 years ago

Rikorose commented 3 years ago

I got a segfault on program exit when using hdf5 in a multithread (rayon) environment. Coredump:

coredumpctl gdb
           PID: 333137 (python)
           UID: 1000 (hendrik)
           GID: 1000 (hendrik)
        Signal: 11 (SEGV)
     Timestamp: Thu 2021-06-10 15:10:29 CEST (9s ago)
  Command Line: python -c from tests.test_pyclc import *; test_dataloader('~/data/hdf5')
    Executable: /usr/bin/python3.9
 Control Group: /user.slice/user-1000.slice/user@1000.service/app.slice/app-Alacritty.slice/app-Alacritty-307265.scope
          Unit: user@1000.service
     User Unit: app-Alacritty-307265.scope
         Slice: user-1000.slice
     Owner UID: 1000 (hendrik)
       Boot ID: f551cdaff1f44507b231985077fdc4ae
    Machine ID: fef964380b2449f7aa6d9beaddc5719b
      Hostname: T480s
       Storage: /var/lib/systemd/coredump/core.python.1000.f551cdaff1f44507b231985077fdc4ae.333137.1623330629000000.zst (present)
     Disk Size: 288.3M
       Message: Process 333137 (python) of user 1000 dumped core.

                Stack trace of thread 333168:
                #0  0x00007f28c411959d H5SL_release_common (libhdf5.so.103 + 0x20759d)
                #1  0x00007f28c4125ee5 H5SL_free (libhdf5.so.103 + 0x213ee5)
                #2  0x00007f28c3fb8503 H5D__chunk_io_term (libhdf5.so.103 + 0xa6503)
                #3  0x00007f28c3fd9e70 H5D__read (libhdf5.so.103 + 0xc7e70)
                #4  0x00007f28c3fda42a H5Dread (libhdf5.so.103 + 0xc842a)
                #5  0x00007f28c43472c6 n/a (/home/hendrik/.virtualenvs/clcrs/lib/python3.9/site-packages/pyclc.cpython-39-x86_64-linux-gnu.so + 0xb22c6)

Here is the full backtrace:

Click to expand ```bash [I](gdb) bt full #0 0x00007f28c411959d in H5SL_release_common (slist=0x7f2890004000, op=0x7f28c3fb7e90 , op_data=0x0) at ../../src/H5SL.c:889 err_occurred = false node = next_node = ret_value = 0 __func__ = "H5SL_release_common" #1 0x00007f28c4125ee5 in H5SL_free (slist=, op=, op_data=) at ../../src/H5SL.c:2305 No locals. #2 0x00007f28c3fb8503 in H5D__chunk_io_term (fm=0x7f289c0f3d10) at ../../src/H5Dchunk.c:2567 err_occurred = false ret_value = 0 __func__ = "H5D__chunk_io_term" #3 0x00007f28c3fd9e70 in H5D__read (dataset=dataset@entry=0x7f2884003980, mem_type_id=mem_type_id@entry=216172782113788630, mem_space=, file_space=0x7f288c010f40, buf=buf@entry=0x7f288467ec90) at ../../src/H5Dio.c:607 prev_tag = 0 err_occurred = fm = io_info = {dset = 0x7f2884003980, store = 0x7f28fdbeed80, layout_ops = {construct = 0x7f28c3fb7690 , init = 0x7f28c3fb78f0 , is_space_alloc = 0x7f28c3fb3cc0 , is_data_cached = 0x7f28c3fb3d00 , io_init = 0x7f28c3fb85c0 , ser_read = 0x7f28c3fb3d80 , ser_write = 0x7f28c3fb3db0 , readvv = 0x0, writevv = 0x0, flush = 0x7f28c3fba470 , io_term = 0x7f28c3fb84c0 , dest = 0x7f28c3fbb1b0 }, io_ops = {multi_read = 0x7f28c3fb3d80 , multi_write = 0x7f28c3fb3db0 , single_read = 0x7f28c3fdddb0 , single_write = 0x7f28c3fde9d0 }, op_type = H5D_IO_OP_READ, u = {rbuf = 0x7f288467ec90, wbuf = 0x7f288467ec90}} type_info = {mem_type = 0x7f28a4033d60, dset_type = 0x7f28940dc980, tpath = 0x565372ccc530, src_type_id = 216172782113788605, dst_type_id = 216172782113788630, src_type_size = 2, dst_type_size = 4, max_type_size = 4, is_conv_noop = false, is_xform_noop = true, cmpd_subset = 0x0, need_bkg = H5T_BKG_NO, request_nelmts = 262144, tconv_buf = 0x7f289c109868 "\001", tconv_buf_allocated = true, bkg_buf = 0x0, bkg_buf_allocated = false} type_info_init = projected_mem_space = 0x7f288c0058f0 store = {contig = {dset_addr = 139812393745904, dset_size = 139811990022896}, chunk = {scaled = 0x7f289c107df0}, compact = {buf = 0x7f289c107df0, dirty = 0x7f2884002af0}, efl = { heap_addr = 139812393745904, nalloc = 139811990022896, nused = 139812526900320, slot = 0x7f28c40e98e1 }} snelmts = nelmts = io_op_init = fake_char = 0 '\000' ret_value = done = __func__ = "H5D__read" #4 0x00007f28c3fda42a in H5Dread (dset_id=, mem_type_id=216172782113788630, mem_space_id=288230376151714598, file_space_id=288230376151714597, dxpl_id=720575940379280805, buf=0x7f288467ec90) at ../../src/H5Dio.c:198 err_occurred = false dset = 0x7f2884003980 mem_space = 0x7f288c010da0 file_space = 0x7f288c010f40 ret_value = 0 done = __func__ = "H5Dread" #5 0x00007f28c43472c6 in hdf5::hl::container::{{impl}}::read_into_buf::{{closure}} () at /home/hendrik/.cargo/git/checkouts/hdf5-rust-c1072d7a2617f7d8/40654f1/src/hl/container.rs:57 obj_id = tp_id = mspace_id = fspace_id = xfer = hdf5::hl::plist::PropertyList (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) buf = #6 hdf5::sync::sync,closure-4> (func=...) at /home/hendrik/.cargo/git/checkouts/hdf5-rust-c1072d7a2617f7d8/40654f1/src/sync.rs:13 _guard = lock_api::remutex::ReentrantMutexGuard {remutex: 0x7f28c4458340 <_ZN66_$LT$hdf5..sync..sync..LOCK$u20$as$u20$core..ops..deref..Deref$GT$5deref11__stability4LAZY17hc2e98dfd6bac5854E.llvm.6461231552521875176+8>, marker: core::marker::PhantomData<(&(), lock_api::GuardNoSend)>} #7 0x00007f28c42fcc4b in hdf5::hl::container::Reader::read_into_buf (self=, buf=, fspace=..., mspace=...) at /home/hendrik/.cargo/git/checkouts/hdf5-rust-c1072d7a2617f7d8/40654f1/src/hl/container.rs:57 xfer = hdf5::hl::plist::PropertyList (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) mspace_id = fspace_id = obj_id = tp_id = mem_dtype = hdf5::hl::datatype::Datatype (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) file_dtype = hdf5::hl::datatype::Datatype (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) #8 0x00007f28c42fdb2f in hdf5::hl::container::Reader::read_slice, ndarray::dimension::dim::Dim<[usize; 1]>>,ndarray::dimension::dim::Dim> (self=0x7f28fdbef230, selection=) at /home/hendrik/.cargo/git/checkouts/hdf5-rust-c1072d7a2617f7d8/40654f1/src/hl/container.rs:102 buf = alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: 0x7f288467ec90, _marker: core::marker::PhantomData}, cap: 480000, alloc: alloc::alloc::Global}, len: 0} mspace = hdf5::hl::dataspace::Dataspace (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) fspace = hdf5::hl::dataspace::Dataspace (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) out_size = [I]--Type for more, q to quit, c to continue without paging-- out_shape = alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: 0x7f2884037580, _marker: core::marker::PhantomData}, cap: 1, alloc: alloc::alloc::Global}, len: 1} obj_space = hdf5::hl::dataspace::Dataspace (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) selection = hdf5::hl::selection::Selection::Hyperslab(hdf5::hl::selection::Hyperslab {dims: alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: 0x7f28840f5580, _marker: core::marker::PhantomData}, cap: 2, alloc: alloc::alloc::Global}, len: 2}}) selection = residual = val = hdf5::hl::dataspace::Dataspace (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) obj_space = hdf5::hl::dataspace::Dataspace (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) residual = out_shape = alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: 0x0, _marker: core::marker::PhantomData}, cap: , alloc: alloc::alloc::Global}, len: } out_size = residual = val = hdf5::hl::dataspace::Dataspace (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) fspace = hdf5::hl::dataspace::Dataspace (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) fsize = arg0 = arg1 = res = alloc::string::String {vec: alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: 0x0, _marker: core::marker::PhantomData}, cap: , alloc: alloc::alloc::Global}, len: }} residual = val = hdf5::hl::dataspace::Dataspace (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) mspace = hdf5::hl::dataspace::Dataspace (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) buf = alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: 0x0, _marker: core::marker::PhantomData}, cap: , alloc: alloc::alloc::Global}, len: } residual = core::result::Result::Err(ndarray::error::ShapeError {repr: 0}) residual = arr = residual = core::result::Result::Err(ndarray::error::ShapeError {repr: 0}) val = val = () val = ndim = out_ndim = res = alloc::string::String {vec: alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: 0x0, _marker: core::marker::PhantomData}, cap: , alloc: alloc::alloc::Global}, len: }} arg0 = arg1 = residual = core::result::Result::Err(ndarray::error::ShapeError {repr: 0}) val = val = alloc::vec::Vec {buf: alloc::raw_vec::RawVec {ptr: core::ptr::unique::Unique {pointer: 0x0, _marker: core::marker::PhantomData}, cap: , alloc: alloc::alloc::Global}, len: } #9 hdf5::hl::container::Container::read_slice, ndarray::dimension::dim::Dim<[usize; 1]>>,ndarray::dimension::dim::Dim> (self=, selection=...) at /home/hendrik/.cargo/git/checkouts/hdf5-rust-c1072d7a2617f7d8/40654f1/src/hl/container.rs:506 No locals. #10 0x00007f28c42dbc3c in clc::dataset::Hdf5Dataset::read_pcm (self=0x565372d65040, key=..., r=...) at clc/src/dataset.rs:547 r = core::ops::range::Range {start: 10832609, end: 11312609} ds = hdf5::hl::dataset::Dataset (hdf5::handle::Handle {id: alloc::sync::Arc> {ptr: core::ptr::non_null::NonNull>> {pointer: 0x0}, phantom: core::marker::PhantomData>>}}) #11 0x00007f28c42dc9cc in clc::dataset::Hdf5Dataset::read_slc (self=0x565372d65040, key=..., r=...) at clc/src/dataset.rs:582 No locals. #12 0x00007f28c42d9a40 in clc::dataset::RsDataset::read_max_len (self=, idx=, key=...) at clc/src/dataset.rs:345 s = s = 13920192 max_len = sample_len = sr = ds = 0x565372d65040 #13 0x00007f28c42da032 in clc::dataset::{{impl}}::get_data (self=0x565372df6ff0, idx=) at clc/src/dataset.rs:370 ns_idx = 0x7f28c4293e28 ns_key = 0x7f28c4293e30 __next = 0x7f28c4293e28 iter = alloc::vec::into_iter::IntoIter<&(usize, alloc::string::String), alloc::alloc::Global> {buf: core::ptr::non_null::NonNull<&(usize, alloc::string::String)> {pointer: 0x7f28840f5270}, phantom: core::marker::PhantomData<&(usize, alloc::string::String)>, cap: 4, alloc: alloc::alloc::Global, ptr: 0x7f28840f5290, end: 0x7f28840f5290} noise_gains = alloc::vec::Vec<&i8, alloc::alloc::Global> {buf: alloc::raw_vec::RawVec<&i8, alloc::alloc::Global> {ptr: core::ptr::unique::Unique<&i8> {pointer: 0x7f28840452b0, _marker: core::marker::PhantomData<&i8>}, cap: 4, alloc: alloc::alloc::Global}, len: 3} noises = alloc::vec::Vec, ndarray::dimension::dim::Dim<[usize; 2]>>, alloc::alloc::Global> {buf: alloc::raw_vec::RawVec, ndarray::dimension::dim::Dim<[usize; 2]>>, alloc::alloc::Global> {ptr: core::ptr::unique::Unique, ndarray::dimension::dim::Dim<[usize; 2]>>> {pointer: 0x7f28840fa6c0, _marker: core::marker::PhantomData, ndarray::dimension::dim::Dim<[usize; 2]>>>}, cap: 4, alloc: alloc::alloc::Global}, len: 3} [I]--Type for more, q to quit, c to continue without paging-- ns_ids = alloc::vec::Vec<&(usize, alloc::string::String), alloc::alloc::Global> {buf: alloc::raw_vec::RawVec<&(usize, alloc::string::String), alloc::alloc::Global> {ptr: core::ptr::unique::Unique<&(usize, alloc::string::String)> {pointer: 0x7f28840f5270, _marker: core::marker::PhantomData<&(usize, alloc::string::String)>}, cap: 4, alloc: alloc::alloc::Global}, len: 4} n_noises = speech = ndarray::ArrayBase, ndarray::dimension::dim::Dim<[usize; 2]>> {data: ndarray::data_repr::OwnedRepr {ptr: core::ptr::non_null::NonNull {pointer: 0x7f2884ce7ad0}, len: 630784, capacity: 630784}, ptr: core::ptr::non_null::NonNull {pointer: 0x7f2884ce7ad0}, dim: ndarray::dimension::dim::Dim<[usize; 2]> {index: [1, 480000]}, strides: ndarray::dimension::dim::Dim<[usize; 2]> {index: [630784, 1]}} sp_key = sp_idx = #14 0x00007f28c43201ca in clc::dataset::{{impl}}::start_idx_worker::{{closure}}::{{closure}} (idx=0) at clc/src/dataset.rs:127 ds = alloc::sync::Arc {ptr: core::ptr::non_null::NonNull> {pointer: 0x0}, phantom: core::marker::PhantomData>} out_sender = sample = clc::dataset::DsSample {speech: ndarray::ArrayBase, ndarray::dimension::dim::Dim<[usize; 2]>> {data: ndarray::data_repr::OwnedRepr {ptr: core::ptr::non_null::NonNull {pointer: 0x0}, len: , capacity: }, ptr: core::ptr::non_null::NonNull {pointer: 0x0}, dim: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}, strides: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}}, noise: ndarray::ArrayBase, ndarray::dimension::dim::Dim<[usize; 2]>> {data: ndarray::data_repr::OwnedRepr {ptr: core::ptr::non_null::NonNull {pointer: 0x0}, len: , capacity: }, ptr: core::ptr::non_null::NonNull {pointer: 0x0}, dim: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}, strides: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}}, noisy: ndarray::ArrayBase, ndarray::dimension::dim::Dim<[usize; 2]>> {data: ndarray::data_repr::OwnedRepr {ptr: core::ptr::non_null::NonNull {pointer: 0x0}, len: , capacity: }, ptr: core::ptr::non_null::NonNull {pointer: 0x0}, dim: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}, strides: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}}, snr: , gain: } residual = core::result::Result>::Err(crossbeam_channel::err::SendError (clc::dataset::DsSample {speech: ndarray::ArrayBase, ndarray::dimension::dim::Dim<[usize; 2]>> {data: ndarray::data_repr::OwnedRepr {ptr: core::ptr::non_null::NonNull {pointer: 0x0}, len: , capacity: }, ptr: core::ptr::non_null::NonNull {pointer: 0x0}, dim: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}, strides: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}}, noise: ndarray::ArrayBase, ndarray::dimension::dim::Dim<[usize; 2]>> {data: ndarray::data_repr::OwnedRepr {ptr: core::ptr::non_null::NonNull {pointer: 0x0}, len: , capacity: }, ptr: core::ptr::non_null::NonNull {pointer: 0x0}, dim: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}, strides: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}}, noisy: ndarray::ArrayBase, ndarray::dimension::dim::Dim<[usize; 2]>> {data: ndarray::data_repr::OwnedRepr {ptr: core::ptr::non_null::NonNull {pointer: 0x0}, len: , capacity: }, ptr: core::ptr::non_null::NonNull {pointer: 0x0}, dim: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}, strides: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}}, snr: , gain: })) val = () residual = core::result::Result::Err(anyhow::Error {inner: anyhow::ptr::Own> {ptr: core::ptr::non_null::NonNull> {pointer: 0x0}}}) val = clc::dataset::DsSample {speech: ndarray::ArrayBase, ndarray::dimension::dim::Dim<[usize; 2]>> {data: ndarray::data_repr::OwnedRepr {ptr: core::ptr::non_null::NonNull {pointer: 0x0}, len: , capacity: }, ptr: core::ptr::non_null::NonNull {pointer: 0x0}, dim: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}, strides: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}}, noise: ndarray::ArrayBase, ndarray::dimension::dim::Dim<[usize; 2]>> {data: ndarray::data_repr::OwnedRepr {ptr: core::ptr::non_null::NonNull {pointer: 0x0}, len: , capacity: }, ptr: core::ptr::non_null::NonNull {pointer: 0x0}, dim: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}, strides: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}}, noisy: ndarray::ArrayBase, ndarray::dimension::dim::Dim<[usize; 2]>> {data: ndarray::data_repr::OwnedRepr {ptr: core::ptr::non_null::NonNull {pointer: 0x0}, len: , capacity: }, ptr: core::ptr::non_null::NonNull {pointer: 0x0}, dim: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}, strides: ndarray::dimension::dim::Dim<[usize; 2]> {index: [, ]}}, snr: , gain: } #15 rayon::iter::map_with::{{impl}}::consume,rayon::iter::try_reduce::TryReduceFolder core::result::Result<(), anyhow::Error>, core::result::Result<(), anyhow::Error>>,closure-1> (self=..., item=0) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.1/src/iter/map_with.rs:304 No locals. #16 0x00007f28c4343976 in rayon::iter::par_bridge::{{impl}}::fold_with,rayon::iter::map_with::MapWithFolder core::result::Result<(), anyhow::Error>, core::result::Result<(), anyhow::Error>>, (), closure-1>> (self=..., folder=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.1/src/iter/par_bridge.rs:157 it = 0 #17 0x00007f28c4375c1f in rayon::iter::plumbing::bridge_unindexed_producer_consumer>,rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1>> (migrated=, splitter=..., producer=..., consumer=...) at clc/src/transforms.rs:17 No locals. #18 0x00007f28c4343594 in rayon::iter::plumbing::bridge_unindexed_producer_consumer::{{closure}}>,rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1>> (context=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.1/src/iter/plumbing/mod.rs:474 bridge = splitter = rayon::iter::plumbing::Splitter {splits: } left_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}} left_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} #19 rayon_core::join::join_context::call_a::{{closure}},closure-0> () at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:124 f = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}) injected = #20 std::panic::{{impl}}::call_once,closure-0> (self=..., _args=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:347 No locals. #21 std::panicking::try::do_call,core::result::Result<(), anyhow::Error>> (data=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:401 f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitCons[I]--Type for more, q to quit, c to continue without paging-- umer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) data = data = data = data = f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) #22 std::panicking::try,std::panic::AssertUnwindSafe> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:365 data_ptr = data = std::panicking::try::Data, core::result::Result<(), anyhow::Error>> {f: core::mem::manually_drop::ManuallyDrop> {value: std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false))}, r: core::mem::manually_drop::ManuallyDrop> {value: core::result::Result<(), anyhow::Error>::Ok(())}, p: core::mem::manually_drop::ManuallyDrop> {value: core::any::Box {pointer: 0x0, vtable: 0x0}}} data = data_ptr = #23 std::panic::catch_unwind,core::result::Result<(), anyhow::Error>> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:434 No locals. #24 rayon_core::unwind::halt_unwinding> (func=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/unwind.rs:17 No locals. #25 rayon_core::join::join_context::{{closure}},core::result::Result<(), anyhow::Error>> (worker_thread=0x7f28fdbf1980, injected=false) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:141 job_b_ref = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} job_b = rayon_core::job::StackJob> {latch: rayon_core::latch::SpinLatch {core_latch: rayon_core::latch::CoreLatch {state: core::sync::atomic::AtomicUsize {v: core::cell::UnsafeCell {value: 0}}}, registry: 0x7f28fdbf1ab0, target_worker_index: 6, cross: false}, func: core::cell::UnsafeCell> {value: core::option::Option::Some(rayon_core::join::join_context::call_b::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-1 (0x7f28fdbf02a8, 0x7f28fdbf0308, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8})))}, result: core::cell::UnsafeCell>> {value: rayon_core::job::JobResult>::None}} oper_b = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-1 (0x7f28fdbf02a8, 0x7f28fdbf0308, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8}) oper_a = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x7f28fdbf02a8, 0x7f28fdbf0308, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8}) job_b = job_b_ref = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} status_a = v = result_a = job = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} result_b = err = core::any::Box {pointer: 0x0, vtable: 0x0} #26 rayon_core::registry::in_worker, core::result::Result<(), anyhow::Error>)> (op=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/registry.rs:875 owner_thread = 0x7f28fdbf1980 #27 0x00007f28c4375ac8 in rayon_core::join::join_context,core::result::Result<(), anyhow::Error>> (oper_a=..., oper_b=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:132 No locals. #28 rayon::iter::plumbing::bridge_unindexed_producer_consumer>,rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1>> (migrated=, splitter=..., producer=..., consumer=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.1/src/iter/plumbing/mod.rs:473 bridge = 0x0 left_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} reducer = rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0} right_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} left_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x0, iter: 0x7f28c41dd764, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: (crossbeam_deque::deque::Flavor::Lifo | unknown: 0x60)}} right_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x0, iter: 0x7f28c41dd764, items: crossbeam_deque::dequ[I]--Type for more, q to quit, c to continue without paging-- e::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: (crossbeam_deque::deque::Flavor::Lifo | unknown: 0x60)}} #29 0x00007f28c4343594 in rayon::iter::plumbing::bridge_unindexed_producer_consumer::{{closure}}>,rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1>> (context=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.1/src/iter/plumbing/mod.rs:474 bridge = splitter = rayon::iter::plumbing::Splitter {splits: } left_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}} left_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} #30 rayon_core::join::join_context::call_a::{{closure}},closure-0> () at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:124 f = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}) injected = #31 std::panic::{{impl}}::call_once,closure-0> (self=..., _args=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:347 No locals. #32 std::panicking::try::do_call,core::result::Result<(), anyhow::Error>> (data=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:401 f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) data = data = data = data = f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) #33 std::panicking::try,std::panic::AssertUnwindSafe> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:365 data_ptr = data = std::panicking::try::Data, core::result::Result<(), anyhow::Error>> {f: core::mem::manually_drop::ManuallyDrop> {value: std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false))}, r: core::mem::manually_drop::ManuallyDrop> {value: core::result::Result<(), anyhow::Error>::Ok(())}, p: core::mem::manually_drop::ManuallyDrop> {value: core::any::Box {pointer: 0x0, vtable: 0x0}}} data = data_ptr = #34 std::panic::catch_unwind,core::result::Result<(), anyhow::Error>> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:434 No locals. #35 rayon_core::unwind::halt_unwinding> (func=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/unwind.rs:17 No locals. #36 rayon_core::join::join_context::{{closure}},core::result::Result<(), anyhow::Error>> (worker_thread=0x7f28fdbf1980, injected=false) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:141 job_b_ref = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} job_b = rayon_core::job::StackJob> {latch: rayon_core::latch::SpinLatch {core_latch: rayon_core::latch::CoreLatch {state: core::sync::atomic::AtomicUsize {v: core::cell::UnsafeCell {value: 0}}}, registry: 0x7f28fdbf1ab0, target_worker_index: 6, cross: false}, func: core::cell::UnsafeCell> {value: core::option::Option::None}, result: core::cell::UnsafeCell>> {value: rayon_core::job::JobResult>::None}} oper_b = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-1 (0x7f28fdbf0698, 0x7f28fdbf06f8, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8}) oper_a = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x7f28fdbf0698, 0x7f28fdbf06f8, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8}) job_b = job_b_ref = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} status_a = [I]--Type for more, q to quit, c to continue without paging-- v = result_a = job = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} result_b = err = core::any::Box {pointer: 0x0, vtable: 0x0} #37 rayon_core::registry::in_worker, core::result::Result<(), anyhow::Error>)> (op=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/registry.rs:875 owner_thread = 0x7f28fdbf1980 #38 0x00007f28c4375ac8 in rayon_core::join::join_context,core::result::Result<(), anyhow::Error>> (oper_a=..., oper_b=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:132 No locals. #39 rayon::iter::plumbing::bridge_unindexed_producer_consumer>,rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1>> (migrated=, splitter=..., producer=..., consumer=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.1/src/iter/plumbing/mod.rs:473 bridge = 0x0 left_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} reducer = rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0} right_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} left_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x0, iter: 0x7f28c41dd764, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: (crossbeam_deque::deque::Flavor::Lifo | unknown: 0x60)}} right_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x0, iter: 0x7f28c41dd764, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: (crossbeam_deque::deque::Flavor::Lifo | unknown: 0x60)}} #40 0x00007f28c4343594 in rayon::iter::plumbing::bridge_unindexed_producer_consumer::{{closure}}>,rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1>> (context=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.1/src/iter/plumbing/mod.rs:474 bridge = splitter = rayon::iter::plumbing::Splitter {splits: } left_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}} left_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} #41 rayon_core::join::join_context::call_a::{{closure}},closure-0> () at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:124 f = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}) injected = #42 std::panic::{{impl}}::call_once,closure-0> (self=..., _args=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:347 No locals. #43 std::panicking::try::do_call,core::result::Result<(), anyhow::Error>> (data=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:401 f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) data = data = data = data = f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) #44 std::panicking::try,std::panic::AssertUnwindSafe> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:365 data_ptr = data = std::panicking::try::Data, core::result::Result<(), anyhow::Error>> {f: core::mem::manually_drop::ManuallyDrop> {value: std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false))}, r: core::mem::manually_drop::ManuallyDrop> {value: core::result::Result<(), anyhow::Error>::Ok(())}, p: core::mem::manually_drop::ManuallyDrop> {value: core::any::Box {pointer: 0x0, vtable: 0x0}}} data = data_ptr = #45 std::panic::catch_unwind,core::result::Result<(), anyhow::Error>> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:434 [I]--Type for more, q to quit, c to continue without paging-- No locals. #46 rayon_core::unwind::halt_unwinding> (func=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/unwind.rs:17 No locals. #47 rayon_core::join::join_context::{{closure}},core::result::Result<(), anyhow::Error>> (worker_thread=0x7f28fdbf1980, injected=false) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:141 job_b_ref = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} job_b = rayon_core::job::StackJob> {latch: rayon_core::latch::SpinLatch {core_latch: rayon_core::latch::CoreLatch {state: core::sync::atomic::AtomicUsize {v: core::cell::UnsafeCell {value: 0}}}, registry: 0x7f28fdbf1ab0, target_worker_index: 6, cross: false}, func: core::cell::UnsafeCell> {value: core::option::Option::None}, result: core::cell::UnsafeCell>> {value: rayon_core::job::JobResult>::None}} oper_b = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-1 (0x7f28fdbf0a88, 0x7f28fdbf0ae8, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8}) oper_a = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x7f28fdbf0a88, 0x7f28fdbf0ae8, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8}) job_b = job_b_ref = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} status_a = v = result_a = job = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} result_b = err = core::any::Box {pointer: 0x0, vtable: 0x0} #48 rayon_core::registry::in_worker, core::result::Result<(), anyhow::Error>)> (op=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/registry.rs:875 owner_thread = 0x7f28fdbf1980 #49 0x00007f28c4375ac8 in rayon_core::join::join_context,core::result::Result<(), anyhow::Error>> (oper_a=..., oper_b=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:132 No locals. #50 rayon::iter::plumbing::bridge_unindexed_producer_consumer>,rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1>> (migrated=, splitter=..., producer=..., consumer=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.1/src/iter/plumbing/mod.rs:473 bridge = 0x0 left_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} reducer = rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0} right_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} left_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x0, iter: 0x7f28c41dd764, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: (crossbeam_deque::deque::Flavor::Lifo | unknown: 0x60)}} right_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x0, iter: 0x7f28c41dd764, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: (crossbeam_deque::deque::Flavor::Lifo | unknown: 0x60)}} #51 0x00007f28c4343594 in rayon::iter::plumbing::bridge_unindexed_producer_consumer::{{closure}}>,rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1>> (context=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.1/src/iter/plumbing/mod.rs:474 bridge = splitter = rayon::iter::plumbing::Splitter {splits: } left_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}} left_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} #52 rayon_core::join::join_context::call_a::{{closure}},closure-0> () at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:124 f = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}) injected = #53 std::panic::{{impl}}::call_once,closure-0> (self=..., _args=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:347 No locals. #54 std::panicking::try::do_call,core::result::Result<(), anyhow::Error>> (data=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:401 f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitCons[I]--Type for more, q to quit, c to continue without paging-- umer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) data = data = data = data = f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) #55 std::panicking::try,std::panic::AssertUnwindSafe> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:365 data_ptr = data = std::panicking::try::Data, core::result::Result<(), anyhow::Error>> {f: core::mem::manually_drop::ManuallyDrop> {value: std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false))}, r: core::mem::manually_drop::ManuallyDrop> {value: core::result::Result<(), anyhow::Error>::Ok(())}, p: core::mem::manually_drop::ManuallyDrop> {value: core::any::Box {pointer: 0x0, vtable: 0x0}}} data = data_ptr = #56 std::panic::catch_unwind,core::result::Result<(), anyhow::Error>> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:434 No locals. #57 rayon_core::unwind::halt_unwinding> (func=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/unwind.rs:17 No locals. #58 rayon_core::join::join_context::{{closure}},core::result::Result<(), anyhow::Error>> (worker_thread=0x7f28fdbf1980, injected=false) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:141 job_b_ref = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} job_b = rayon_core::job::StackJob> {latch: rayon_core::latch::SpinLatch {core_latch: rayon_core::latch::CoreLatch {state: core::sync::atomic::AtomicUsize {v: core::cell::UnsafeCell {value: 0}}}, registry: 0x7f28fdbf1ab0, target_worker_index: 6, cross: false}, func: core::cell::UnsafeCell> {value: core::option::Option::None}, result: core::cell::UnsafeCell>> {value: rayon_core::job::JobResult>::None}} oper_b = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-1 (0x7f28fdbf0e78, 0x7f28fdbf0ed8, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8}) oper_a = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x7f28fdbf0e78, 0x7f28fdbf0ed8, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8}) job_b = job_b_ref = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} status_a = v = result_a = job = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} result_b = err = core::any::Box {pointer: 0x0, vtable: 0x0} #59 rayon_core::registry::in_worker, core::result::Result<(), anyhow::Error>)> (op=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/registry.rs:875 owner_thread = 0x7f28fdbf1980 #60 0x00007f28c4375ac8 in rayon_core::join::join_context,core::result::Result<(), anyhow::Error>> (oper_a=..., oper_b=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:132 No locals. #61 rayon::iter::plumbing::bridge_unindexed_producer_consumer>,rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1>> (migrated=, splitter=..., producer=..., consumer=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.1/src/iter/plumbing/mod.rs:473 bridge = 0x7f2912b9919e <_int_malloc+3374> left_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} reducer = rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0} right_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} left_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x0, iter: 0x7f28c41dd764, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: (crossbeam_deque::deque::Flavor::Lifo | unknown: 0x60)}} right_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x0, iter: 0x7f28c41dd764, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: (crossbeam_deque::deque::Flavor::Lifo | unknown: 0x60)}} #62 0x00007f28c4343594 in rayon::iter::plumbing::bridge_unindexed_producer_consumer::{{closure}}>,rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1>> (context=...) [I]--Type for more, q to quit, c to continue without paging-- at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.1/src/iter/plumbing/mod.rs:474 bridge = splitter = rayon::iter::plumbing::Splitter {splits: } left_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}} left_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} #63 rayon_core::join::join_context::call_a::{{closure}},closure-0> () at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:124 f = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}) injected = #64 std::panic::{{impl}}::call_once,closure-0> (self=..., _args=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:347 No locals. #65 std::panicking::try::do_call,core::result::Result<(), anyhow::Error>> (data=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:401 f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) data = data = data = data = f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) #66 std::panicking::try,std::panic::AssertUnwindSafe> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:365 data_ptr = data = std::panicking::try::Data, core::result::Result<(), anyhow::Error>> {f: core::mem::manually_drop::ManuallyDrop> {value: std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false))}, r: core::mem::manually_drop::ManuallyDrop> {value: core::result::Result<(), anyhow::Error>::Ok(())}, p: core::mem::manually_drop::ManuallyDrop> {value: core::any::Box {pointer: 0x0, vtable: 0x0}}} data = data_ptr = #67 std::panic::catch_unwind,core::result::Result<(), anyhow::Error>> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:434 No locals. #68 rayon_core::unwind::halt_unwinding> (func=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/unwind.rs:17 No locals. #69 rayon_core::join::join_context::{{closure}},core::result::Result<(), anyhow::Error>> (worker_thread=0x7f28fdbf1980, injected=false) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:141 job_b_ref = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} job_b = rayon_core::job::StackJob> {latch: rayon_core::latch::SpinLatch {core_latch: rayon_core::latch::CoreLatch {state: core::sync::atomic::AtomicUsize {v: core::cell::UnsafeCell {value: 0}}}, registry: 0x7f28fdbf1ab0, target_worker_index: 6, cross: false}, func: core::cell::UnsafeCell> {value: core::option::Option::None}, result: core::cell::UnsafeCell>> {value: rayon_core::job::JobResult>::None}} oper_b = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-1 (0x7f28fdbf1268, 0x7f28fdbf12c8, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8}) oper_a = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x7f28fdbf1268, 0x7f28fdbf12c8, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8}) job_b = job_b_ref = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} status_a = v = result_a = job = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} result_b = err = core::any::Box {pointer: 0x0, vtable: 0x0} [I]--Type for more, q to quit, c to continue without paging--c #70 rayon_core::registry::in_worker, core::result::Result<(), anyhow::Error>)> (op=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/registry.rs:875 owner_thread = 0x7f28fdbf1980 #71 0x00007f28c4375ac8 in rayon_core::join::join_context,core::result::Result<(), anyhow::Error>> (oper_a=..., oper_b=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:132 No locals. #72 rayon::iter::plumbing::bridge_unindexed_producer_consumer>,rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1>> (migrated=, splitter=..., producer=..., consumer=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.1/src/iter/plumbing/mod.rs:473 bridge = 0x0 left_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} reducer = rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0} right_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} left_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x0, iter: 0x7f28c41dd764, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: (crossbeam_deque::deque::Flavor::Lifo | unknown: 0x60)}} right_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x0, iter: 0x7f28c41dd764, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: (crossbeam_deque::deque::Flavor::Lifo | unknown: 0x60)}} #73 0x00007f28c431fe03 in rayon::iter::plumbing::bridge_unindexed_producer_consumer::{{closure}}>,rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1>> (context=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-1.5.1/src/iter/plumbing/mod.rs:474 bridge = splitter = rayon::iter::plumbing::Splitter {splits: } left_producer = rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}} left_consumer = rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0} #74 rayon_core::join::join_context::call_a::{{closure}},closure-0> () at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:124 f = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}) injected = #75 std::panic::{{impl}}::call_once,closure-0> (self=..., _args=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:347 No locals. #76 std::panicking::try::do_call,core::result::Result<(), anyhow::Error>> (data=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:401 f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) data = data = data = data = f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) #77 std::panicking::try,std::panic::AssertUnwindSafe> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:365 data_ptr = data = std::panicking::try::Data, core::result::Result<(), anyhow::Error>> {f: core::mem::manually_drop::ManuallyDrop> {value: std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false))}, r: core::mem::manually_drop::ManuallyDrop> {value: core::result::Result<(), anyhow::Error>::Ok(())}, p: core::mem::manually_drop::ManuallyDrop> {value: core::any::Box {pointer: 0x0, vtable: 0x0}}} data = data_ptr = #78 std::panic::catch_unwind,core::result::Result<(), anyhow::Error>> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:434 No locals. #79 rayon_core::unwind::halt_unwinding> (func=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/unwind.rs:17 No locals. #80 rayon_core::join::join_context::{{closure}},core::result::Result<(), anyhow::Error>> (worker_thread=0x7f28fdbf1980, injected=true) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/join/mod.rs:141 job_b_ref = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} job_b = rayon_core::job::StackJob> {latch: rayon_core::latch::SpinLatch {core_latch: rayon_core::latch::CoreLatch {state: core::sync::atomic::AtomicUsize {v: core::cell::UnsafeCell {value: 0}}}, registry: 0x7f28fdbf1ab0, target_worker_index: 6, cross: false}, func: core::cell::UnsafeCell> {value: core::option::Option::None}, result: core::cell::UnsafeCell>> {value: rayon_core::job::JobResult>::None}} oper_b = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-1 (0x7f28ade01998, 0x7f28ade019f8, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8}) oper_a = rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x7f28ade01998, 0x7f28ade019f8, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8}) job_b = job_b_ref = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} status_a = v = result_a = job = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} result_b = err = core::any::Box {pointer: 0x0, vtable: 0x0} #81 rayon_core::registry::{{impl}}::in_worker_cold::{{closure}}::{{closure}}, core::result::Result<(), anyhow::Error>)> (injected=true) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/registry.rs:465 worker_thread = 0x7f28fdbf1980 op = rayon_core::join::join_context::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-1 (0x7f28ade01998, 0x7f28ade019f8, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8}), rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x7f28ade01998, 0x7f28ade019f8, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x7f28ade01b00, done: 0x7f28ade01ae8, iter: 0x7f28ade01be0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0007480}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x7f28ade01c68, reduce_op: 0x7f28ade01c68, full: 0x7f28ade01c60}, init: 0x7f28ade01ce0, map_op: 0x7f28ade01ce8})) worker_thread = #82 rayon_core::job::{{impl}}::execute::call::{{closure}}<(core::result::Result<(), anyhow::Error>, core::result::Result<(), anyhow::Error>),closure-0> () at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/job.rs:113 func = rayon_core::registry::{{impl}}::in_worker_cold::{{closure}}::closure-0 (rayon_core::join::join_context::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-1 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}))) #83 std::panic::{{impl}}::call_once<(core::result::Result<(), anyhow::Error>, core::result::Result<(), anyhow::Error>),closure-0> (self=..., _args=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:347 No locals. #84 0x00007f28c431f5af in std::panicking::try::do_call,(core::result::Result<(), anyhow::Error>, core::result::Result<(), anyhow::Error>)> (data=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:401 f = std::panic::AssertUnwindSafe (rayon_core::job::{{impl}}::execute::call::closure-0 (rayon_core::registry::{{impl}}::in_worker_cold::{{closure}}::closure-0 (rayon_core::join::join_context::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-1 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}))))) data = data = data = data = f = std::panic::AssertUnwindSafe (rayon_core::job::{{impl}}::execute::call::closure-0 (rayon_core::registry::{{impl}}::in_worker_cold::{{closure}}::closure-0 (rayon_core::join::join_context::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-1 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}))))) #85 std::panicking::try<(core::result::Result<(), anyhow::Error>, core::result::Result<(), anyhow::Error>),std::panic::AssertUnwindSafe> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:365 data_ptr = data = std::panicking::try::Data, (core::result::Result<(), anyhow::Error>, core::result::Result<(), anyhow::Error>)> {f: core::mem::manually_drop::ManuallyDrop> {value: std::panic::AssertUnwindSafe (rayon_core::job::{{impl}}::execute::call::closure-0 (rayon_core::registry::{{impl}}::in_worker_cold::{{closure}}::closure-0 (rayon_core::join::join_context::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-1 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0})))))}, r: core::mem::manually_drop::ManuallyDrop<(core::result::Result<(), anyhow::Error>, core::result::Result<(), anyhow::Error>)> {value: (core::result::Result<(), anyhow::Error>::Ok(()), core::result::Result<(), anyhow::Error>::Ok(()))}, p: core::mem::manually_drop::ManuallyDrop> {value: core::any::Box {pointer: 0x0, vtable: 0x0}}} data = data_ptr = #86 std::panic::catch_unwind,(core::result::Result<(), anyhow::Error>, core::result::Result<(), anyhow::Error>)> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:434 No locals. #87 rayon_core::unwind::halt_unwinding, core::result::Result<(), anyhow::Error>)> (func=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/unwind.rs:17 No locals. #88 rayon_core::job::{{impl}}::execute<&rayon_core::latch::LockLatch,closure-0,(core::result::Result<(), anyhow::Error>, core::result::Result<(), anyhow::Error>)> (this=0x7f28ade01518) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/job.rs:119 func = rayon_core::registry::{{impl}}::in_worker_cold::{{closure}}::closure-0 (rayon_core::join::join_context::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-1 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}))) abort = rayon_core::unwind::AbortIfPanic this = 0x7f28ade01518 #89 0x00007f28c42b1d21 in rayon_core::job::JobRef::execute (self=) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/job.rs:59 No locals. #90 rayon_core::registry::WorkerThread::execute (self=, job=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/registry.rs:749 No locals. #91 rayon_core::registry::WorkerThread::wait_until_cold (self=, latch=) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/registry.rs:726 job = rayon_core::job::JobRef {pointer: 0x0, execute_fn: 0x0} idle_state = rayon_core::sleep::IdleState {worker_index: 6, rounds: 0, jobs_counter: rayon_core::sleep::counters::JobsEventCounter (18446744073709551615)} abort_guard = rayon_core::unwind::AbortIfPanic #92 0x00007f28c4393bfd in rayon_core::registry::WorkerThread::wait_until (self=0x7f28fdbf1980, latch=) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/registry.rs:700 latch = 0x7f28c3fb7e90 latch = #93 rayon_core::registry::main_loop (registry=..., index=6, worker=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/registry.rs:833 my_terminate_latch = 0x7f28c3fb7e90 abort_guard = rayon_core::unwind::AbortIfPanic worker_thread = 0x7f28fdbf1980 worker_thread = abort_guard = rayon_core::unwind::AbortIfPanic handler = registry = alloc::sync::Arc {ptr: core::ptr::non_null::NonNull> {pointer: 0x0}, phantom: core::marker::PhantomData>} err = core::any::Box {pointer: 0x0, vtable: 0x0} my_terminate_latch = handler = registry = alloc::sync::Arc {ptr: core::ptr::non_null::NonNull> {pointer: 0x0}, phantom: core::marker::PhantomData>} err = core::any::Box {pointer: 0x0, vtable: 0x0} #94 rayon_core::registry::ThreadBuilder::run (self=...) at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/registry.rs:55 No locals. #95 0x00007f28c4398615 in rayon_core::registry::{{impl}}::spawn::{{closure}} () at /home/hendrik/.cargo/registry/src/github.com-1ecc6299db9ec823/rayon-core-1.9.1/src/registry.rs:100 thread = #96 std::sys_common::backtrace::__rust_begin_short_backtrace (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/sys_common/backtrace.rs:125 No locals. #97 0x00007f28c439821b in std::thread::{{impl}}::spawn_unchecked::{{closure}}::{{closure}} () at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/thread/mod.rs:481 f = #98 std::panic::{{impl}}::call_once<(),closure-0> (self=..., _args=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:347 No locals. #99 std::panicking::try::do_call,()> (data=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:401 f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) data = data = data = data = f = std::panic::AssertUnwindSafe (rayon_core::join::join_context::call_a::closure-0 (rayon::iter::plumbing::bridge_unindexed_producer_consumer::closure-0 (0x0, 0x0, rayon::iter::par_bridge::IterParallelProducer> {split_count: 0x0, done: 0x0, iter: 0x0, items: crossbeam_deque::deque::Stealer {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x0}, phantom: core::marker::PhantomData>>>}, flavor: crossbeam_deque::deque::Flavor::Fifo}}, rayon::iter::map_with::MapInitConsumer core::result::Result<(), anyhow::Error>, fn()>, closure-0, closure-1> {base: rayon::iter::try_reduce::TryReduceConsumer core::result::Result<(), anyhow::Error>, fn()> {identity: 0x0, reduce_op: 0x0, full: 0x0}, init: 0x0, map_op: 0x0}), false)) #100 std::panicking::try<(),std::panic::AssertUnwindSafe> (f=...) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panicking.rs:365 data_ptr = data = data = data_ptr = #101 std::panic::catch_unwind,()> (f=) at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/panic.rs:434 No locals. #102 std::thread::{{impl}}::spawn_unchecked::{{closure}} () at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/std/src/thread/mod.rs:480 their_thread = std::thread::Thread {inner: alloc::sync::Arc {ptr: core::ptr::non_null::NonNull> {pointer: 0x7f28a0006b00}, phantom: core::marker::PhantomData>}} output_capture = core::option::Option>>>::None f = rayon_core::registry::{{impl}}::spawn::closure-0 (rayon_core::registry::ThreadBuilder {name: core::option::Option::None, stack_size: core::option::Option::None, worker: crossbeam_deque::deque::Worker {inner: alloc::sync::Arc>> {ptr: core::ptr::non_null::NonNull>>> {pointer: 0x7f28a0003c00}, phantom: core::marker::PhantomData>>>}, buffer: core::cell::Cell> {value: core::cell::UnsafeCell> {value: crossbeam_deque::deque::Buffer {ptr: 0x7f28a0003790, cap: 64}}}, flavor: crossbeam_deque::deque::Flavor::Lifo, _marker: core::marker::PhantomData<*mut ()>}, registry: alloc::sync::Arc {ptr: core::ptr::non_null::NonNull> {pointer: 0x7f28a0005c00}, phantom: core::marker::PhantomData>}, index: 6}) their_packet = alloc::sync::Arc>>>> {ptr: core::ptr::non_null::NonNull>>>>> {pointer: 0x7f28a0006b40}, phantom: core::marker::PhantomData>>>>>} name = try_result = #103 core::ops::function::FnOnce::call_once () at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/core/src/ops/function.rs:227 No locals. #104 0x00007f28c43def77 in alloc::boxed::{{impl}}::call_once<(),FnOnce<()>,alloc::alloc::Global> () at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/alloc/src/boxed.rs:1575 No locals. #105 alloc::boxed::{{impl}}::call_once<(),alloc::boxed::Box, alloc::alloc::Global>,alloc::alloc::Global> () at /rustc/e4a60327063e82413eed50a10df3b7d19b77bda0/library/alloc/src/boxed.rs:1575 No locals. #106 std::sys::unix::thread::{{impl}}::new::thread_start () at library/std/src/sys/unix/thread.rs:71 No locals. #107 0x00007f2912af6299 in start_thread () from /lib64/libpthread.so.0 No symbol table info available. #108 0x00007f2912c0e353 in clone () from /lib64/libc.so.6 No symbol table info available. ```
aldanor commented 3 years ago

Thanks for reporting - wonder if you could come up with a minimal example that crashes?

(looks like a double free, perhaps?)

mulimoen commented 3 years ago

What version of hdf5-c did you use? If its reproducible using the static build you could include the address sanitizer, see in the github actions run addr_san in #139 for this.

Rikorose commented 3 years ago

@aldanor Yes I will try to provide a minimal example. A first guess would be due to calling rust via pyo3 wrapper (and only in release mode).

@mulimoen Do you mean libhdf5? I use the fedora stable version:

$ dnf info hdf5-devel
Last metadata expiration check: 0:00:20 ago on Thu 10 Jun 2021 10:18:49 PM CEST.
Installed Packages
Name         : hdf5-devel
Version      : 1.10.6
Release      : 5.fc34
Rikorose commented 3 years ago

I think this bug is most likely due to PyO3 not cleaning up correctly. The current process hierarchy is: Python --> PyO3 RustWrapper --> Rust Dataloader -> Submission thread -> Rayon parallel iterator (i.e. a rayon thread pool), which reads from hdf5. Rust dataloader holds hdf5 handles and passes them as immutable references to the rayon thread pool.

So I guess, PyO3 drops the Rust wrapper, but somehow the rayon thread pool lives on (maybe also the submission thread which holds the threadpool). This may result in a cleanup of the hdf5 handles while the thread pool still tries to access them. Stopping the Submission thread and thus also the rayon thread pool explicitly in python via atexit.register(), solves the issue.

mulimoen commented 3 years ago

holds hdf5 handles and passes them as immutable references to the rayon thread pool

Is this a &Handle or a Handle? The latter should be easier to use correctly, and should prevent the object from being doubly closed. Each Handle, whether it be a File, a Dataset or something else is rather like an Arc on the libhdf5 side of things.

Rikorose commented 3 years ago

Sorry for the late reply. My data structure is as follows:

struct Dataset {
    hdf5_handles: Vec<hdf5::File>,
}
struct DataLoader {
  ds: Arc<Dataset>,
}
impl DataLoader {
// ...
    fn start_worker(&mut self) -> std::thread::JoinHandle<()> {
        let ds = Arc::clone(self.ds);
        let thread_handle = std::thread::spawn(move || {
            0..10.par_bridge().for_each( || {  // par_bridge (rayon) iterates in parallel over range and results in parallel hdf5 access
                let data = ds.read_from_hdf5();
                // Send via some channel; closing the channel will stop this parallel loop
            });
        });
        thread_handle
    }
    fn drop(&mut self) {
        // Close the data output channel so that the rayon parallel iter stops
        // And join the worker thread afterwards
    }
}

When calling via pyo3, I think drop() is not called and the thread lives on until the segfault happens. Using pythons atexit() I can make sure that rayon threadpool and worker thread are joined, which resolves this segfault issue. I guess this issue is on the PyO3 side not on HDF5.

mulimoen commented 3 years ago

This is an ugly issue, I can replicate with (no python):

use hdf5::*;

fn main() {
    let file = File::create("file.h5").unwrap();
    let ds = file.new_dataset::<i32>().create("ds").unwrap();

    let h = std::thread::spawn(move || {
        std::mem::drop(ds);
    });
    // std::mem::drop(file);
    // h.join().unwrap();
}

I initially thought this was related to how we handle objects (see #139), but this made no difference. The fault happens when hdf5 is calling atexit (stdlib.h), invalidating all handles, but rust tries to clean up the (now gone) handle in the child thread on program exit. Thus the double free.

To fix this we can use H5dont_atexit on library initialisation. This usually guards against unclosed objects, but in Rust we guarantee closing objects with Drop.