[Kamailio-Users] Serious regressions in 1.5.0 dialog module - or just me?

Alex Balashov abalashov at evaristesys.com
Tue Apr 7 09:42:20 CEST 2009


Greetings,

I recently deployed 1.5.0 and was thrilled to have the opportunity to
use the new sqlops module for a purpose that required a lot of custom
database logic, but unfortunately had to roll back to 1.4.4 because a
lot of stuff seemed to be broken in the 'dialog' module.  I refuse to
believe that the 'dialog' module was released in such a broken state, so
I am thinking I am problem is that I am neglecting something very
important or that there are some omissions in the documentation.

System is CentOS 64-bit on a dual-CPU quad-core setup with 8 GB of RAM.

Two fundamental problems:

1) get_profile_size() on profiles with no "values" (i.e. inside the
enumerated "profiles_no_value" modparam) crashes.

This problem also exists on 1.4.4.  I have not tried other 1.4.x releases.

So, I have:

modparam("dialog", "enable_stats", 1)
modparam("dialog", "hash_size", 65536)
modparam("dialog", "rr_param", "dlgcor")
modparam("dialog", "dlg_flag", 2)
modparam("dialog", "default_timeout", 28800)
modparam("dialog", "dlg_match_mode", 1)
modparam("dialog", "db_mode", 0)
modparam("dialog", "profiles_no_value", "global")
modparam("dialog", "profiles_with_value", "user")

And then, in my INVITE handler for inbound routes:

         # Set dialog construction flag.

         setflag(2);

         # Add this dialog to the global call count profile.

         set_dlg_profile("global");

         # Add this dialog to a per-customer dialog profile.

         set_dlg_profile("user", "$avp(S:user_id)");


         # Put out some debugging values for global and customer profiles.

         get_profile_size("global", "$var(global_dialog_count)");

         get_profile_size("user", "$avp(S:user_id)", 
"$var(customer_dialog_count)");

The first get_profile_size() statement crashes--the one that refers to 
the profile without values.

According to the GDB backtrace, the crash occurs at 
modules/dialog/dialog.c:701:

         if(sp_dest->setf(msg, &sp_dest->pvp, (int)EQ_T, &val)<0)
         {
                 LM_ERR("setting profile PV failed\n");
                 return -1;
         }

The cause is that sp_dest is NULL here.  I have determined that the 
value of 'result' in w_get_profile_size() as passed into this prototype:

   static int w_get_profile_size(struct sip_msg *msg, char *profile, 
char *value, char *result)

is NULL.

I would conclude from this - not being a developer - that the root cause 
is that the config file/route script lexer does not properly distinguish 
between the value-less and with-value argument combination of 
get_profile_size() that can occur.

A workaround is possible by setting my 'global' profile to be "with 
values" as well and using a bogus value key like "1" that is always the 
same.  However, I do not think this should be happening.

2) The second problem only occurs in 1.5.0 and not in 1.4.  It is much 
more serious.

It would appear that the dialogs are not actually being inserted into 
the profiles - either the global or the per-user ones.  I can see from 
the debug logs that the dialogs are being tracked because I set the 
dialog construction flag (2).  I have also tried using dlg_manage(). 
However, get_profile_size(...) always returns 0 no matter what I do.

---

I find it hard to believe that the 'dialog' module in 1.5.0 was released 
with such regressions, and cannot find anything in the devel list 
archives or the tracker suggesting that this behaviour has been 
elsewhere.  My only conclusion is that either I am doing something wrong 
or that there is a problem with my environment.  Admittedly, I have not 
tried reproducing these issues in 32-bit library environment and perhaps 
should.

Please help!

-- Alex

-- 
Alex Balashov
Evariste Systems
Web    : http://www.evaristesys.com/
Tel    : (+1) (678) 954-0670
Direct : (+1) (678) 954-0671
Mobile : (+1) (678) 237-1775




More information about the Users mailing list