zbentley opened a new issue #11847:
URL: https://github.com/apache/pulsar/issues/11847


   **Describe the bug**
   If a pulsar `Client` instance is constructed with its `logger` argument set 
to a Python logger, and that client is destroyed anywhere other than at global 
destruction/interpreter shutdown time, the Python interpreter will not shut 
down or respond to kill signals.
   
   **To Reproduce**
   0. Ensure a broker is running (I used a local 2.8.0 standalone).
   1. Control group: run the following Python snippet:
   ```python
   import logging
   from pulsar import Client
   
   def run_test():
       client = Client('pulsar://localhost:6650/', 
logger=logging.getLogger("foo"))
       client.create_producer('sometopic')
       print('done with run_test')
       return client
   
   to_be_destroyed_at_interpreter_shutdown = run_test()
   print('done with main')
   ```
   2. Observe that the program prints `done with run_test`, then `done with 
main`, then exits.
   3. Destroying the client at runtime rather than shutdown time: run the 
following Python snippet:
   ```python
   import logging
   from pulsar import Client
   
   def run_test():
       client = Client('pulsar://localhost:6650/', 
logger=logging.getLogger("foo"))
       client.create_producer('sometopic')
       print('done with run_test')
       return client
   
   run_test()
   print('done with main')
   ```
   4. Observe that the program hangs after printing `done with main`, and 
cannot be interrupted with CTRL+C.
   5. With a consumer: run the following Python snippet:
   ```python
   import logging
   from pulsar import Client
   
   def run_test():
       client = Client('pulsar://localhost:6650/', 
logger=logging.getLogger("foo"))
       consumer = client.subscribe('sometopic', 'somesub')
       consumer.close()
       print('done with run_test')
   
   run_test()
   print('done with main')
   ```
   6. Observe that the program hangs after printing `done with main`, and 
cannot be interrupted with CTRL+C.
   
   **Expected behavior**
   All three snippets should behave the same; they should all behave like the 
snippet in step 1 behaves.
    
       
   **Desktop (please complete the following information):**
    - MacOS 10.11.
    
   **Additional context**
   - Interestingly, in the third snippet, it appears to be the call to 
