[sr-dev] db_redis shared tcp connection issue

Daniel-Constantin Mierla miconda at gmail.com
Fri Apr 29 16:18:54 CEST 2022


No.

Connections opened in mod init or child init for rank proc main/init
must be closed again there.

If a component wants to keep the connection open, has to be done in
child init for ranks corresponding to sip workers, rpcs, timers, ...

On 29.04.22 15:25, Andrew Pogrebennyk wrote:
> Hi Daniel,
> I am not sure if I understood you correctly. Do you mean that
> child_init should open the connection only when the rank is proc main
> or proc init?
>
> For example, in pua module we have 
>
> static int child_init(int rank)
> {
>         if (rank==PROC_INIT || rank==PROC_MAIN || rank==PROC_TCP_MAIN)
>                 return 0; /* do nothing for the main process */
>
>         if (pua_dbf.init==0)
>         {
>                 LM_CRIT("database not bound\n");
>
> Is that correct? If I have a module which does not connect in
> child_init for rank PROC_RPC, but the origin of this module
> (ims_dialog vs dialog), does also establish connection in RPC rank
> would that be a problem? No, right? :)
>
> Thanks for the pointer, checking it.
> Andrew
>
> On Fri, Apr 29, 2022 at 1:17 PM Daniel-Constantin Mierla
> <miconda at gmail.com> wrote:
>
>     Hello,
>
>     this sounds like a module does a db operation in mod init opening
>     the connection, but does it close it afterwards there. It should
>     then re-open in child init.
>
>     It can be also in child_init(), but when the rank is proc main or
>     proc init. In child init db connection has to be left opened only
>     for the other ranks.
>
>     Try to identify which component makes the first operation.
>
>     Cheers,
>     Daniel
>
>     On 29.04.22 12:39, Andrew Pogrebennyk wrote:
>>     Dear community,
>>     I've been looking at some weirdness in db_redis behavior when it
>>     returns the responses to the queries made by tcp processes in
>>     mixed order.
>>     Tested this on various kamailio 5.3 and 5.4 (sipwise spce) and
>>     they are showing interesting pattern.
>>     After restart of kamailio I ran lsof to enumerate all the sockets
>>     open in kamailio children.
>>     There is a connection to db port 6379 which is held by multiple
>>     processes at the same time.
>>
>>         for i in $(ps auxww | grep kamailio.proxy | grep -v grep |
>>         awk '{print $2}'); do echo "print file descriptors of $i" &&
>>         sudo lsof -p $i | grep 6379; done > redis_conn.txt
>>
>>     ...i see that lsof lists tcp client socket to redis server with
>>     same source TCP port and same inode number in several processes:
>>
>>       14199,   "TIMER NH",
>>       14200,  "ctl handler",
>>       14205,  "Dialog Clean Timer",
>>       14206,  "JSONRPCS FIFO",
>>       14210,  "JSONRPCS DATAGRAM",
>>       14213,  "tcp receiver (generic) child=0",
>>       14214,  "tcp receiver (generic) child=1",
>>       14215,  "tcp receiver (generic) child=2",
>>       14220,  "tcp receiver (generic) child=3",
>>       14224,  "tcp receiver (generic) child=4",
>>       14225,  "tcp main process"
>>
>>     The UDP processes are safe (and some timer ones too), because in
>>     that lsof they have unique TCP client port.
>>
>>     That's giving me a lot of headache because UA registrations
>>     received by any of the TCP workers (or IPSec ones for that
>>     matter) are randomly failing, because  if two processes made same
>>     query to DB in parallel it is appearing on the wire with same TCP
>>     source port and replies can be mixed up.
>>
>>     This can be some bug in usage of hiredis, impacting all users of
>>     db_redis module. Is there any relation to the way kamailio is
>>     working its TCP workers, where maybe tcp workers are forked from
>>     the main attendant processes after having opened the DB connection?
>>
>>     P.S. Why I have the above hypothesis: when I log redis queries
>>     with redis-cli monitor at startup of kamailio, I see only that
>>     srem_key_lua is executed against redis in runtime only once from
>>     that source port, but then this connection is shared across
>>     multiple processes.
>>
>>     Regards,
>>     Andrew
>>
>>     _______________________________________________
>>     Kamailio (SER) - Development Mailing List
>>     sr-dev at lists.kamailio.org
>>     https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev
>
>     -- 
>     Daniel-Constantin Mierla -- www.asipto.com <http://www.asipto.com>
>     www.twitter.com/miconda <http://www.twitter.com/miconda> -- www.linkedin.com/in/miconda <http://www.linkedin.com/in/miconda>
>     Kamailio Advanced Training - Online
>       * https://www.asipto.com/sw/kamailio-advanced-training-online/
>
-- 
Daniel-Constantin Mierla -- www.asipto.com
www.twitter.com/miconda -- www.linkedin.com/in/miconda
Kamailio Advanced Training - Online
  * https://www.asipto.com/sw/kamailio-advanced-training-online/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.kamailio.org/pipermail/sr-dev/attachments/20220429/04ad75fa/attachment-0001.htm>


More information about the sr-dev mailing list