On 2012-01-31 at 14:15, Øyvind Kolbu wrote:
On 2012-01-31 at 14:06, Timo Reimann wrote:
I'm currently in the process of investigating a dialog-related issue together with Uri (see CC). It may be related to your problem, so let's see if I can find something out that helps you as well. If not, I/we should take a dedicated look at your case.
Unfortunately, I'm currently short on time so I cannot give any guarantees as to when I'll find the time to get to these dialog-related things. I promise to get back to you folks ASAP though, so please hang on.
Great! We are currently running with full debugging enabled, so don't hesitate to contact if you need some data.
Hi,
we've found that perhaps the cause of our problems are multiple identical INVITEs at more or less the exact same time, +/- a few ms. This causes a race within either the tm or dialog module, as it doesn't seem to cope well with duplicates ~simultanously. Our fix is that we use the lock and unlock commands from the cfgutils module together with a hashtable to check for duplicates, and if so, drop them.
So our patch is more or less:
modparam("htable", "htable", "cidhist=>size=8;autoexpire=10"); modparam("cfgutils", "lock_set_size", 8)
$avp(s:f_uid) is the username for our authenticated user and is set in route(AUTH), then in main route, after route(AUTH):
if (is_method("INVITE")) { if($(rU{s.len}) == 0) { xlog("L_INFO", "$avp(s:f_uid) tried to call an empty number, dropping call\n"); sl_send_reply("404", "User Not Found"); exit; } lock($ci); if($sht(cidhist=>$ci) != $null) { xlog("L_INFO", "DLG: We've already seen this call-id before, we should drop this invite $ci\n"); unlock($ci); exit; } else { xlog("L_INFO", "DLG: This is a new invite, let's start a dialog! $ci\n"); $sht(cidhist=>$ci) = 1; setflag(3); dlg_manage();
if ($avp(s:f_uid) != $null) { set_dlg_profile("busy","$avp(s:f_uid)"); get_profile_size("busy", "$avp(s:f_uid)", "$var(dlg_busy)"); xlog("L_INFO", "BUSY: f_uid: $avp(s:f_uid), dlg_busy: $var(dlg_busy)\n"); } } unlock($ci); }
Worth mentioning is that we also get REGISTER messages stuck in the dialog-module, in state 1, but we only do setflag(3) and dlg_manage() for INVITE. Againt probably caused by identical REGISTER messages. Any idea of why?