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:
parent
ead440e47d
commit
73c46174f8
@ -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.
|
||||
|
26
lib/loop.c
26
lib/loop.c
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user