[sr-dev] [SR-Users] No memory left in send_subscribe (PUA) from update_pua while building the tm dlg_t structure

Daniel-Constantin Mierla miconda at gmail.com
Wed Jan 4 11:21:57 CET 2012


Hello,


On 1/2/12 12:07 PM, Daniel-Constantin Mierla wrote:
> Hello,
>
> On 12/29/11 7:06 PM, laura testi wrote:
>> Hi Daniel,
>> yes we are running 3.1.5, but we have back ported the whole pua module
>> from the master branch that included also the patches in your link. In
>> fact, the second patch use the patches from the link you have
>> mentioned to solve the same problem. Because the patches themselves
>> from the link  
>> (http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commitdiff;h=b93149c756d3e983c70608938f1142ed43ee1834)
>> are not enough for the PUA_XMPP module.
> ok, checking for side effects was the reason not to go ahead with the 
> patch immediately. I was looking and the is_dialog function seems to 
> be used just by other modules, not by pua itself: pua_bla, pua_xmpp 
> and purple. I think it is safe to go ahead with it, maybe in a 
> different form, like returning different values when it is established 
> or temporary dialog, eventually with an extra parameter to specify 
> which kind of dialogs should be searched -- this needs a bit of 
> analyze to choose the best.
I committed to master branch a patch for is_dialog() function to return 
0 when it is an established dialog (like it was so far) and 1 if it is a 
temporary dialog. All the usages check if is_dialog returns <0 (which is 
for the case when there is no dialog), so all should be fine as you need.

I will backport to 3.2 soon as well.

