You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@arrow.apache.org by GitBox <gi...@apache.org> on 2022/12/16 16:27:25 UTC

[GitHub] [arrow] paleolimbot commented on pull request #14582: ARROW-18240: [R] head() is crashing on some nightly builds

paleolimbot commented on PR #14582:
URL: https://github.com/apache/arrow/pull/14582#issuecomment-1355173130

   A more detailed investigation of the threads present when the hang occurs.
   
   The first problem is that there is one more exec plan than I expect....I expected there to be one, but it seems like there are two.
   
   
   The R code. Run this from a terminal (not from RStudio). Conceptually I expect
   this to create one exec plan for `open_dataset() |> filter()`. The resulting
   `RecordBatchReader` will get read into a `Table`; no evaluation of the ExecPlan
   should occur before the `reader->ToTable();` call. That call should occur on
   a non main-R thread launched by `RunWithCapturedR()`. Currently that thread
   is borrowed from the IO thread pool.
   
   ```r
   library(arrow, warn.conflicts = FALSE)
   # Information you need to attach LLDB
   Sys.getpid()
   
   dataset_dir <- tempfile()
   write_dataset(mtcars, dataset_dir)
   
   # change to set_cpu_count(1) to reproduce the deadlock
   set_cpu_count(1)
   
   open_dataset(dataset_dir) |> 
     dplyr::filter(mpg > 30) |> 
     head() |> 
     dplyr::collect()
   ```
   
   This will hang. Attach LLDB in VSCode or a terminal.
   
   ## Thread 1
   
   The main R thread, waiting for SafeCallIntoR jobs to be submitted. This seems
   normal.
   
   <details>
   
   ```
   bt
   * thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
     * frame #0: 0x00000001a1cba5e4 libsystem_kernel.dylib`__psynch_cvwait + 8
       frame #1: 0x00000001a1cf6638 libsystem_pthread.dylib`_pthread_cond_wait + 1232
       frame #2: 0x00000001a1c43ac4 libc++.1.dylib`std::__1::condition_variable::wait(std::__1::unique_lock<std::__1::mutex>&) + 28
       frame #3: 0x0000000280806520 libarrow.1100.0.0.dylib`void std::__1::condition_variable::wait<arrow::internal::SerialExecutor::RunLoop()::$_0>(this=0x0000600000a88208, __lk=0x000000016afcece8, __pred=(0x000000016afced58))::$_0) at __mutex_base:404:9
       frame #4: 0x0000000280805b74 libarrow.1100.0.0.dylib`arrow::internal::SerialExecutor::RunLoop(this=0x000000016afced58) at thread_pool.cc:174:28
       frame #5: 0x000000010948a324 arrow.so`arrow::Future<std::__1::shared_ptr<arrow::Table>> arrow::internal::SerialExecutor::Run<std::__1::shared_ptr<arrow::Table>, arrow::Result<std::__1::shared_ptr<arrow::Table>>>(this=0x000000016afced58, initial_task=arrow::internal::SerialExecutor::TopLevelTask<std::__1::shared_ptr<arrow::Table> > @ 0x000000016afced50)>) at thread_pool.h:392:5 [opt]
       frame #6: 0x0000000109489efc arrow.so`arrow::Result<std::__1::shared_ptr<arrow::Table>> arrow::internal::SerialExecutor::RunInSerialExecutor<std::__1::shared_ptr<arrow::Table>, arrow::Future<std::__1::shared_ptr<arrow::Table>>, arrow::Result<std::__1::shared_ptr<arrow::Table>>>(initial_task=arrow::internal::SerialExecutor::TopLevelTask<std::__1::shared_ptr<arrow::Table> > @ 0x000000016afcedb0)>) at thread_pool.h:289:38 [opt]
       frame #7: 0x0000000109489ca4 arrow.so`arrow::Result<std::__1::shared_ptr<arrow::Table>> RunWithCapturedR<std::__1::shared_ptr<arrow::Table>>(make_arrow_call=function<arrow::Future<std::__1::shared_ptr<arrow::Table> > ()> @ 0x000000016afcee48)>) at safe-call-into-r.h:287:29 [opt]
       frame #8: 0x000000010947a8dc arrow.so`arrow::Result<std::__1::shared_ptr<arrow::Table>> RunWithCapturedRIfPossible<std::__1::shared_ptr<arrow::Table>>(make_arrow_call=function<arrow::Result<std::__1::shared_ptr<arrow::Table> > ()> @ 0x000000016afceea0)>) at safe-call-into-r.h:314:12 [opt]
       frame #9: 0x000000010947a784 arrow.so`Table__from_ExecPlanReader(reader=<unavailable>) at compute-exec.cpp:195:17 [opt]
       
       (omitting higher up frames involved in the R code that calls this C++ function)
   
   
   ```
   
   </details>
   
   ## Thread 2
   
   This one seems like a signal handler of some kind but doesn't have any Arrow (R or C++) in the backtrace. It doesn't seem suspicious.
   
   <details>
   
   ```
   thread #2
       frame #0: 0x00000001a1cba3e0 libsystem_kernel.dylib`__semwait_signal + 8
       frame #1: 0x00000001a1bc45b0 libsystem_c.dylib`nanosleep + 220
       frame #2: 0x000000010764bf70 cli.so`clic_thread_func(arg=<unavailable>) at thread.c:37:5 [opt]
       frame #3: 0x00000001a1cf606c libsystem_pthread.dylib`_pthread_start + 148
   ```
   
   </details>
   
   
   ## Thread 3
   
   Has some calls that I would expect to occur. Notably, `RecordBatchReaderHead::ReadNext()`,
   which in turn calls `ExecPlanReader::ReadNext()`. The top level of the call stack
   seems to indicate that there is a BackgroundGenerator involved. That suggests to
   me that an `ExecPlan` is somehow involved in the `RecordBatchReader` to
   `Table` collection, which I didn't expect. This thread is waiting on
   `ExecPlanReader::ReadNext()`.
   
   <details>
   
   ```
   bt
     thread #3
       frame #0: 0x00000001a1cba5e4 libsystem_kernel.dylib`__psynch_cvwait + 8
       frame #1: 0x00000001a1cf6638 libsystem_pthread.dylib`_pthread_cond_wait + 1232
       frame #2: 0x00000001a1c43ac4 libc++.1.dylib`std::__1::condition_variable::wait(std::__1::unique_lock<std::__1::mutex>&) + 28
       frame #3: 0x000000028079288c libarrow.1100.0.0.dylib`void std::__1::condition_variable::wait<arrow::ConcreteFutureImpl::DoWait()::'lambda'()>(this=0x0000600000a9a908, __lk=0x000000016b3226e8, __pred=(0x0000600000a9a880))::'lambda'()) at __mutex_base:404:9
       frame #4: 0x0000000280790ef8 libarrow.1100.0.0.dylib`arrow::ConcreteFutureImpl::DoWait(this=0x0000600000a9a880) at future.cc:154:9
       frame #5: 0x0000000280790e84 libarrow.1100.0.0.dylib`arrow::FutureImpl::Wait(this=0x0000600000a9a880) at future.cc:189:52
       frame #6: 0x000000010948c478 arrow.so`ExecPlanReader::ReadNext(std::__1::shared_ptr<arrow::RecordBatch>*) [inlined] arrow::Future<std::__1::optional<arrow::compute::ExecBatch>>::Wait(this=0x000000016b322740) const at future.h:385:12 [opt]
       frame #7: 0x000000010948c470 arrow.so`ExecPlanReader::ReadNext(std::__1::shared_ptr<arrow::RecordBatch>*) [inlined] arrow::Future<std::__1::optional<arrow::compute::ExecBatch>>::result(this=0x000000016b322740) const & at future.h:356:5 [opt]
       frame #8: 0x000000010948c470 arrow.so`ExecPlanReader::ReadNext(this=0x00006000011bc518, batch_out=0x000000016b322880) at compute-exec.cpp:118:28 [opt]
       frame #9: 0x000000010952f5c4 arrow.so`RecordBatchReaderHead::ReadNext(this=0x0000600001cbcf18, batch_out=0x000000016b322880) at recordbatchreader.cpp:142:5 [opt]
       frame #10: 0x000000010cbb839c libarrow_dataset.1100.0.0.dylib`arrow::RecordBatchReader::Next(this=0x0000600001cbcf18) at record_batch.h:243:5
       frame #11: 0x000000010cdb47d8 libarrow_dataset.1100.0.0.dylib`arrow::Iterator<arrow::RecordBatchReader::ValueType> arrow::MakeIteratorFromReader<arrow::RecordBatchReader>(this=(std::__1::shared_ptr<arrow::RecordBatchReader>::element_type @ 0x0000600001cbcf18 strong=2 weak=1))::'lambda'()::operator()() const at iterator.h:565:57
       frame #12: 0x000000010cdb47a4 libarrow_dataset.1100.0.0.dylib`arrow::FunctionIterator<arrow::Iterator<arrow::RecordBatchReader::ValueType> arrow::MakeIteratorFromReader<arrow::RecordBatchReader>(std::__1::shared_ptr<arrow::RecordBatchReader> const&)::'lambda'(), std::__1::shared_ptr<arrow::RecordBatch>>::Next(this=0x0000600003da1e00) at iterator.h:346:29
       frame #13: 0x000000010cdb4744 libarrow_dataset.1100.0.0.dylib`arrow::Result<std::__1::shared_ptr<arrow::RecordBatch>> arrow::Iterator<std::__1::shared_ptr<arrow::RecordBatch>>::Next<arrow::FunctionIterator<arrow::Iterator<arrow::RecordBatchReader::ValueType> arrow::MakeIteratorFromReader<arrow::RecordBatchReader>(ptr=0x0000600003da1e00)::'lambda'(), std::__1::shared_ptr<arrow::RecordBatch>>>(void*) at iterator.h:200:40
       frame #14: 0x000000010cbdf628 libarrow_dataset.1100.0.0.dylib`arrow::Iterator<std::__1::shared_ptr<arrow::RecordBatch>>::Next(this=0x0000600003f9cde8) at iterator.h:110:29
       frame #15: 0x0000000280c819dc libarrow.1100.0.0.dylib`arrow::MapIterator<arrow::compute::MakeReaderGenerator(std::__1::shared_ptr<arrow::RecordBatchReader>, arrow::internal::Executor*, int, int)::$_5, std::__1::shared_ptr<arrow::RecordBatch>, std::__1::optional<arrow::compute::ExecBatch>>::Next(this=0x0000600003f9cde0) at iterator.h:428:5
       frame #16: 0x0000000280c81950 libarrow.1100.0.0.dylib`arrow::Result<std::__1::optional<arrow::compute::ExecBatch>> arrow::Iterator<std::__1::optional<arrow::compute::ExecBatch>>::Next<arrow::MapIterator<arrow::compute::MakeReaderGenerator(ptr=0x0000600003f9cde0)::$_5, std::__1::shared_ptr<arrow::RecordBatch>, std::__1::optional<arrow::compute::ExecBatch>>>(void*) at iterator.h:200:40
       frame #17: 0x0000000280c5e784 libarrow.1100.0.0.dylib`arrow::Iterator<std::__1::optional<arrow::compute::ExecBatch>>::Next(this=0x0000600000a9ed28) at iterator.h:110:29
       frame #18: 0x0000000280c8a448 libarrow.1100.0.0.dylib`arrow::BackgroundGenerator<std::__1::optional<arrow::compute::ExecBatch>>::WorkerTask(state=std::__1::shared_ptr<arrow::BackgroundGenerator<std::__1::optional<arrow::compute::ExecBatch> >::State>::element_type @ 0x0000600000a9ed18 strong=3 weak=1) at async_generator.h:1759:29
       frame #19: 0x0000000280c8a3a0 libarrow.1100.0.0.dylib`arrow::BackgroundGenerator<std::__1::optional<arrow::compute::ExecBatch>>::State::DoRestartTask(this=(std::__1::shared_ptr<arrow::BackgroundGenerator<std::__1::optional<arrow::compute::ExecBatch> >::State>::element_type @ 0x0000600000a9ed18 strong=3 weak=1))::'lambda'()::operator()() const at async_generator.h:1666:23
       frame #20: 0x0000000280c8a31c libarrow.1100.0.0.dylib`arrow::internal::FnOnce<void ()>::FnImpl<arrow::BackgroundGenerator<std::__1::optional<arrow::compute::ExecBatch>>::State::DoRestartTask(this=0x0000600003f9cd60)::'lambda'()>::invoke() at functional.h:152:42
       frame #21: 0x00000002808063f0 libarrow.1100.0.0.dylib`arrow::internal::FnOnce<void ()>::operator(this=0x000000016b322e38)() && at functional.h:140:17
       frame #22: 0x0000000280818ef0 libarrow.1100.0.0.dylib`arrow::internal::WorkerLoop(state=std::__1::shared_ptr<arrow::internal::ThreadPool::State>::element_type @ 0x00000001508b32e8 strong=3 weak=2, it=std::__1::list<std::__1::thread, std::__1::allocator<std::__1::thread> >::iterator @ 0x000000016b322ed8) at thread_pool.cc:262:11
       frame #23: 0x0000000280818bfc libarrow.1100.0.0.dylib`arrow::internal::ThreadPool::LaunchWorkersUnlocked(this=(0x00006000031b8420, std::__1::shared_ptr<arrow::internal::ThreadPool::State>::element_type @ 0x00000001508b32e8 strong=3 weak=2, {...}))::$_6::operator()() const at thread_pool.cc:423:7
       frame #24: 0x0000000280818b58 libarrow.1100.0.0.dylib`decltype(__f=(0x00006000031b8420, std::__1::shared_ptr<arrow::internal::ThreadPool::State>::element_type @ 0x00000001508b32e8 strong=3 weak=2, {...}))::$_6>(fp)()) std::__1::__invoke<arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6>(arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6&&) at type_traits:3918:1
       frame #25: 0x0000000280818af4 libarrow.1100.0.0.dylib`void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6>(__t=size=2, (null)=__tuple_indices<> @ 0x000000016b322f7f)::$_6>&, std::__1::__tuple_indices<>) at thread:287:5
   
   frame #26: 0x0000000280818290 libarrow.1100.0.0.dylib`void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6>>(__vp=0x0000600003185c50) at thread:298:5
       frame #27: 0x00000001a1cf606c libsystem_pthread.dylib`_pthread_start + 148
   
   ```
   
   </details>
   
   ## Thread 4
   
   This is the signal stop source waiting for input from a signal handler? I don't know
   the details but I am guessing this stop source would always be waiting for input
   as long as there is a signal handler registered.
   
   <details>
   
   ```
   bt
     thread #4
       frame #0: 0x00000001a1cb79ac libsystem_kernel.dylib`read + 8
       frame #1: 0x00000002807d2844 libarrow.1100.0.0.dylib`arrow::internal::(anonymous namespace)::SelfPipeImpl::Wait(this=0x0000600001cbcbf8) at io_util.cc:1268:24
       frame #2: 0x000000028076fc04 libarrow.1100.0.0.dylib`arrow::(anonymous namespace)::SignalStopState::ReceiveSignals(self_pipe=std::__1::shared_ptr<arrow::internal::SelfPipe>::element_type @ 0x0000600001cbcbf8 strong=2 weak=3) at cancel.cc:246:39
       frame #3: 0x0000000280770ba4 libarrow.1100.0.0.dylib`decltype(__f=0x0000600003f9c6a8, __args=nullptr)(static_cast<std::__1::shared_ptr<arrow::internal::SelfPipe>>(fp0))) std::__1::__invoke<void (*)(std::__1::shared_ptr<arrow::internal::SelfPipe>), std::__1::shared_ptr<arrow::internal::SelfPipe>>(void (*&&)(std::__1::shared_ptr<arrow::internal::SelfPipe>), std::__1::shared_ptr<arrow::internal::SelfPipe>&&) at type_traits:3918:1
       frame #4: 0x0000000280770b1c libarrow.1100.0.0.dylib`void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, void (*)(std::__1::shared_ptr<arrow::internal::SelfPipe>), std::__1::shared_ptr<arrow::internal::SelfPipe>, 2ul>(__t=size=3, (null)=__tuple_indices<2> @ 0x000000016b552f7f)(std::__1::shared_ptr<arrow::internal::SelfPipe>), std::__1::shared_ptr<arrow::internal::SelfPipe>>&, std::__1::__tuple_indices<2ul>) at thread:287:5
       frame #5: 0x00000002807701bc libarrow.1100.0.0.dylib`void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, void (*)(std::__1::shared_ptr<arrow::internal::SelfPipe>), std::__1::shared_ptr<arrow::internal::SelfPipe>>>(__vp=0x0000600003f9c6a0) at thread:298:5
       frame #6: 0x00000001a1cf606c libsystem_pthread.dylib`_pthread_start + 148
   ```
   
   </details>
   
   ## Thread 5
   
   A thread pool worker loop. This seems like it's looping and sleeping which seems
   fine?
   
   <details>
   
   ```
   bt
     thread #5
       frame #0: 0x00000001a1cba5e4 libsystem_kernel.dylib`__psynch_cvwait + 8
       frame #1: 0x00000001a1cf6638 libsystem_pthread.dylib`_pthread_cond_wait + 1232
       frame #2: 0x00000001a1c43ac4 libc++.1.dylib`std::__1::condition_variable::wait(std::__1::unique_lock<std::__1::mutex>&) + 28
       frame #3: 0x0000000280819040 libarrow.1100.0.0.dylib`arrow::internal::WorkerLoop(state=std::__1::shared_ptr<arrow::internal::ThreadPool::State>::element_type @ 0x000000012f694238 strong=7 weak=2, it=std::__1::list<std::__1::thread, std::__1::allocator<std::__1::thread> >::iterator @ 0x000000016b5deed8) at thread_pool.cc:280:16
       frame #4: 0x0000000280818bfc libarrow.1100.0.0.dylib`arrow::internal::ThreadPool::LaunchWorkersUnlocked(this=(0x00006000031bc3c0, std::__1::shared_ptr<arrow::internal::ThreadPool::State>::element_type @ 0x000000012f694238 strong=7 weak=2, {...}))::$_6::operator()() const at thread_pool.cc:423:7
       frame #5: 0x0000000280818b58 libarrow.1100.0.0.dylib`decltype(__f=(0x00006000031bc3c0, std::__1::shared_ptr<arrow::internal::ThreadPool::State>::element_type @ 0x000000012f694238 strong=7 weak=2, {...}))::$_6>(fp)()) std::__1::__invoke<arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6>(arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6&&) at type_traits:3918:1
       frame #6: 0x0000000280818af4 libarrow.1100.0.0.dylib`void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6>(__t=size=2, (null)=__tuple_indices<> @ 0x000000016b5def7f)::$_6>&, std::__1::__tuple_indices<>) at thread:287:5
       frame #7: 0x0000000280818290 libarrow.1100.0.0.dylib`void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6>>(__vp=0x00006000031bc510) at thread:298:5
   
   frame #8: 0x00000001a1cf606c libsystem_pthread.dylib`_pthread_start + 148
   
   ```
   
   </details>
   
   ## Thread 6
   
   This is the call to `RecordBatchReader::ToTable()`...probably the one that was
   launched by Thread #1. This seems to be reading an `ExecPlanReader`, so maybe
   there was an extra `ExecPlan` that was created that I did not expect.
   
   <details>
   
   ```
   bt
     thread #6
       frame #0: 0x00000001a1cba5e4 libsystem_kernel.dylib`__psynch_cvwait + 8
       frame #1: 0x00000001a1cf6638 libsystem_pthread.dylib`_pthread_cond_wait + 1232
       frame #2: 0x00000001a1c43ac4 libc++.1.dylib`std::__1::condition_variable::wait(std::__1::unique_lock<std::__1::mutex>&) + 28
       frame #3: 0x000000028079288c libarrow.1100.0.0.dylib`void std::__1::condition_variable::wait<arrow::ConcreteFutureImpl::DoWait()::'lambda'()>(this=0x0000600000a88a48, __lk=0x000000016b66aa28, __pred=(0x0000600000a889c0))::'lambda'()) at __mutex_base:404:9
       frame #4: 0x0000000280790ef8 libarrow.1100.0.0.dylib`arrow::ConcreteFutureImpl::DoWait(this=0x0000600000a889c0) at future.cc:154:9
       frame #5: 0x0000000280790e84 libarrow.1100.0.0.dylib`arrow::FutureImpl::Wait(this=0x0000600000a889c0) at future.cc:189:52
       frame #6: 0x000000010948c478 arrow.so`ExecPlanReader::ReadNext(std::__1::shared_ptr<arrow::RecordBatch>*) [inlined] arrow::Future<std::__1::optional<arrow::compute::ExecBatch>>::Wait(this=0x000000016b66aa80) const at future.h:385:12 [opt]
       frame #7: 0x000000010948c470 arrow.so`ExecPlanReader::ReadNext(std::__1::shared_ptr<arrow::RecordBatch>*) [inlined] arrow::Future<std::__1::optional<arrow::compute::ExecBatch>>::result(this=0x000000016b66aa80) const & at future.h:356:5 [opt]
       frame #8: 0x000000010948c470 arrow.so`ExecPlanReader::ReadNext(this=0x00006000011bc618, batch_out=0x000000016b66ab88) at compute-exec.cpp:118:28 [opt]
       frame #9: 0x00000002804b56c4 libarrow.1100.0.0.dylib`arrow::RecordBatchReader::ToRecordBatches(this=0x00006000011bc618) at record_batch.cc:334:5
       frame #10: 0x00000002804b5bcc libarrow.1100.0.0.dylib`arrow::RecordBatchReader::ToTable(this=0x00006000011bc618) at record_batch.cc:348:3
       frame #11: 0x000000010948b750 arrow.so`arrow::internal::FnOnce<void ()>::FnImpl<std::__1::__bind<arrow::detail::ContinueFuture, arrow::Future<std::__1::shared_ptr<arrow::Table>>&, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>>>::invoke() [inlined] std::__1::__function::__value_func<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>::operator(this=<unavailable>)() const at function.h:505:16 [opt]
       frame #12: 0x000000010948b738 arrow.so`arrow::internal::FnOnce<void ()>::FnImpl<std::__1::__bind<arrow::detail::ContinueFuture, arrow::Future<std::__1::shared_ptr<arrow::Table>>&, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>>>::invoke() [inlined] std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>::operator(this=<unavailable>)() const at function.h:1182:12 [opt]
       frame #13: 0x000000010948b738 arrow.so`arrow::internal::FnOnce<void ()>::FnImpl<std::__1::__bind<arrow::detail::ContinueFuture, arrow::Future<std::__1::shared_ptr<arrow::Table>>&, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>>>::invoke() [inlined] std::__1::enable_if<!std::is_void<arrow::Result<std::__1::shared_ptr<arrow::Table>>>::value && !is_future<arrow::Result<std::__1::shared_ptr<arrow::Table>>>::value && (!arrow::Future<std::__1::shared_ptr<arrow::Table>>::is_empty || std::is_same<arrow::Result<std::__1::shared_ptr<arrow::Table>>, arrow::Status>::value), void>::type arrow::detail::ContinueFuture::operator(this=<unavailable>, next=Future<std::__1::shared_ptr<arrow::Table> > @ 0x000000016b66aca0, f=<unavailable>)<std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>&, arrow::Result<std::__1::shared_ptr<arrow::Table>>, arrow::Future<std::__1::shared_ptr<arrow::Table>>>(arrow::Future<std::__1::shared_ptr<arrow::Table>>, std::__1
 ::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>&) const at future.h:150:23 [opt]
       frame #14: 0x000000010948b738 arrow.so`arrow::internal::FnOnce<void ()>::FnImpl<std::__1::__bind<arrow::detail::ContinueFuture, arrow::Future<std::__1::shared_ptr<arrow::Table>>&, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>>>::invoke() [inlined] decltype(__f=<unavailable>, __args=<unavailable>, __args=<unavailable>)(static_cast<arrow::Future<std::__1::shared_ptr<arrow::Table>>&>(fp0), static_cast<std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>&>(fp0))) std::__1::__invoke<arrow::detail::ContinueFuture&, arrow::Future<std::__1::shared_ptr<arrow::Table>>&, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>&>(arrow::detail::ContinueFuture&, arrow::Future<std::__1::shared_ptr<arrow::Table>>&, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>&) at type_traits:3918:1 [opt]
       frame #15: 0x000000010948b720 arrow.so`arrow::internal::FnOnce<void ()>::FnImpl<std::__1::__bind<arrow::detail::ContinueFuture, arrow::Future<std::__1::shared_ptr<arrow::Table>>&, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>>>::invoke() [inlined] std::__1::__bind_return<arrow::detail::ContinueFuture, std::__1::tuple<arrow::Future<std::__1::shared_ptr<arrow::Table>>, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>>, std::__1::tuple<>, __is_valid_bind_return<arrow::detail::ContinueFuture, std::__1::tuple<arrow::Future<std::__1::shared_ptr<arrow::Table>>, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>>, std::__1::tuple<>>::value>::type std::__1::__apply_functor<arrow::detail::ContinueFuture, std::__1::tuple<arrow::Future<std::__1::shared_ptr<arrow::Table>>, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> (__f=<unavailable>, __bound_args=<unavailable>, (null)=<unavailable>, __args=<
 unavailable>)>>, 0ul, 1ul, std::__1::tuple<>>(arrow::detail::ContinueFuture&, std::__1::tuple<arrow::Future<std::__1::shared_ptr<arrow::Table>>, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>>&, std::__1::__tuple_indices<0ul, 1ul>, std::__1::tuple<>&&) at bind.h:257:12 [opt]
       frame #16: 0x000000010948b720 arrow.so`arrow::internal::FnOnce<void ()>::FnImpl<std::__1::__bind<arrow::detail::ContinueFuture, arrow::Future<std::__1::shared_ptr<arrow::Table>>&, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>>>::invoke() [inlined] std::__1::__bind_return<arrow::detail::ContinueFuture, std::__1::tuple<arrow::Future<std::__1::shared_ptr<arrow::Table>>, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>>, std::__1::tuple<>, __is_valid_bind_return<arrow::detail::ContinueFuture, std::__1::tuple<arrow::Future<std::__1::shared_ptr<arrow::Table>>, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> ()>>, std::__1::tuple<>>::value>::type std::__1::__bind<arrow::detail::ContinueFuture, arrow::Future<std::__1::shared_ptr<arrow::Table>>&, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> (this=<unavailable>)>>::operator()<>() at bind.h:292:20 [opt]
       frame #17: 0x000000010948b720 arrow.so`arrow::internal::FnOnce<void ()>::FnImpl<std::__1::__bind<arrow::detail::ContinueFuture, arrow::Future<std::__1::shared_ptr<arrow::Table>>&, std::__1::function<arrow::Result<std::__1::shared_ptr<arrow::Table>> (this=<unavailable>)>>>::invoke() at functional.h:152:42 [opt]
       frame #18: 0x00000002808063f0 libarrow.1100.0.0.dylib`arrow::internal::FnOnce<void ()>::operator(this=0x000000016b66ae38)() && at functional.h:140:17
       frame #19: 0x0000000280818ef0 libarrow.1100.0.0.dylib`arrow::internal::WorkerLoop(state=std::__1::shared_ptr<arrow::internal::ThreadPool::State>::element_type @ 0x000000012f694238 strong=7 weak=2, it=std::__1::list<std::__1::thread, std::__1::allocator<std::__1::thread> >::iterator @ 0x000000016b66aed8) at thread_pool.cc:262:11
       frame #20: 0x0000000280818bfc libarrow.1100.0.0.dylib`arrow::internal::ThreadPool::LaunchWorkersUnlocked(this=(0x00006000031bc3c0, std::__1::shared_ptr<arrow::internal::ThreadPool::State>::element_type @ 0x000000012f694238 strong=7 weak=2, {...}))::$_6::operator()() const at thread_pool.cc:423:7
       frame #21: 0x0000000280818b58 libarrow.1100.0.0.dylib`decltype(__f=(0x00006000031bc3c0, std::__1::shared_ptr<arrow::internal::ThreadPool::State>::element_type @ 0x000000012f694238 strong=7 weak=2, {...}))::$_6>(fp)()) std::__1::__invoke<arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6>(arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6&&) at type_traits:3918:1
       frame #22: 0x0000000280818af4 libarrow.1100.0.0.dylib`void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6>(__t=size=2, (null)=__tuple_indices<> @ 0x000000016b66af7f)::$_6>&, std::__1::__tuple_indices<>) at thread:287:5
       frame #23: 0x0000000280818290 libarrow.1100.0.0.dylib`void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6>>(__vp=0x0000600003186040) at thread:298:5
       frame #24: 0x00000001a1cf606c libsystem_pthread.dylib`_pthread_start + 148
   
   
   ```
   
   </details>
   
   ## Thread 7
   
   Another thread pool worker loop. Also looping and sleeping.
   
   <details>
   
   ```
   bt
     thread #7
       frame #0: 0x00000001a1cba5e4 libsystem_kernel.dylib`__psynch_cvwait + 8
       frame #1: 0x00000001a1cf6638 libsystem_pthread.dylib`_pthread_cond_wait + 1232
       frame #2: 0x00000001a1c43ac4 libc++.1.dylib`std::__1::condition_variable::wait(std::__1::unique_lock<std::__1::mutex>&) + 28
       frame #3: 0x0000000280819040 libarrow.1100.0.0.dylib`arrow::internal::WorkerLoop(state=std::__1::shared_ptr<arrow::internal::ThreadPool::State>::element_type @ 0x000000012f694238 strong=7 weak=2, it=std::__1::list<std::__1::thread, std::__1::allocator<std::__1::thread> >::iterator @ 0x000000016b6f6ed8) at thread_pool.cc:280:16
       frame #4: 0x0000000280818bfc libarrow.1100.0.0.dylib`arrow::internal::ThreadPool::LaunchWorkersUnlocked(this=(0x00006000031bc3c0, std::__1::shared_ptr<arrow::internal::ThreadPool::State>::element_type @ 0x000000012f694238 strong=7 weak=2, {...}))::$_6::operator()() const at thread_pool.cc:423:7
       frame #5: 0x0000000280818b58 libarrow.1100.0.0.dylib`decltype(__f=(0x00006000031bc3c0, std::__1::shared_ptr<arrow::internal::ThreadPool::State>::element_type @ 0x000000012f694238 strong=7 weak=2, {...}))::$_6>(fp)()) std::__1::__invoke<arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6>(arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6&&) at type_traits:3918:1
       frame #6: 0x0000000280818af4 libarrow.1100.0.0.dylib`void std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6>(__t=size=2, (null)=__tuple_indices<> @ 0x000000016b6f6f7f)::$_6>&, std::__1::__tuple_indices<>) at thread:287:5
       frame #7: 0x0000000280818290 libarrow.1100.0.0.dylib`void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, arrow::internal::ThreadPool::LaunchWorkersUnlocked(int)::$_6>>(__vp=0x00006000031bc570) at thread:298:5
   
   frame #8: 0x00000001a1cf606c libsystem_pthread.dylib`_pthread_start + 148
   
   ```
   
   </details>
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org