Commit bbfaa0f8b285117af067929ee8bf08397df974c8
Merge branch 'feat/sridder/deferred_connection' into 'development'
deferred_connection promise is not working because it is reset to null in the connectFailure callback. removing the set_value() from the connectFailure callback fixed the issue of subscription after promise. Test:<br> start mosquitto broker and the publisher test on a remote desktop.<br> disable the internet connection on the subscribing desktop.<br> start the subscriber test on the subscribing desktop.<br><br> <i> at this point, the mqtt client keeps returning to the connectFailure callback </i><br><br> enable the internet connection again.<br><br> <i> at this point, the mqtt client returns to the connectSuccess callback. subscriptions are activated and data is coming in.</i> See merge request !10
Showing
1 changed file
with
21 additions
and
20 deletions
src/clientpaho.cpp
| @@ -186,11 +186,11 @@ std::int32_t ClientPaho::connect( bool wait, const mqtt_LWT &lwt ) | @@ -186,11 +186,11 @@ std::int32_t ClientPaho::connect( bool wait, const mqtt_LWT &lwt ) | ||
| 186 | { | 186 | { |
| 187 | { | 187 | { |
| 188 | OSDEV_COMPONENTS_LOCKGUARD(m_mutex); | 188 | OSDEV_COMPONENTS_LOCKGUARD(m_mutex); |
| 189 | - if (ConnectionStatus::Disconnected != m_connectionStatus) | 189 | + if( ConnectionStatus::Disconnected != m_connectionStatus ) |
| 190 | { | 190 | { |
| 191 | return -1; | 191 | return -1; |
| 192 | } | 192 | } |
| 193 | - setConnectionStatus(ConnectionStatus::ConnectInProgress); | 193 | + setConnectionStatus( ConnectionStatus::ConnectInProgress ); |
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer; | 196 | MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer; |
| @@ -215,12 +215,12 @@ std::int32_t ClientPaho::connect( bool wait, const mqtt_LWT &lwt ) | @@ -215,12 +215,12 @@ std::int32_t ClientPaho::connect( bool wait, const mqtt_LWT &lwt ) | ||
| 215 | } | 215 | } |
| 216 | 216 | ||
| 217 | 217 | ||
| 218 | - if (!m_username.empty()) | 218 | + if( !m_username.empty() ) |
| 219 | { | 219 | { |
| 220 | conn_opts.username = m_username.c_str(); | 220 | conn_opts.username = m_username.c_str(); |
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | - if (!m_password.empty()) | 223 | + if( !m_password.empty() ) |
| 224 | { | 224 | { |
| 225 | conn_opts.password = m_password.c_str(); | 225 | conn_opts.password = m_password.c_str(); |
| 226 | } | 226 | } |
| @@ -228,30 +228,30 @@ std::int32_t ClientPaho::connect( bool wait, const mqtt_LWT &lwt ) | @@ -228,30 +228,30 @@ std::int32_t ClientPaho::connect( bool wait, const mqtt_LWT &lwt ) | ||
| 228 | std::promise<void> waitForConnectPromise{}; | 228 | std::promise<void> waitForConnectPromise{}; |
| 229 | auto waitForConnect = waitForConnectPromise.get_future(); | 229 | auto waitForConnect = waitForConnectPromise.get_future(); |
| 230 | m_connectPromise.reset(); | 230 | m_connectPromise.reset(); |
| 231 | - if (wait) | 231 | + if( wait ) |
| 232 | { | 232 | { |
| 233 | - m_connectPromise = std::make_unique<std::promise<void>>(std::move(waitForConnectPromise)); | 233 | + m_connectPromise = std::make_unique<std::promise<void>>( std::move( waitForConnectPromise ) ); |
| 234 | } | 234 | } |
| 235 | 235 | ||
| 236 | { | 236 | { |
| 237 | - OSDEV_COMPONENTS_LOCKGUARD(m_mutex); | ||
| 238 | - if (!m_pendingOperations.insert(-100).second) | 237 | + OSDEV_COMPONENTS_LOCKGUARD( m_mutex ); |
| 238 | + if( !m_pendingOperations.insert( -100 ).second ) | ||
| 239 | { | 239 | { |
| 240 | // Write something | 240 | // Write something |
| 241 | } | 241 | } |
| 242 | - m_operationResult.erase(-100); | 242 | + m_operationResult.erase( -100 ); |
| 243 | } | 243 | } |
| 244 | 244 | ||
| 245 | - int rc = MQTTAsync_connect(m_client, &conn_opts); | ||
| 246 | - if (MQTTASYNC_SUCCESS != rc) | 245 | + int rc = MQTTAsync_connect( m_client, &conn_opts ); |
| 246 | + if( MQTTASYNC_SUCCESS != rc ) | ||
| 247 | { | 247 | { |
| 248 | - setConnectionStatus(ConnectionStatus::Disconnected); | ||
| 249 | - OSDEV_COMPONENTS_LOCKGUARD(m_mutex); | 248 | + setConnectionStatus( ConnectionStatus::Disconnected ); |
| 249 | + OSDEV_COMPONENTS_LOCKGUARD( m_mutex ); | ||
| 250 | m_operationResult[-100] = false; | 250 | m_operationResult[-100] = false; |
| 251 | m_pendingOperations.erase(-100); | 251 | m_pendingOperations.erase(-100); |
| 252 | } | 252 | } |
| 253 | 253 | ||
| 254 | - if (wait) | 254 | + if( wait ) |
| 255 | { | 255 | { |
| 256 | waitForConnect.get(); | 256 | waitForConnect.get(); |
| 257 | m_connectPromise.reset(); | 257 | m_connectPromise.reset(); |
| @@ -306,13 +306,15 @@ std::int32_t ClientPaho::disconnect(bool wait, int timeoutMs) | @@ -306,13 +306,15 @@ std::int32_t ClientPaho::disconnect(bool wait, int timeoutMs) | ||
| 306 | m_operationResult[-200] = false; | 306 | m_operationResult[-200] = false; |
| 307 | m_pendingOperations.erase(-200); | 307 | m_pendingOperations.erase(-200); |
| 308 | 308 | ||
| 309 | - if (MQTTASYNC_DISCONNECTED == rc) { | 309 | + if (MQTTASYNC_DISCONNECTED == rc) |
| 310 | + { | ||
| 310 | return -1; | 311 | return -1; |
| 311 | } | 312 | } |
| 312 | // ("ClientPaho", "%1 - failed to disconnect, return code %2", m_clientId, pahoAsyncErrorCodeToString(rc)); | 313 | // ("ClientPaho", "%1 - failed to disconnect, return code %2", m_clientId, pahoAsyncErrorCodeToString(rc)); |
| 313 | } | 314 | } |
| 314 | 315 | ||
| 315 | - if (wait) { | 316 | + if( wait ) |
| 317 | + { | ||
| 316 | if (std::future_status::timeout == waitForDisconnect.wait_for(std::chrono::milliseconds(timeoutMs + 100))) | 318 | if (std::future_status::timeout == waitForDisconnect.wait_for(std::chrono::milliseconds(timeoutMs + 100))) |
| 317 | { | 319 | { |
| 318 | // ("ClientPaho", "%1 - timeout occurred on disconnect", m_clientId); | 320 | // ("ClientPaho", "%1 - timeout occurred on disconnect", m_clientId); |
| @@ -334,6 +336,7 @@ std::int32_t ClientPaho::publish(const MqttMessage& message, int qos) | @@ -334,6 +336,7 @@ std::int32_t ClientPaho::publish(const MqttMessage& message, int qos) | ||
| 334 | else if (ConnectionStatus::Disconnected == m_connectionStatus) | 336 | else if (ConnectionStatus::Disconnected == m_connectionStatus) |
| 335 | { | 337 | { |
| 336 | // ("ClientPaho", "%1 - unable to publish, not connected", m_clientId); | 338 | // ("ClientPaho", "%1 - unable to publish, not connected", m_clientId); |
| 339 | + connect( true ); | ||
| 337 | } | 340 | } |
| 338 | 341 | ||
| 339 | if (!isValidTopic(message.topic())) | 342 | if (!isValidTopic(message.topic())) |
| @@ -368,7 +371,8 @@ void ClientPaho::publishPending() | @@ -368,7 +371,8 @@ void ClientPaho::publishPending() | ||
| 368 | { | 371 | { |
| 369 | { | 372 | { |
| 370 | OSDEV_COMPONENTS_LOCKGUARD(m_mutex); | 373 | OSDEV_COMPONENTS_LOCKGUARD(m_mutex); |
| 371 | - if (!m_processPendingPublishes) { | 374 | + if (!m_processPendingPublishes) |
| 375 | + { | ||
| 372 | return; | 376 | return; |
| 373 | } | 377 | } |
| 374 | } | 378 | } |
| @@ -785,9 +789,6 @@ void ClientPaho::onConnectFailureOnInstance(const MqttFailure& response) | @@ -785,9 +789,6 @@ void ClientPaho::onConnectFailureOnInstance(const MqttFailure& response) | ||
| 785 | // ("ClientPaho", "onConnectFailureOnInstance %1 - connection failed with code %2 (%3)", m_clientId, response.codeToString(), response.message()); | 789 | // ("ClientPaho", "onConnectFailureOnInstance %1 - connection failed with code %2 (%3)", m_clientId, response.codeToString(), response.message()); |
| 786 | { | 790 | { |
| 787 | OSDEV_COMPONENTS_LOCKGUARD(m_mutex); | 791 | OSDEV_COMPONENTS_LOCKGUARD(m_mutex); |
| 788 | - if (m_connectPromise) { | ||
| 789 | - m_connectPromise->set_value(); | ||
| 790 | - } | ||
| 791 | // ("ClientPaho", "onConnectFailureOnInstance %1 - pending operations : %2, removing operation -100", m_clientId, m_pendingOperations); | 792 | // ("ClientPaho", "onConnectFailureOnInstance %1 - pending operations : %2, removing operation -100", m_clientId, m_pendingOperations); |
| 792 | m_operationResult[-100] = false; | 793 | m_operationResult[-100] = false; |
| 793 | m_pendingOperations.erase(-100); | 794 | m_pendingOperations.erase(-100); |