Open lizziemac opened 11 months ago
What version of the Paho C client are you using? Something that sounds just like this was recently fixed in the C v1.3.13 client.
Oh, actually, this may be different. What platform? What compiler/version?
I can’t say that the expected behavior would be exactly what you want. Perhaps the library might ignore an explicit request to reconnect if the automatic option is turned on? I’d have to look at the implementation.
But either way, it definitely should never hard crash.
As of this morning, I've reproduced it on two separate OS's, both on ARM platforms. If you want to reproduce, I just modified the multithr_pub_sub.cpp
example (attached with my changes) - multithr_pubsub.txt
MacOS (just tested this morning)
1.3.13
$ clang --version
Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: arm64-apple-darwin23.1.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
__pthread_kill + 8 frame #1: 0x000000018ba38cc0 libsystem_pthread.dylib
pthread_kill + 288
frame #2: 0x000000018b948a40 libsystem_c.dylibabort + 180 frame #3: 0x000000018b9f06d8 libc++abi.dylib
abort_message + 132
frame #4: 0x000000018b9e07ac libc++abi.dylibdemangling_terminate_handler() + 320 frame #5: 0x000000018b68b8a4 libobjc.A.dylib
_objc_terminate() + 160
frame #6: 0x000000018b9efa9c libc++abi.dylibstd::__terminate(void (*)()) + 16 frame #7: 0x000000018b9f2a48 libc++abi.dylib
cxxabiv1::failed_throw(cxxabiv1::cxa_exception*) + 36
frame #8: 0x000000018b9f29f4 libc++abi.dylib`cxa_throw + 140
frame #9: 0x00000001004c7e94 libpaho-mqttpp3.1.dylibmqtt::async_client::reconnect() + 324 frame #10: 0x0000000100004588 harbor.out
publisher_func(std::1::shared_ptrdecltype(static_cast<void (*>(fp)(static_cast<std::__1::shared_ptr<mqtt::async_client>>(fp0), static_cast<std::__1::shared_ptr<multithr_counter>>(fp0))) std::__1::__invoke<void (*)(std::__1::shared_ptr<mqtt::async_client>, std::__1::shared_ptr<multithr_counter>), std::__1::shared_ptr<mqtt::async_client>, std::__1::shared_ptr<multithr_counter> >(void (*&&)(std::__1::shared_ptr<mqtt::async_client>, std::__1::shared_ptr<multithr_counter>), std::__1::shared_ptr<mqtt::async_client>&&, std::__1::shared_ptr<multithr_counter>&&) + 84 frame #12: 0x000000010000e4a0 harbor.out
void std::1::thread_execute<std::1::unique_ptr<std::1::thread_struct, std::1::default_deletevoid* 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<mqtt::async_client>, std::__1::shared_ptr<multithr_counter>), std::__1::shared_ptr<mqtt::async_client>, std::__1::shared_ptr<multithr_counter> > >(void*) + 84 frame #14: 0x000000018ba39034 libsystem_pthread.dylib
_pthread_start + 136
Linux (initial PR) - Debian Bullseye
[bullseye (oldstable)](https://packages.debian.org/bullseye/clang) (devel): C, C++ and Objective-C compiler (LLVM based), clang binary
1:11.0-51+nmu5: amd64 arm64 armel armhf i386 mips64el mipsel ppc64el s390x
Awesome, thanks. I'll have a look. Probably over the weekend.
But in general, think what might work better for you - automatic or manual updates. It's not too tough to do it manually; many of the example apps demonstrate it. But the auto/backoff algorithm is usable in most situations.
Sounds good, thanks! I was having some issues with the connection_lost callback being called for manual (yet autoreconnect working) but I'll take another stab at it.
I haven't figured out if the C lib fires the "connection lost" callback if it gets a clean disconnect from the server (i.e. receives a DISCONNECT packet). At first I assumed it did, then I thought it didn't. Now I'm not sure. I'm currently trying to set up the test broker to figure it out and/or check the C code to confirm.
That means you may need to set an on_disconnect
handler via set_disconnected_handler()
to make sure you're always being informed when the connection is lost.
I'll confirm ASAP, since I need to resolve #458.
Thanks! I'll look into implementing that
Issue Description
When automatic reconnection is enabled in the MQTT client, manually calling
client.reconnect()
after a disconnect causes the application to crash. This issue occurs specifically when the client doesn't automatically reconnect after a manual disconnect. Disabling automatic reconnection prevents this crash.Steps to Reproduce
client.reconnect()
.Expected Behavior
The client should successfully reconnect without causing the application to crash, regardless of whether automatic reconnection is enabled or not.
Actual Behavior
The application crashes when
client.reconnect()
is called with automatic reconnection enabled. Backtrace from a modifiedmultithr_pub_sub.cpp
:Additional Context
I have a callback for when the network is disconnected, and then reconnected. If I don't force the MQTT client to disconnect, it will never update to think it is disconnected, and therefore never retry connecting. As a result, I want to make sure that I do reconnect. I was hoping to avoid re-instantiating all of my options again with a standard
client->connect()
but if that is the suggested/correct approach, I can do that.