diff --git a/ChangeLog.txt b/ChangeLog.txt index 3b1ef0d7..e97add17 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1,3 +1,11 @@ +1.6.16 - 2022-xx-xx +=================== + +Broker: +- Add clients to session expiry check list when restarting and reloading from + persistence. Closes #2546. + + 1.6.15 - 2021-06-08 =================== diff --git a/src/mosquitto_broker_internal.h b/src/mosquitto_broker_internal.h index ba42bafa..6e9165c8 100644 --- a/src/mosquitto_broker_internal.h +++ b/src/mosquitto_broker_internal.h @@ -713,6 +713,7 @@ int mosquitto_security_auth_continue(struct mosquitto_db *db, struct mosquitto * * Session expiry * ============================================================ */ int session_expiry__add(struct mosquitto_db *db, struct mosquitto *context); +int session_expiry__add_from_persistence(struct mosquitto_db *db, struct mosquitto *context, time_t expiry_time); void session_expiry__remove(struct mosquitto *context); void session_expiry__remove_all(struct mosquitto_db *db); void session_expiry__check(struct mosquitto_db *db, time_t now); diff --git a/src/persist_read.c b/src/persist_read.c index 0bd55112..377c090f 100644 --- a/src/persist_read.c +++ b/src/persist_read.c @@ -209,7 +209,7 @@ static int persist__client_chunk_restore(struct mosquitto_db *db, FILE *db_fptr) } } } - /* FIXME - we should expire clients here if they have exceeded their time */ + session_expiry__add_from_persistence(db, context, chunk.F.session_expiry_time); }else{ rc = 1; } diff --git a/src/session_expiry.c b/src/session_expiry.c index 462cdab1..1c579ff3 100644 --- a/src/session_expiry.c +++ b/src/session_expiry.c @@ -80,6 +80,24 @@ int session_expiry__add(struct mosquitto_db *db, struct mosquitto *context) } +int session_expiry__add_from_persistence(struct mosquitto_db *db, struct mosquitto *context, time_t expiry_time) +{ + struct session_expiry_list *item; + + item = mosquitto__calloc(1, sizeof(struct session_expiry_list)); + if(!item) return MOSQ_ERR_NOMEM; + + item->context = context; + item->context->session_expiry_time = expiry_time; + + context->expiry_list_item = item; + + DL_INSERT_INORDER(expiry_list, item, session_expiry__cmp); + + return MOSQ_ERR_SUCCESS; +} + + void session_expiry__remove(struct mosquitto *context) { if(context->expiry_list_item){