related to https://github.com/kamailio/kamailio/commit/be46742ebe162a2c48ee5ce27e09497b...
the below patch solves it, but i'm not sure of the implications why not let the expire routine do its job instead of checking expiration when adding a value ? also moved the `ht_handle_expired_record` after the record is removed
``` diff --git a/src/modules/htable/ht_api.c b/src/modules/htable/ht_api.c index 1bbd079..92a9421 100644 --- a/src/modules/htable/ht_api.c +++ b/src/modules/htable/ht_api.c @@ -674,29 +674,29 @@ && strncmp(name->s, it->name.s, name->len)==0) { /* found */ - if(now>0 && it->expire!=0 && it->expire<now) { - /* entry has expired */ - ht_handle_expired_record(ht, it); - - if(ht->flags==PV_VAL_INT) { - /* initval is integer, use it to create a fresh entry */ - it->flags &= ~AVP_VAL_STR; - it->value.n = ht->initval.n; - /* increment will be done below */ - } else { - /* delete expired entry */ - if(it->prev==NULL) - ht->entries[idx].first = it->next; - else - it->prev->next = it->next; - if(it->next) - it->next->prev = it->prev; - ht->entries[idx].esize--; - if(mode) ht_slot_unlock(ht, idx); - ht_cell_free(it); - return NULL; - } - } +// if(now>0 && it->expire!=0 && it->expire<now) { +// /* entry has expired */ +// ht_handle_expired_record(ht, it); +// +// if(ht->flags==PV_VAL_INT) { +// /* initval is integer, use it to create a fresh entry */ +// it->flags &= ~AVP_VAL_STR; +// it->value.n = ht->initval.n; +// /* increment will be done below */ +// } else { +// /* delete expired entry */ +// if(it->prev==NULL) +// ht->entries[idx].first = it->next; +// else +// it->prev->next = it->next; +// if(it->next) +// it->next->prev = it->prev; +// ht->entries[idx].esize--; +// if(mode) ht_slot_unlock(ht, idx); +// ht_cell_free(it); +// return NULL; +// } +// } /* update value */ if(it->flags&AVP_VAL_STR) { @@ -803,21 +803,21 @@ && strncmp(name->s, it->name.s, name->len)==0) { /* found */ - if(ht->htexpire>0 && it->expire!=0 && it->expire<time(NULL)) { - /* entry has expired, delete it and return NULL */ - ht_handle_expired_record(ht, it); - - if(it->prev==NULL) - ht->entries[idx].first = it->next; - else - it->prev->next = it->next; - if(it->next) - it->next->prev = it->prev; - ht->entries[idx].esize--; - ht_slot_unlock(ht, idx); - ht_cell_free(it); - return NULL; - } +// if(ht->htexpire>0 && it->expire!=0 && it->expire<time(NULL)) { +// /* entry has expired, delete it and return NULL */ +// ht_handle_expired_record(ht, it); +// +// if(it->prev==NULL) +// ht->entries[idx].first = it->next; +// else +// it->prev->next = it->next; +// if(it->next) +// it->next->prev = it->prev; +// ht->entries[idx].esize--; +// ht_slot_unlock(ht, idx); +// ht_cell_free(it); +// return NULL; +// } if(old!=NULL) { if(old->msize>=it->msize) @@ -1056,7 +1056,6 @@ if(it->expire!=0 && it->expire<now) { /* expired */ - ht_handle_expired_record(ht, it); if(it->prev==NULL) ht->entries[i].first = it->next; else @@ -1064,6 +1063,7 @@ if(it->next) it->next->prev = it->prev; ht->entries[i].esize--; + ht_handle_expired_record(ht, it); ht_cell_free(it); } it = it0; ```