Skip to content

Commit

Permalink
Merge pull request #2144 from abiliojr/fix_duplicates_on_connect
Browse files Browse the repository at this point in the history
fix duplication of messages during connect
  • Loading branch information
ralight committed Mar 22, 2021
2 parents a5d9986 + 91f34e0 commit 1c6571a
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 12 deletions.
2 changes: 2 additions & 0 deletions ChangeLog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1787,6 +1787,8 @@ Client library:
- Add support for MQTT v3.1.1.
- Don't quit mosquitto_loop_forever() if broker not available on first
connect. Closes bug #453293, but requires more work.
- Don't reset queued messages state on CONNACK. Fixes bug with duplicate
messages on connection.


1.3.5 - 20141008
Expand Down
2 changes: 1 addition & 1 deletion lib/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ static int mosquitto__reconnect(struct mosquitto *mosq, bool blocking)

packet__cleanup_all(mosq);

message__reconnect_reset(mosq);
message__reconnect_reset(mosq, false);

if(mosq->sock != INVALID_SOCKET){
net__socket_close(mosq); //close socket
Expand Down
2 changes: 1 addition & 1 deletion lib/handle_connack.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ int handle__connack(struct mosquitto *mosq)
mosquitto_property_read_int32(properties, MQTT_PROP_MAXIMUM_PACKET_SIZE, &mosq->maximum_packet_size, false);

mosq->msgs_out.inflight_quota = mosq->msgs_out.inflight_maximum;
message__reconnect_reset(mosq);
message__reconnect_reset(mosq, true);

connack_callback(mosq, reason_code, connect_flags, properties);
mosquitto_property_free_all(&properties);
Expand Down
20 changes: 11 additions & 9 deletions lib/messages_mosq.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ int message__queue(struct mosquitto *mosq, struct mosquitto_message_all *message
return message__release_to_inflight(mosq, dir);
}

void message__reconnect_reset(struct mosquitto *mosq)
void message__reconnect_reset(struct mosquitto *mosq, bool update_quota_only)
{
struct mosquitto_message_all *message, *tmp;
assert(mosq);
Expand Down Expand Up @@ -169,15 +169,17 @@ void message__reconnect_reset(struct mosquitto *mosq)
message->timestamp = 0;
if(mosq->msgs_out.inflight_quota != 0){
util__decrement_send_quota(mosq);
if(message->msg.qos == 1){
message->state = mosq_ms_publish_qos1;
}else if(message->msg.qos == 2){
if(message->state == mosq_ms_wait_for_pubrec){
message->state = mosq_ms_publish_qos2;
}else if(message->state == mosq_ms_wait_for_pubcomp){
message->state = mosq_ms_resend_pubrel;
if (update_quota_only == false){
if(message->msg.qos == 1){
message->state = mosq_ms_publish_qos1;
}else if(message->msg.qos == 2){
if(message->state == mosq_ms_wait_for_pubrec){
message->state = mosq_ms_publish_qos2;
}else if(message->state == mosq_ms_wait_for_pubcomp){
message->state = mosq_ms_resend_pubrel;
}
/* Should be able to preserve state. */
}
/* Should be able to preserve state. */
}
}else{
message->state = mosq_ms_invalid;
Expand Down
2 changes: 1 addition & 1 deletion lib/messages_mosq.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ void message__cleanup_all(struct mosquitto *mosq);
void message__cleanup(struct mosquitto_message_all **message);
int message__delete(struct mosquitto *mosq, uint16_t mid, enum mosquitto_msg_direction dir, int qos);
int message__queue(struct mosquitto *mosq, struct mosquitto_message_all *message, enum mosquitto_msg_direction dir);
void message__reconnect_reset(struct mosquitto *mosq);
void message__reconnect_reset(struct mosquitto *mosq, bool update_quota_only);
int message__release_to_inflight(struct mosquitto *mosq, enum mosquitto_msg_direction dir);
int message__remove(struct mosquitto *mosq, uint16_t mid, enum mosquitto_msg_direction dir, struct mosquitto_message_all **message, int qos);
void message__retry_check(struct mosquitto *mosq);
Expand Down

0 comments on commit 1c6571a

Please sign in to comment.