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

Closes #1067. Thanks to xingchen02.

Bug: https://github.com/eclipse/mosquitto/issues/1067
This commit is contained in:
Roger A. Light 2018-12-06 10:45:57 +00:00
parent ead440e47d
commit 73c46174f8
4 changed files with 10 additions and 30 deletions

View File

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

View File

@ -292,31 +292,7 @@ int mosquitto_loop_misc(struct mosquitto *mosq)
if(!mosq) return MOSQ_ERR_INVAL;
if(mosq->sock == INVALID_SOCKET) return MOSQ_ERR_NO_CONN;
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;
return mosquitto__check_keepalive(mosq);
}

View File

@ -46,9 +46,9 @@ Contributors:
#endif
#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
void mosquitto__check_keepalive(struct mosquitto *mosq)
int mosquitto__check_keepalive(struct mosquitto *mosq)
#endif
{
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);
net__socket_close(db, mosq);
return;
return MOSQ_ERR_SUCCESS;
}
#endif
pthread_mutex_lock(&mosq->msgtime_mutex);
@ -108,9 +108,12 @@ void mosquitto__check_keepalive(struct mosquitto *mosq)
mosq->in_callback = false;
}
pthread_mutex_unlock(&mosq->callback_mutex);
return rc;
#endif
}
}
return MOSQ_ERR_SUCCESS;
}
uint16_t mosquitto__mid_generate(struct mosquitto *mosq)

View File

@ -26,9 +26,9 @@ Contributors:
#endif
#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
void mosquitto__check_keepalive(struct mosquitto *mosq);
int mosquitto__check_keepalive(struct mosquitto *mosq);
#endif
uint16_t mosquitto__mid_generate(struct mosquitto *mosq);
FILE *mosquitto__fopen(const char *path, const char *mode, bool restrict_read);