Don't call on_disconnect() twice if keepalive tests fail.

Closes #1067. Thanks to xingchen02.

Bug: https://github.com/eclipse/mosquitto/issues/1067
pull/1077/head
Roger A. Light 7 years ago
parent ead440e47d
commit 73c46174f8

@ -17,6 +17,7 @@ Broker:
Library: Library:
- Fix reconnect delay backoff behaviour. Closes #1027. - Fix reconnect delay backoff behaviour. Closes #1027.
- Don't call on_disconnect() twice if keepalive tests fail. Closes #1067.
Client: Client:
- Always print leading zeros in mosquitto_sub when output format is hex. - Always print leading zeros in mosquitto_sub when output format is hex.

@ -292,31 +292,7 @@ int mosquitto_loop_misc(struct mosquitto *mosq)
if(!mosq) return MOSQ_ERR_INVAL; if(!mosq) return MOSQ_ERR_INVAL;
if(mosq->sock == INVALID_SOCKET) return MOSQ_ERR_NO_CONN; if(mosq->sock == INVALID_SOCKET) return MOSQ_ERR_NO_CONN;
mosquitto__check_keepalive(mosq); return mosquitto__check_keepalive(mosq);
now = mosquitto_time();
if(mosq->ping_t && now - mosq->ping_t >= mosq->keepalive){
/* mosq->ping_t != 0 means we are waiting for a pingresp.
* This hasn't happened in the keepalive time so we should disconnect.
*/
net__socket_close(mosq);
pthread_mutex_lock(&mosq->state_mutex);
if(mosq->state == mosq_cs_disconnecting){
rc = MOSQ_ERR_SUCCESS;
}else{
rc = MOSQ_ERR_KEEPALIVE;
}
pthread_mutex_unlock(&mosq->state_mutex);
pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_disconnect){
mosq->in_callback = true;
mosq->on_disconnect(mosq, mosq->userdata, rc);
mosq->in_callback = false;
}
pthread_mutex_unlock(&mosq->callback_mutex);
return MOSQ_ERR_CONN_LOST;
}
return MOSQ_ERR_SUCCESS;
} }

@ -46,9 +46,9 @@ Contributors:
#endif #endif
#ifdef WITH_BROKER #ifdef WITH_BROKER
void mosquitto__check_keepalive(struct mosquitto_db *db, struct mosquitto *mosq) int mosquitto__check_keepalive(struct mosquitto_db *db, struct mosquitto *mosq)
#else #else
void mosquitto__check_keepalive(struct mosquitto *mosq) int mosquitto__check_keepalive(struct mosquitto *mosq)
#endif #endif
{ {
time_t next_msg_out; time_t next_msg_out;
@ -67,7 +67,7 @@ void mosquitto__check_keepalive(struct mosquitto *mosq)
log__printf(NULL, MOSQ_LOG_NOTICE, "Bridge connection %s has exceeded idle timeout, disconnecting.", mosq->id); log__printf(NULL, MOSQ_LOG_NOTICE, "Bridge connection %s has exceeded idle timeout, disconnecting.", mosq->id);
net__socket_close(db, mosq); net__socket_close(db, mosq);
return; return MOSQ_ERR_SUCCESS;
} }
#endif #endif
pthread_mutex_lock(&mosq->msgtime_mutex); pthread_mutex_lock(&mosq->msgtime_mutex);
@ -108,9 +108,12 @@ void mosquitto__check_keepalive(struct mosquitto *mosq)
mosq->in_callback = false; mosq->in_callback = false;
} }
pthread_mutex_unlock(&mosq->callback_mutex); pthread_mutex_unlock(&mosq->callback_mutex);
return rc;
#endif #endif
} }
} }
return MOSQ_ERR_SUCCESS;
} }
uint16_t mosquitto__mid_generate(struct mosquitto *mosq) uint16_t mosquitto__mid_generate(struct mosquitto *mosq)

@ -26,9 +26,9 @@ Contributors:
#endif #endif
#ifdef WITH_BROKER #ifdef WITH_BROKER
void mosquitto__check_keepalive(struct mosquitto_db *db, struct mosquitto *mosq); int mosquitto__check_keepalive(struct mosquitto_db *db, struct mosquitto *mosq);
#else #else
void mosquitto__check_keepalive(struct mosquitto *mosq); int mosquitto__check_keepalive(struct mosquitto *mosq);
#endif #endif
uint16_t mosquitto__mid_generate(struct mosquitto *mosq); uint16_t mosquitto__mid_generate(struct mosquitto *mosq);
FILE *mosquitto__fopen(const char *path, const char *mode, bool restrict_read); FILE *mosquitto__fopen(const char *path, const char *mode, bool restrict_read);

Loading…
Cancel
Save