`consumer.close` that triggers the bug. If that call is omitted, it works (even 
if the consumer is used to receive messages).
   - Below are the stacktraces (the result of `bt all` in `lldb`, the 
equivalent of GDB's `thread apply all bt`) from the hung program in the snippet 
in repro step 3:
   ```
   * thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
     * frame #0: 0x00007fff203e29ee libsystem_kernel.dylib`__ulock_wait + 10
       frame #1: 0x00007fff20417f60 libsystem_pthread.dylib`_pthread_join + 362
       frame #2: 0x00007fff203b6846 libc++.1.dylib`std::__1::thread::join() + 24
       frame #3: 0x000000010e6f46b7 
_pulsar.cpython-39-darwin.so`pulsar::ExecutorServiceProvider::close() + 55
       frame #4: 0x000000010e6ae4bc 
_pulsar.cpython-39-darwin.so`pulsar::ClientImpl::shutdown() + 348
       frame #5: 0x000000010e6ae092 
_pulsar.cpython-39-darwin.so`pulsar::ClientImpl::~ClientImpl() + 18
       frame #6: 0x000000010e611b6c 
_pulsar.cpython-39-darwin.so`boost::python::objects::value_holder<pulsar::Client>::~value_holder()
 + 60
       frame #7: 0x000000010e7fe404 
_pulsar.cpython-39-darwin.so`boost::python::objects::instance_dealloc(_object*) 
+ 52
       frame #8: 0x000000010dffae61 Python`subtype_dealloc + 453
       frame #9: 0x000000010dfcbf10 Python`dict_dealloc + 592
       frame #10: 0x000000010dffaefd Python`subtype_dealloc + 609
       frame #11: 0x000000010e081bfc Python`_PyEval_EvalFrameDefault + 6781
       frame #12: 0x000000010e07f0e4 Python`_PyEval_EvalCode + 406
       frame #13: 0x000000010e0da0cd Python`run_eval_code_obj + 128
       frame #14: 0x000000010e0da01b Python`run_mod + 96
       frame #15: 0x000000010e0d7a8b Python`pyrun_file + 173
       frame #16: 0x000000010e0d7496 Python`pyrun_simple_file + 276
       frame #17: 0x000000010e0d735c Python`PyRun_SimpleFileExFlags + 67
       frame #18: 0x000000010e0f7211 Python`pymain_run_file + 327
       frame #19: 0x000000010e0f6aa0 Python`Py_RunMain + 1030
       frame #20: 0x000000010e0f7b10 Python`pymain_main + 35
       frame #21: 0x000000010e0f7de6 Python`Py_BytesMain + 42
       frame #22: 0x00007fff20431f3d libdyld.dylib`start + 1
       frame #23: 0x00007fff20431f3d libdyld.dylib`start + 1
     thread #2
       frame #0: 0x00007fff203e3cde libsystem_kernel.dylib`__psynch_cvwait + 10
       frame #1: 0x00007fff20416e49 libsystem_pthread.dylib`_pthread_cond_wait 
+ 1298
       frame #2: 0x000000010e07e08c Python`take_gil + 588
       frame #3: 0x000000010e0d6806 Python`PyGILState_Ensure + 48
       frame #4: 0x000000010e6015ec 
_pulsar.cpython-39-darwin.so`LoggerWrapper::log(pulsar::Logger::Level, int, 
std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char> > const&) + 28
       frame #5: 0x000000010e759a76 
_pulsar.cpython-39-darwin.so`pulsar::ProducerImpl::printStats() + 774
       frame #6: 0x000000010e758f37 
_pulsar.cpython-39-darwin.so`pulsar::ProducerImpl::~ProducerImpl() + 87
       frame #7: 0x000000010e7670d4 
_pulsar.cpython-39-darwin.so`boost::asio::detail::wait_handler<std::__1::__bind<void
 (pulsar::ProducerImpl::*)(boost::system::error_code const&), 
std::__1::shared_ptr<pulsar::ProducerImpl>, std::__1::placeholders::__ph<1> 
const&>, boost::asio::any_io_executor>::do_complete(void*, 
boost::asio::detail::scheduler_operation*, boost::system::error_code const&, 
unsigned long) + 292
       frame #8: 0x000000010e688e69 
_pulsar.cpython-39-darwin.so`boost::asio::detail::scheduler::do_run_one(boost::asio::detail::conditionally_enabled_mutex::scoped_lock&,
 boost::asio::detail::scheduler_thread_info&, boost::system::error_code const&) 
+ 841
       frame #9: 0x000000010e688841 
_pulsar.cpython-39-darwin.so`boost::asio::detail::scheduler::run(boost::system::error_code&)
 + 273
       frame #10: 0x000000010e6f3ece 
_pulsar.cpython-39-darwin.so`pulsar::ExecutorService::startWorker(std::__1::shared_ptr<boost::asio::io_context>)
 + 62
       frame #11: 0x000000010e6f5e3f _pulsar.cpython-39-darwin.so`void* 
std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct,
 std::__1::default_delete<std::__1::__thread_struct> >, std::__1::__bind<void 
(pulsar::ExecutorService::*)(std::__1::shared_ptr<boost::asio::io_context>), 
pulsar::ExecutorService*, std::__1::shared_ptr<boost::asio::io_context>&> > 
>(void*) + 95
       frame #12: 0x00007fff204168fc libsystem_pthread.dylib`_pthread_start + 
224
       frame #13: 0x00007fff20412443 libsystem_pthread.dylib`thread_start + 15
     thread #3
       frame #0: 0x00007fff203e3cde libsystem_kernel.dylib`__psynch_cvwait + 10
       frame #1: 0x00007fff20416e49 libsystem_pthread.dylib`_pthread_cond_wait 
+ 1298
       frame #2: 0x000000010e688c83 
_pulsar.cpython-39-darwin.so`boost::asio::detail::scheduler::do_run_one(boost::asio::detail::conditionally_enabled_mutex::scoped_lock&,
 boost::asio::detail::scheduler_thread_info&, boost::system::error_code const&) 
+ 355
       frame #3: 0x000000010e688841 
_pulsar.cpython-39-darwin.so`boost::asio::detail::scheduler::run(boost::system::error_code&)
 + 273
       frame #4: 0x000000010e6886dc 
_pulsar.cpython-39-darwin.so`boost::asio::detail::posix_thread::func<boost::asio::detail::resolver_service_base::work_scheduler_runner>::run()
 + 60
       frame #5: 0x000000010e688670 
_pulsar.cpython-39-darwin.so`boost_asio_detail_posix_thread_function + 16
       frame #6: 0x00007fff204168fc libsystem_pthread.dylib`_pthread_start + 224
       frame #7: 0x00007fff20412443 libsystem_pthread.dylib`thread_start + 15
   ```


-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to