Skip to content

Commit

Permalink
dialog: set the end time stamp immediately after going into deleted s…
Browse files Browse the repository at this point in the history
…tate

- checks to see if time stamps are set when testing if dialogs lasted
  too long in intermediary states

(cherry picked from commit 74825c8)
  • Loading branch information
miconda committed Nov 10, 2017
1 parent c94fbc2 commit 0725f75
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 8 deletions.
9 changes: 4 additions & 5 deletions src/modules/dialog/dlg_handlers.c
Expand Up @@ -453,6 +453,10 @@ static void dlg_onreply(struct cell* t, int type, struct tmcb_params *param)
event = DLG_EVENT_RPL3xx;

next_state_dlg( dlg, event, &old_state, &new_state, &unref);
if(new_state==DLG_STATE_DELETED && old_state!=DLG_STATE_DELETED) {
/* set end time */
dlg->end_ts = (unsigned int)(time(0));
}
if(dlg_run_event_route(dlg, (rpl==FAKED_REPLY)?NULL:rpl, old_state,
new_state)<0) {
/* dialog is gone */
Expand Down Expand Up @@ -527,11 +531,6 @@ static void dlg_onreply(struct cell* t, int type, struct tmcb_params *param)
goto done;
}

if(new_state==DLG_STATE_DELETED && old_state!=DLG_STATE_DELETED) {
/* set end time */
dlg->end_ts = (unsigned int)(time(0));
}

if ( new_state==DLG_STATE_DELETED
&& (old_state==DLG_STATE_UNCONFIRMED
|| old_state==DLG_STATE_EARLY) ) {
Expand Down
9 changes: 6 additions & 3 deletions src/modules/dialog/dlg_hash.c
Expand Up @@ -229,21 +229,24 @@ int dlg_clean_run(ticks_t ti)
while (dlg) {
tdlg = dlg;
dlg = dlg->next;
if(tdlg->state==DLG_STATE_UNCONFIRMED && tdlg->init_ts<tm-300) {
if(tdlg->state==DLG_STATE_UNCONFIRMED && tdlg->init_ts>0
&& tdlg->init_ts<tm-300) {
/* dialog in early state older than 5min */
LM_NOTICE("dialog in early state is too old (%p ref %d)\n",
tdlg, tdlg->ref);
unlink_unsafe_dlg(&d_table->entries[i], tdlg);
destroy_dlg(tdlg);
}
if(tdlg->state==DLG_STATE_CONFIRMED_NA && tdlg->start_ts<tm-60) {
if(tdlg->state==DLG_STATE_CONFIRMED_NA && tdlg->start_ts>0
&& tdlg->start_ts<tm-60) {
if(update_dlg_timer(&tdlg->tl, 10)<0) {
LM_ERR("failed to update dialog lifetime in long non-ack state\n");
}
tdlg->lifetime = 10;
tdlg->dflags |= DLG_FLAG_CHANGED;
}
if(tdlg->state==DLG_STATE_DELETED && tdlg->end_ts<tm-300) {
if(tdlg->state==DLG_STATE_DELETED && tdlg->end_ts>0
&& tdlg->end_ts<tm-300) {
/* dialog in deleted state older than 5min */
LM_NOTICE("dialog in delete state is too old (%p ref %d)\n",
tdlg, tdlg->ref);
Expand Down

0 comments on commit 0725f75

Please sign in to comment.