Hi, I use the Munin plugin I did in various servers running Kamailio 1.5 (Debian 64 bits). The munin plugins performs the Mi command:
kamctl fifo get_statistics inuse_transactions
In one of them the installed revision is 5834 and the plugin works perfectly, no errors in 3 months with high traffic.
However in the other server (revision 5925) there are no traffic yet but the plugin fails sometimes (maybe once each 2-3 days). Sometimes it gets an error: ERROR:mi_fifo:mi_fifo_server: fifo command must begin with :: early_dialogs
and sometimes it gets wrong value: kamctl fifo get_statistics inuse_transactions => 2819624 (with no traffic !!!)
In the second case the Munin grapsh gets corrupted due to so high value.
Could it be a bug in dialog module? Should I upgrade to revision 5939 in which I see a change for modules/dialog/dlg_handlers.c:
------------------------------------------------------------------------------------------------------------------------- ~# svn diff -r HEAD modules/dialog/dlg_handlers.c
Index: modules/dialog/dlg_handlers.c =================================================================== --- modules/dialog/dlg_handlers.c (revisión: 5939) +++ modules/dialog/dlg_handlers.c (copia de trabajo) @@ -824,14 +824,13 @@
if(dlg->toroute>0 && dlg->toroute<RT_NO) { + dlg_set_ctx_dialog(dlg); fmsg = faked_msg_next(); if (exec_pre_req_cb(fmsg)>0) { - dlg_set_ctx_dialog(dlg); LM_DBG("executing route %d on timeout\n", dlg->toroute); set_route_type(REQUEST_ROUTE); run_top_route(rlist[dlg->toroute], fmsg); - dlg_set_ctx_dialog(0); exec_post_req_cb(fmsg); } } ------------------------------------------------------------------------------------------------------------------------
I see some differences between the dialog module versions running in both servers, but I think the main difference is a bug fix for the case in which there is empty Record-Route in the response (Kamailio crashed before the fix):
----------------------------------------------------------------------------------------------------------------------- # svn diff -r 5834:5925 modules/dialog/dlg_handlers.c Index: modules/dialog/dlg_handlers.c =================================================================== --- modules/dialog/dlg_handlers.c (revisión: 5834) +++ modules/dialog/dlg_handlers.c (revisión: 5925) @@ -163,10 +163,10 @@ int populate_leg_info( struct dlg_cell *dlg, struct sip_msg *msg, struct cell* t, unsigned int leg, str *tag) { - unsigned int skip_recs; - str cseq; - str contact; - str rr_set; + unsigned int skip_recs = 0; + str cseq = {0, 0}; + str contact = {0, 0}; + str rr_set = {0, 0};
/* extract the cseq number as string */ if (leg==DLG_CALLER_LEG) { @@ -184,48 +184,41 @@ /* extract the contact address */ if (!msg->contact&&(parse_headers(msg,HDR_CONTACT_F,0)<0||!msg->contact)){ LM_ERR("bad sip message or missing Contact hdr\n"); - goto error0; + } else { + if ( parse_contact(msg->contact)<0 || + ((contact_body_t *)msg->contact->parsed)->contacts==NULL || + ((contact_body_t *)msg->contact->parsed)->contacts->next!=NULL ) { + LM_ERR("bad Contact HDR\n"); + } else { + contact = ((contact_body_t *)msg->contact->parsed)->contacts->uri; + } } - if ( parse_contact(msg->contact)<0 || - ((contact_body_t *)msg->contact->parsed)->contacts==NULL || - ((contact_body_t *)msg->contact->parsed)->contacts->next!=NULL ) { - LM_ERR("bad Contact HDR\n"); - goto error0; - } - contact = ((contact_body_t *)msg->contact->parsed)->contacts->uri; - /* extract the RR parts */ if(!msg->record_route && (parse_headers(msg,HDR_RECORDROUTE_F,0)<0) ){ LM_ERR("failed to parse record route header\n"); - goto error0; - } - - if (leg==DLG_CALLER_LEG) { - skip_recs = 0; } else { - /* was the 200 OK received or local generated */ - skip_recs = dlg->from_rr_nb + - ((t->relaied_reply_branch>=0)? - (t->uac[t->relaied_reply_branch].added_rr):0); - } + if (leg==DLG_CALLEE_LEG) { + /* was the 200 OK received or local generated */ + skip_recs = dlg->from_rr_nb + + ((t->relaied_reply_branch>=0)? + (t->uac[t->relaied_reply_branch].added_rr):0); + }
- if(msg->record_route){ - if( print_rr_body(msg->record_route, &rr_set, leg, - &skip_recs) != 0 ){ - LM_ERR("failed to print route records \n"); - goto error0; + if(msg->record_route){ + if( print_rr_body(msg->record_route, &rr_set, leg, + &skip_recs) != 0 ){ + LM_ERR("failed to print route records \n"); + } } - } else { - rr_set.s = 0; - rr_set.len = 0; }
if(leg==DLG_CALLER_LEG) dlg->from_rr_nb = skip_recs;
LM_DBG("route_set %.*s, contact %.*s, cseq %.*s and bind_addr %.*s\n", - rr_set.len, rr_set.s, contact.len, contact.s, - cseq.len, cseq.s, + rr_set.len, (rr_set.len)?rr_set.s:"", + contact.len, (contact.len)?contact.s:"", + cseq.len, (cseq.len)?cseq.s:"", msg->rcv.bind_address->sock_str.len, msg->rcv.bind_address->sock_str.s); -----------------------------------------------------------------------------------------------------------------------
Perhaps a regression in rev 5925 so I should upgrade? Thanks.