Cheers,
Daniel
>
> Cheers,
> Daniel
>
>>
>> The same problem is true both for RLS and for PUA_XMPP. The real
>> problem is that for some strange reason (I don't know why), the
>> PUA_XMPP receive/process the NOTIFY message received from kamailio
>> presence server before the 200OK of the SUBSCRIBE. That's why the
>> previous patched implement the temporary dialog to avoid it. But it's
>> not enough, at least for PUA_XMPP.
>>
>> If you have a look at the line 196 inside the function
>> Notify2Xmpp(struct sip_msg* msg, char* s1, char* s2) in the file
>> modules_k/pua_xmpp/simple2xmpp.c:
>>
>>   196         if(pua_is_dialog(&dialog)<  0) // verify if within a 
>> stored dialog
>>   197         {
>>   198                 LM_ERR("Notify in a non existing dialog\n");
>>   199                 goto error;
>>   200         }
>>
>> In this case, the PUA_XMPP will print the Error and does not process
>> the NOTIFY message (convert it to XMPP and send it out to the XMPP
>> domain). And we got a lot of error "Notify in a non existing dialog"
>> in the log file. After we applied the patches from the link, the
>> errors are still there, because the pua_is_dialog call the function
>> is_dialog defined in the hash.c in the pua module, without the second
>> patch of hash.c, it will still return -1 because is_dialog checks the
>> dialog only against the real dialog in the hash, but not the temporary
>> one. After we have applied the patch in the is_dialog function. The
>> error is gone ;-) But I don't know if this may have impact on other
>> modules. I means I don't know if there are some modules use this
>> function to check if the only real dialog (but not temporary dialog)
>> is existing in the hash. In this case maybe is better to have 2 check
>> functions, one for real, another for both or temporary. What do you
>> think?
>>
>>
>> Best Regards,
>> Laura
>>
>>
>>
>>
>>
>>
>>
>> But the patches
>>
>> Yes, the second
>>
>>
>>
>> On Thu, Dec 29, 2011 at 4:41 PM, Daniel-Constantin Mierla
>> <miconda at gmail.com>  wrote:
>>> Hello Laura,
>>>
>>> I applied most of the patches, apart the second one for hash.c, 
>>> related to
>>> checking for temporary dialog. I need to look a bit more at it, 
>>> since there
>>> was some work in this regard:
>>>
>>> http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commitdiff;h=b93149c756d3e983c70608938f1142ed43ee1834 
>>>
>>>
>>> If I understood right, it is about NOTIFY getting processed faster than
>>> 200OK for SUBSCRIBE. Do I remember correctly, you are running 3.1.x? It
>>> might not be in branch 3.1.
>>>
>>> Cheers,
>>> Daniel
>>>
>>>
>>> On 12/28/11 6:15 PM, laura testi wrote:
>>>
>>> Hi Daniel,
>>> Yes, all patches are related to the PUA module. Please find the
>>> attachments for both diff files and new files with applied patches If
>>> you thinks they are useful. Now the old files should be the latest
>>> version of the master branch ;-) Unfortunately I can not use git here.
>>> We have tested the patches, now no memory leak any more; and no more
>>> error for NOTIFY (dialog not found)...Please note, our use case is the
>>> pua_xmpp, now it works fine. I don't know if rls has the same problem.
>>> Thank you veru much for your helps again.
>>>
>>> Some explanations:
>>>
>>> In the send_subscribe.c,
>>>    - I just comment out the line 1172 so that the pua_free_tm_dlg(td)
>>> do the right job later as you done also in this case.
>>>
>>> In the hash.c,
>>>    - in the get_dialog function, I add the check of "p->to_tag.len>  0"
>>> in the string compare conditions;
>>>
>>>    - in the is_dialog function, instead of check only the real dialog,
>>> the check of also the temporary dialog is added, this also helps to
>>> avoid the error of no dialog found for the NOTIFY if the NOTIFY is
>>> received before the 202/200 OK of the SUBSCRIBE.
>>>
>>> in the pua.c,
>>>    -   a few changes in  the update_pua function:
>>>       - apply the same kind of free td and td->route_set, unfortunately
>>> I can not re-use pua_free_tm_dlg which is local for send_subscribe.c.
>>>       - change from goto error to goto done
>>>
>>>
>>> Best Regards,
>>> Laura
>>>
>>>
>>>
>>> On Wed, Dec 28, 2011 at 2:39 PM, Daniel-Constantin Mierla
>>> <miconda at gmail.com>  wrote:
>>>
>>> Hello,
>>>
>>>
>>> On 12/27/11 1:51 PM, laura testi wrote:
>>>
>>> Hi Daniel,
>>> I tried the patch, it works partially. There are stil memory leak.
>>> Based on your patch, I did find different places need the same kind of
>>> patch both in send_subscribe,c and in pua,c
>>>
>>>
>>> ok, thanks, I will look over. But how did you do the patches, since 
>>> it does
>>> not take my latest patch, seems to be against an older version, 
>>> because the
>>> indentation is not there?
>>>
>>> I cannot apply it like this, maybe you can tell the files and lines you
>>> changed, otherwise is hard to track.
>>>
>>> Are both patches to the pua module? You are doing the patch with 
>>> files only,
>>> it is more convenient to call the diff with path to the module, in 
>>> this way
>>> is easy to spot in which module to apply the path -- i.e., use diff 
>>> from
>>> root folder of kamailio, like:
>>>
>>> diff -u modules/abc/oldfile modules/abc/newfile
>>>
>>> Since you are sending a lot of patches, maybe it will work better if 
>>> you
>>> just clone the git, make the patch against the master branch -- 
>>> change the
>>> file in the master branch and then just do:
>>>
>>> git diff>  path/to/save/patch.file
>>>
>>> Some info that could be useful for working with git and patches, 
>>> including
>>> backporting, at:
>>>
>>> http://www.kamailio.org/wiki/devel/backporting-to-3.2.x
>>>
>>> Cheers,
>>> Daniel
>>>
>>>
>>>
>>>
>>> Please find the modified version of these files.
>>>
>>> Following are the differences:
>>> # diff -u send_subscribe.c.orig send_subscribe.c
>>> --- send_subscribe.c.orig       2011-12-27 13:31:06.000000000 +0100
>>> +++ send_subscribe.c    2011-12-27 13:31:51.000000000 +0100
>>> @@ -1151,7 +1151,6 @@
>>>                          if (dbmode!=PUA_DB_ONLY)
>>>
>>> lock_release(&HashT->p_records[hash_code].lock);
>>>                          ret= -1;
>>> -                       pkg_free(td);
>>>                          goto done;
>>>                  }
>>>                  if (dbmode!=PUA_DB_ONLY)
>>>
>>>
>>>
>>>
>>>
>>> # diff -u pua.c.orig pua.c
>>> --- pua.c.orig  2011-12-27 13:15:47.000000000 +0100
>>> +++ pua.c       2011-12-27 13:26:33.000000000 +0100
>>> @@ -673,106 +673,145 @@
>>>
>>>   int update_pua(ua_pres_t* p)
>>>   {
>>> -       str* str_hdr= NULL;
>>> -       int expires;
>>> -       int result;
>>> -       uac_req_t uac_r;
>>> -
>>> -       if(p->desired_expires== 0)
>>> -               expires= 3600;
>>> -       else
>>> -               expires= p->desired_expires- (int)time(NULL);
>>> +  str* str_hdr= NULL;
>>> +  ua_pres_t* cb_param = NULL;
>>>
>>> -       if(p->watcher_uri== NULL)
>>> -       {
>>> -               str met= {"PUBLISH", 7};
>>> -               ua_pres_t* cb_param;
>>> -
>>> -               str_hdr = publ_build_hdr(expires, 
>>> get_event(p->event), NULL,
>>> -&p->etag, p->extra_headers, 0);
>>> -               if(str_hdr == NULL)
>>> -               {
>>> -                       LM_ERR("while building extra_headers\n");
>>> -                       goto error;
>>> -               }
>>> -               LM_DBG("str_hdr:\n%.*s\n ", str_hdr->len, str_hdr->s);
>>> -
>>> -               cb_param= build_uppubl_cbparam(p);
>>> -               if(cb_param== NULL)
>>> -               {
>>> -                       LM_ERR("while constructing publ callback 
>>> param\n");
>>> -                       goto error;
>>> -               }
>>> -
>>> -               set_uac_req(&uac_r,&met, str_hdr, 0, 0,
>>> TMCB_LOCAL_COMPLETED,
>>> -                               publ_cback_func, (void*)cb_param);
>>> -
>>> -               result= tmb.t_request(&uac_r,
>>> -                               p->pres_uri,
>>>          /* Request-URI */
>>> -                               p->pres_uri,
>>>          /* To */
>>> -                               p->pres_uri,
>>>          /* From */
>>> -&outbound_proxy
>>>          /* Outbound proxy*/
>>> -                               );
>>> -               if(result<  0)
>>> -               {
>>> -                       LM_ERR("in t_request function\n");
>>> -                       shm_free(cb_param);
>>> -                       goto error;
>>> -               }
>>> -
>>> -       }
>>> -       else
>>> -       {
>>> -               str met= {"SUBSCRIBE", 9};
>>> -               dlg_t* td= NULL;
>>> -               ua_pres_t* cb_param= NULL;
>>> -
>>> -               td= pua_build_dlg_t(p);
>>> -               if(td== NULL)
>>> -               {
>>> -                       LM_ERR("while building tm dlg_t structure");
>>> -                       goto error;
>>> -               };
>>> -
>>> -               str_hdr= subs_build_hdr(&p->contact,
>>> expires,p->event,p->extra_headers);
>>> -               if(str_hdr== NULL || str_hdr->s== NULL)
>>> -               {
>>> -                       LM_ERR("while building extra headers\n");
>>> -                       pkg_free(td);
>>> -                       return -1;
>>> -               }
>>> -               cb_param= subs_cbparam_indlg(p, expires, REQ_ME);
>>> -               if(cb_param== NULL)
>>> -               {
>>> -                       LM_ERR("while constructing subs callback 
>>> param\n");
>>> -                       goto error;
>>> -
>>> -               }
>>> -
>>> -               set_uac_req(&uac_r,&met, str_hdr, 0, td,
>>> TMCB_LOCAL_COMPLETED,
>>> -                               subs_cback_func, (void*)cb_param);
>>> -
>>> -               result= tmb.t_request_within(&uac_r);
>>> -               if(result<  0)
>>> -               {
>>> -                       LM_ERR("in t_request function\n");
>>> -                       shm_free(cb_param);
>>> -                       pkg_free(td);
>>> -                       goto error;
>>> -               }
>>> -
>>> -               pkg_free(td);
>>> -               td= NULL;
>>> -       }
>>> -
>>> -       pkg_free(str_hdr);
>>> -       return 0;
>>> -
>>> -error:
>>> -       if(str_hdr)
>>> -               pkg_free(str_hdr);
>>> -       return -1;
>>> +  int expires;
>>> +  int result = 0;
>>> +  uac_req_t uac_r;
>>> +  str met = {NULL, 0};
>>> +  int ret_code = 0;
>>> +  dlg_t* td = NULL;
>>> +
>>> +
>>> +  if(p->desired_expires== 0)
>>> +    expires= default_expires;
>>> +  else
>>> +    expires= p->desired_expires- (int)time(NULL);
>>> +
>>> +  if(p->watcher_uri== NULL)
>>> +  {
>>> +
>>> +    str_hdr = publ_build_hdr(expires, get_event(p->event), NULL,
>>> +&p->etag, p->extra_headers, 0);
>>> +
>>> +    if(str_hdr == NULL)
>>> +    {
>>> +      LM_ERR("while building extra_headers\n");
>>> +      ret_code = -1;
>>> +      goto done;
>>> +    }
>>> +    LM_DBG("str_hdr:\n%.*s\n ", str_hdr->len, str_hdr->s);
>>> +
>>> +    cb_param= build_uppubl_cbparam(p);
>>> +    if(cb_param== NULL)
>>> +    {
>>> +      LM_ERR("while constructing publ callback param\n");
>>> +      ret_code = -1;
>>> +      goto done;
>>> +    }
>>> +
>>> +    met.s =  (char*)pkg_malloc(8*sizeof(char));
>>> +    if(met.s == NULL) {
>>> +      LM_ERR("no memory for met.s(PUBLISH)\n");
>>> +      ret_code = -1;
>>> +      goto done;
>>> +    }
>>> +    memset(met.s, 0, 8);
>>> +    memcpy(met.s, "PUBLISH", 7);
>>> +    met.len = 7;
>>> +    set_uac_req(&uac_r,&met, str_hdr, 0, 0, TMCB_LOCAL_COMPLETED,
>>> +        publ_cback_func, (void*)cb_param);
>>> +
>>> +    result= tmb.t_request(&uac_r,
>>> +        p->pres_uri,          /* Request-URI */
>>> +        p->pres_uri,          /* To */
>>> +        p->pres_uri,          /* From */
>>> +&outbound_proxy         /* Outbound proxy*/
>>> +        );
>>> +    if(result<  0)
>>> +    {
>>> +      LM_ERR("in t_request function\n");
>>> +      shm_free(cb_param);
>>> +      cb_param = NULL;
>>> +      ret_code = -1;
>>> +      goto done;
>>> +    }
>>> +  }
>>> +  else
>>> +  {
>>> +    td= pua_build_dlg_t(p);
>>> +    if(td== NULL)
>>> +    {
>>> +      LM_ERR("while building tm dlg_t structure");
>>> +      ret_code = -1;
>>> +      goto done;
>>> +    };
>>> +
>>> +    str_hdr= subs_build_hdr(&p->contact,
>>> expires,p->event,p->extra_headers);
>>> +    if(str_hdr== NULL || str_hdr->s== NULL)
>>> +    {
>>> +      if(p->event!=0)
>>> +        LM_ERR("while building extra headers\n");
>>> +
>>> +      ret_code = -1;
>>> +      goto done;
>>> +    }
>>> +
>>> +    cb_param= subs_cbparam_indlg(p, expires, REQ_ME);
>>> +    if(cb_param== NULL)
>>> +    {
>>> +      LM_ERR("while constructing subs callback param\n");
>>> +      ret_code = -1;
>>> +      goto done;
>>> +    }
>>> +
>>> +    met.s =  (char*)pkg_malloc(10*sizeof(char));
>>> +    if(met.s == NULL) {
>>> +      LM_ERR("no memory for met.s(SUBSCRIBE)\n");
>>> +      ret_code = -1;
>>> +      goto done;
>>> +    }
>>> +    memset(met.s, 0, 10);
>>> +    memcpy(met.s, "SUBSCRIBE", 9);
>>> +    met.len = 9;
>>> +    set_uac_req(&uac_r,&met, str_hdr, 0, td, TMCB_LOCAL_COMPLETED,
>>> +    subs_cback_func, (void*)cb_param);
>>> +
>>> +    result= tmb.t_request_within(&uac_r);
>>> +    if(result<  0)
>>> +    {
>>> +      LM_ERR("in t_request function\n");
>>> +      ret_code = -1;
>>> +      shm_free(cb_param);
>>> +      cb_param = NULL;
>>> +      goto done;
>>> +    }
>>> +  }
>>> +
>>> +
>>> +done:
>>> +  if(td!=NULL)
>>> +  {
>>> +   if(td->route_set)
>>> +      free_rr(&td->route_set);
>>> +
>>> +    pkg_free(td);
>>> +    td= NULL;
>>> +  }
>>> +
>>> +  if(met.s != NULL) {
>>> +    pkg_free(met.s);
>>> +    met.s = NULL;
>>> +    met.len = 0;
>>> +  }
>>> +
>>> +  if(str_hdr != NULL) {
>>> +    pkg_free(str_hdr);
>>> +    str_hdr = NULL;
>>> +  }
>>>
>>> +  return ret_code;
>>>   }
>>>
>>>   static void db_update(unsigned int ticks,void *param)
>>>
>>>
>>> It seems a lot of change, but there are only a few lines changed,
>>> probably in the file I modify I have convert the TAB to Space and the
>>> diff does not recognize them. Another thing is I use dynamic memory
>>> for the str SUBSCRIBE and PUBLISH.
>>>
>>>
>>>
>>>
>>> Another thing for the management of NOTIFY arrives before the 202/200
>>> OK of SUBSCRIBE, in addition to the patches done previously, maybe the
>>> hash.c need to patch for the is_dialog function which is called for
>>> the NOTIFY in PUA_XMPP module:
>>>
>>> # diff -u hash.c.orig hash.c
>>> --- hash.c.orig 2011-12-27 13:38:06.000000000 +0100
>>> +++ hash.c      2011-12-27 13:38:38.000000000 +0100
>>> @@ -487,10 +487,11 @@
>>>          hash_code= core_hash(dialog->pres_uri, dialog->watcher_uri,
>>> HASH_SIZE);
>>>          lock_get(&HashT->p_records[hash_code].lock);
>>>
>>> -       if(get_dialog(dialog, hash_code)== NULL)
>>> -               ret_code= -1;
>>> -       else
>>> +       if(get_dialog(dialog, hash_code) ||
>>> get_temporary_dialog(dialog, hash_code))
>>>                  ret_code= 0;
>>> +       else
>>> +               ret_code= -1;
>>> +
>>>          lock_release(&HashT->p_records[hash_code].lock);
>>>
>>>          return ret_code;
>>>
>>>
>>> Best Regards,
>>> Laura
>>>
>>> On Fri, Dec 23, 2011 at 5:10 PM, laura testi<lau.testi at gmail.com>  
>>> wrote:
>>>
>>> Ok, I'll try it.
>>>
>>> Thank you very much!
>>>
>>>
>>>
>>>
>>> On Fri, Dec 23, 2011 at 1:20 PM, Daniel-Constantin Mierla
>>> <miconda at gmail.com>  wrote:
>>>
>>> Hello,
>>>
>>> can you try with this patch:
>>>
>>> http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1b3cfa60a5b5c7d435704d44b7c495b7e6aa84c8 
>>>
>>>
>>> Cheers,
>>> Daniel
>>>
>>>
>>> On 12/23/11 12:36 PM, Daniel-Constantin Mierla wrote:
>>>
>>> Hello,
>>>
>>> looks like a leak in a module that is storing record-routes and use 
>>> them
>>> later, perhaps pua module, I will check it soon.
>>>
>>> Cheers,
>>> Daniel
>>>
>>> On 12/23/11 11:31 AM, laura testi wrote:
>>>
>>> Hi Daniel,
>>> I just follow the instruction in the link you sent
>>> (http://www.asipto.com/pub/kamailio-devel-guide/#c04troubleshooting)
>>> to use gdb to print PKG fragments. When I got the error in PUA:
>>>
>>> Dec 23 11:10:53 /.../sbin/kamailio[23276]: ERROR: pua
>>> [send_subscribe.c:158]: No memory left for size:439
>>> Dec 23 11:10:53 /.../sbin/kamailio[23276]: ERROR: pua [pua.c:747]:
>>> while building tm dlg_t structure
>>> Dec 23 11:10:53 /.../sbin/kamailio[23276]: ERROR: pua [pua.c:652]:
>>> while updating record
>>>
>>>
>>> The I run the command
>>> gdb /.../sbin/kamailio 23276
>>> and write the following commands in the gdb:
>>>
>>> set $i=0
>>> set $a = mem_block->first_frag
>>> while($i<10000)
>>>    if($i>2000)
>>>      if($a->u.is_free==0)
>>>        p *$a
>>>      end
>>>    end
>>>    set $a = ((struct qm_frag*)((char*)($a)+sizeof(struct
>>> qm_frag)+((struct qm_frag*)$a)->size+sizeof(struct qm_frag_end)))
>>>    set $i = $i + 1
>>> end
>>> ...
>>>
>>> after a while I got a lot of prints on the screen like these:
>>>
>>>    func = 0x5d7b00 "do_parse_rr_body", line = 74, check = 4042322160}
>>> $1348 = {size = 72, u = {nxt_free = 0x0, is_free = 0},
>>>    file = 0x5d76c9 "<core>: parser/parse_rr.c",
>>>    func = 0x5d7b00 "do_parse_rr_body", line = 74, check = 4042322160}
>>> $1349 = {size = 72, u = {nxt_free = 0x0, is_free = 0},
>>>    file = 0x5d76c9 "<core>: parser/parse_rr.c",
>>>    func = 0x5d7b00 "do_parse_rr_body", line = 74, check = 4042322160}
>>> $1350 = {size = 72, u = {nxt_free = 0x0, is_free = 0},
>>>    file = 0x5d76c9 "<core>: parser/parse_rr.c",
>>>    func = 0x5d7b00 "do_parse_rr_body", line = 74, check = 4042322160}
>>> $1351 = {size = 104, u = {nxt_free = 0x0, is_free = 0},
>>>    file = 0x5d76c9 "<core>: parser/parse_rr.c",
>>>    func = 0x5d7b00 "do_parse_rr_body", line = 74, check = 4042322160}
>>> $1352 = {size = 104, u = {nxt_free = 0x0, is_free = 0},
>>>    file = 0x5d76c9 "<core>: parser/parse_rr.c",
>>>    func = 0x5d7b00 "do_parse_rr_body", line = 74, check = 4042322160}
>>> $1353 = {size = 72, u = {nxt_free = 0x0, is_free = 0},
>>>    file = 0x5d76c9 "<core>: parser/parse_rr.c",
>>>    func = 0x5d7b00 "do_parse_rr_body", line = 74, check = 4042322160}
>>> $1354 = {size = 72, u = {nxt_free = 0x0, is_free = 0},
>>> ---Type<return>    to continue, or q<return>    to quit---
>>>
>>> ...
>>>
>>>
>>> But I don't understand if these are normal or something goes wrong....
>>>
>>> Can you help
>>>
>>>
>>> Best Regards,
>>> Laura
>>>
>>> On Wed, Dec 21, 2011 at 12:18 PM, Daniel-Constantin Mierla
>>> <miconda at gmail.com>    wrote:
>>>
>>> Hello,
>>>
>>> pkg.stats was added in 3.2.0, iirc. For 3.1, you can walk the 
>>> packets in
>>> memory with gdb -- 3.1 has memory debug on, so you don't need to
>>> recompile
>>> (unless you turned it off).
>>>
>>> Just attach to the pid of a sip worker  (gdb /path/to/kamailio
>>> _pid_value_)
>>> and run the gdb script.
>>>
>>> Cheers,
>>> Daniel
>>>
>>>
>>> On 12/21/11 11:58 AM, laura testi wrote:
>>>
>>> Hi Daniel,
>>> I try the sercmd for pkg memory but it return 500 error:
>>>
>>>
>>> # sercmd
>>> sercmd 0.2
>>> Copyright 2006 iptelorg GmbH
>>> This is free software with ABSOLUTELY NO WARRANTY.
>>> For details type `warranty'.
>>> sercmd>      pkg.stats
>>> error: 500 - command pkg.stats not found
>>> sercmd>
>>>
>>>
>>>
>>> Is it available only for 3.2.x and master branch? Because we are using
>>> 3.1.5. But take the PUA module from master branch for the fetch_row
>>> parameter you have patched ;-)
>>>
>>>
>>> core.shmmem is ok.
>>>
>>>
>>>
>>> Thanks a lot
>>>
>>> Laura
>>>
>>> On Wed, Dec 21, 2011 at 10:58 AM, Daniel-Constantin Mierla
>>> <miconda at gmail.com>      wrote:
>>>
>>> Hello,
>>>
>>> you can see the available pkg via sercmd, sending command pkg.stats
>>> (match
>>> the entry for the pid printing the error). If there is no free memory,
>>> then
>>> might be a leak.
>>>
>>> You can attach with gdb to the pid printing these errors and walk to
>>> pkg,
>>> you see the commands for gdb at:
>>>
>>> http://www.asipto.com/pub/kamailio-devel-guide/#c04troubleshooting
>>>
>>> See if you have lot of allocated chunks from same place in source code
>>> (ignore those at the beginning, mainly related to cfg parsing) and
>>> send
>>> the
>>> details here.
>>>
>>> Cheers,
>>> Daniel
>>>
>>>
>>> On 12/21/11 10:44 AM, laura testi wrote:
>>>
>>> Hi,
>>> we are using the PUA_XMPP and PUA modules from the master branch. When
>>> the modules are started, everything are ok, the presence events from
>>> XMPP are sent to kamailio SIP servers (PUBLISH/SUBSCRIBE) and cached
>>> in the hash. But when there are several thousands records in the hash
>>> tabel, the update_pua function called in the hashT_clean gives a lot
>>> of "No memory left" error when the hashT_clean is waked up from the
>>> time:
>>>
>>> ERROR: pua [send_subscribe.c]: No memory left
>>> ERROR: pua [pua.c]: while building tm dlg_t structure
>>>
>>> The failed call is:
>>>         td = (dlg_t*)pkg_malloc(size);
>>>         if(td == NULL)
>>>         {
>>>                 LM_ERR("No memory left\n");
>>>                 return NULL;
>>>         }
>>>
>>> in dlg_t* pua_build_dlg_t(ua_pres_t* presentity) function in
>>> send_subscribe.c. The size is about 400 and something... It's
>>> strange.....
>>>
>>> Is it the memory leak in the PUA module?
>>>
>>>
>>>
>>> I also try to increase the pkg_memory from 4MB default to 16MB, but it
>>> doesn't help.
>>>
>>>
>>> Any Idea?
>>>
>>> Thanks in advanced
>>>
>>> Laura
>>>
>>> _______________________________________________
>>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing
>>> list
>>> sr-users at lists.sip-router.org
>>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>
>>>
>>> -- 
>>> Daniel-Constantin Mierla -- http://www.asipto.com
>>> http://linkedin.com/in/miconda -- http://twitter.com/miconda
>>>
>>> _______________________________________________
>>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
>>> sr-users at lists.sip-router.org
>>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>
>>> -- 
>>> Daniel-Constantin Mierla -- http://www.asipto.com
>>> http://linkedin.com/in/miconda -- http://twitter.com/miconda
>>>
>>> -- 
>>> Daniel-Constantin Mierla -- http://www.asipto.com
>>> http://linkedin.com/in/miconda -- http://twitter.com/miconda
>>>
>>>
>>>
>>> _______________________________________________
>>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
>>> sr-users at lists.sip-router.org
>>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>
>>>
>>> -- 
>>> Daniel-Constantin Mierla -- http://www.asipto.com
>>> http://linkedin.com/in/miconda -- http://twitter.com/miconda
>>>
>>>
>>>
>>> _______________________________________________
>>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
>>> sr-users at lists.sip-router.org
>>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>
>>>
>>> -- 
>>> Daniel-Constantin Mierla -- http://www.asipto.com
>>> http://linkedin.com/in/miconda -- http://twitter.com/miconda
>> _______________________________________________
>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
>> sr-users at lists.sip-router.org
>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>

-- 
Daniel-Constantin Mierla -- http://www.asipto.com
http://linkedin.com/in/miconda -- http://twitter.com/miconda




More information about the sr-dev mailing list