[SR-Users] ndb_redis module fails after a while

Daniel-Constantin Mierla miconda at gmail.com
Fri Feb 17 14:30:44 CET 2012


Hello,

right, very dummy paste position for resetting the redis context, use 
the attached patch or exchange lines 228 and 229. in redis_client.c

Thanks,
Daniel


On 2/17/12 1:13 PM, Javier Gallart wrote:
> Hi Daniel, Andrew
>
> I've just tested the patch and kamailio crashes when the redis server 
> is stopped. This is what I could get:
> -From the logs:
> Feb 17 06:33:32 r-gate-test ./kamailio[23812]: ALERT: <core> 
> [main.c:751]: child process 23819 exited by a signal 11
> Feb 17 06:33:32 r-gate-test ./kamailio[23812]: ALERT: <core> 
> [main.c:754]: core was generated
> Feb 17 06:33:32 r-gate-test ./kamailio[23812]: INFO: <core> 
> [main.c:766]: INFO: terminating due to SIGCHLD
>
> -An the backtrace:
> (...)
> Core was generated by `./kamailio -f ../etc/kamailio/kamailio.cfg'.
> Program terminated with signal 11, Segmentation fault.
> #0  redisFree (c=0x0) at hiredis.c:817
> 817   if (c->fd > 0)
> (gdb) bt
> #0  redisFree (c=0x0) at hiredis.c:817
> #1  0x00007f726f035461 in redisc_reconnect_server 
> (rsrv=0x7f7271c93ac0) at redis_client.c:229
> #2  0x00007f726f037240 in redisc_exec (srv=<value optimized out>, 
> cmd=0x7fffe98c6090, argv1=<value optimized out>, argv2=<value 
> optimized out>, argv3=<value optimized out>,
>     res=<value optimized out>) at redis_client.c:298
> #3  0x00007f726f034f7d in w_redis_cmd3 (msg=0x7f7271d7b018, 
> ssrv=<value optimized out>, scmd=<value optimized out>, 
> sres=0x7f7271d74b58 "h\341\313qr\177") at ndb_redis_mod.c:156
> #4  0x0000000000417025 in do_action (h=0x7fffe98c6570, 
> a=0x7f7271cc5248, msg=<value optimized out>) at action.c:1134
> #5  0x000000000041e58b in run_actions (h=<value optimized out>, 
> a=<value optimized out>, msg=<value optimized out>) at action.c:1610
> #6  0x000000000041e8d4 in run_actions_safe (h=0x7fffe98c7610, 
> a=0x7f7271c93781, msg=0x7f7271c93780) at action.c:1662
> #7  0x00000000004b731d in rval_get_int (h=0x7fffe98c7610, msg=0x0, 
> i=0x7fffe98c6bd8, rv=0x3, cache=0x4) at rvalue.c:920
> #8  0x00000000004bb87c in rval_expr_eval_int (h=0x7fffe98c7610, 
> msg=0x7f7271d7b018, res=0x7fffe98c6bd8, rve=0x7f7271cc6768) at 
> rvalue.c:1914
> #9  0x0000000000417c7c in do_action (h=0x7fffe98c7610, 
> a=0x7f7271ccb9d0, msg=<value optimized out>) at action.c:1092
> #10 0x000000000041e58b in run_actions (h=<value optimized out>, 
> a=<value optimized out>, msg=<value optimized out>) at action.c:1610
> #11 0x0000000000417cd7 in do_action (h=0x7fffe98c7610, 
> a=0x7f7271ccbb10, msg=<value optimized out>) at action.c:1111
> #12 0x000000000041e58b in run_actions (h=<value optimized out>, 
> a=<value optimized out>, msg=<value optimized out>) at action.c:1610
> #13 0x000000000041795e in do_action (h=0x7fffe98c7610, a=<value 
> optimized out>, msg=<value optimized out>) at action.c:732
> #14 0x000000000041e58b in run_actions (h=<value optimized out>, 
> a=<value optimized out>, msg=<value optimized out>) at action.c:1610
> #15 0x000000000041e862 in run_top_route (a=0x7f7271c94888, 
> msg=0x7f7271d7b018, c=<value optimized out>) at action.c:1683
> #16 0x0000000000498f36 in receive_msg (
>     buf=0x8bb100 "INVITE sip:34661574758 at 79.170.68.215:5060 
> <http://sip:34661574758@79.170.68.215:5060> SIP/2.0\r\nVia: 
> SIP/2.0/UDP 79.170.68.214:5060;branch=z9hG4bK-9451-1-0\r\nFrom: 
> 34661574758 <sip:34661574758 at 79.170.68.214:5060 
> <http://sip:34661574758@79.170.68.214:5060>>;tag=9451SIPpTag001\r\nTo: 
> sut <sip:"..., len=<value optimized out>, rcv_info=0x7fffe98c7910) at 
> receive.c:207
> #17 0x0000000000525987 in udp_rcv_loop () at udp_server.c:544
> #18 0x00000000004635f4 in main_loop () at main.c:1585
> #19 0x0000000000465e62 in main (argc=3, argv=0x7fffe98c7c08) at 
> main.c:2475
>
>
> Regards
>
> Javi
>
> On Fri, Feb 17, 2012 at 11:39 AM, Daniel-Constantin Mierla 
> <miconda at gmail.com <mailto:miconda at gmail.com>> wrote:
>
>     Hello,
>
>     thanks for testing, indeed it was an extra declaration left over.
>     Can you try with the new patch attached?
>
>     Cheers,
>     Daniel
>
>
>     On 2/17/12 11:10 AM, Andrew Pogrebennyk wrote:
>
>         Hi Daniel,
>
>         On 02/17/2012 10:47 AM, Daniel-Constantin Mierla wrote:
>
>             I made a patch for server reconnect -- I had no access to
>             a computer
>             with redis lib installed for the moment, hopefully it
>             compiles. If you
>             can try and tell the result, it would be great, I can
>             commit then.
>
>         I may be able to test this patch as well. Currently
>         compilations bails
>         out on attempt to redeclare redisc_reconnect_server function
>         parameter:
>
>         CC (gcc) [M ndb_redis.so]               ndb_redis_mod.o
>         CC (gcc) [M ndb_redis.so]               redis_client.o
>         redis_client.c: In function 'redisc_reconnect_server':
>         redis_client.c:206:19: error: 'rsrv' redeclared as different
>         kind of symbol
>         redis_client.c:202:46: note: previous definition of 'rsrv' was
>         here
>         make[1]: *** [redis_client.o] Error 1
>         make: *** [modules] Error 1
>
>         _______________________________________________
>         SIP Express Router (SER) and Kamailio (OpenSER) - sr-users
>         mailing list
>         sr-users at lists.sip-router.org
>         <mailto: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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20120217/1d77887f/attachment.htm>
-------------- next part --------------
diff --git a/modules/ndb_redis/redis_client.c b/modules/ndb_redis/redis_client.c
index 9f4ffc4..234bb3a 100644
--- a/modules/ndb_redis/redis_client.c
+++ b/modules/ndb_redis/redis_client.c
@@ -199,6 +199,61 @@ redisc_server_t *redisc_get_server(str *name)
 /**
  *
  */
+int redisc_reconnect_server(redisc_server_t *rsrv)
+{
+	char *addr;
+	unsigned int port, db;
+	param_t *pit = NULL;
+	struct timeval tv;
+
+	tv.tv_sec = 1;
+	tv.tv_usec = 0;
+	addr = "127.0.0.1";
+	port = 6379;
+	db = 0;
+	for (pit = rsrv->attrs; pit; pit=pit->next)
+	{
+		if(pit->name.len==4 && strncmp(pit->name.s, "addr", 4)==0) {
+			addr = pit->body.s;
+			addr[pit->body.len] = '\0';
+		} else if(pit->name.len==4 && strncmp(pit->name.s, "port", 4)==0) {
+			if(str2int(&pit->body, &port) < 0)
+				port = 6379;
+		} else if(pit->name.len==2 && strncmp(pit->name.s, "db", 2)==0) {
+			if(str2int(&pit->body, &db) < 0)
+				db = 0;
+		}
+	}
+	if(rsrv->ctxRedis!=NULL) {
+		redisFree(rsrv->ctxRedis);
+		rsrv->ctxRedis = NULL;
+	}
+
+	rsrv->ctxRedis = redisConnectWithTimeout(addr, port, tv);
+	if(!rsrv->ctxRedis)
+		goto err;
+	if (rsrv->ctxRedis->err)
+		goto err2;
+	if (redisCommandNR(rsrv->ctxRedis, "PING"))
+		goto err2;
+	if (redisCommandNR(rsrv->ctxRedis, "SELECT %i", db))
+		goto err2;
+
+	return 0;
+
+err2:
+	LM_ERR("error communicating with redis server [%.*s] (%s:%d/%d): %s\n",
+		rsrv->sname->len, rsrv->sname->s, addr, port, db, rsrv->ctxRedis->errstr);
+	return -1;
+err:
+	LM_ERR("failed to connect to redis server [%.*s] (%s:%d/%d)\n",
+		rsrv->sname->len, rsrv->sname->s, addr, port, db);
+	return -1;
+}
+
+/**
+ *
+ */
 int redisc_exec(str *srv, str *cmd, str *argv1, str *argv2, str *argv3,
 		str *res)
 {
@@ -237,6 +292,14 @@ int redisc_exec(str *srv, str *cmd, str *argv1, str *argv2, str *argv3,
 	c = cmd->s[cmd->len];
 	cmd->s[cmd->len] = '\0';
 	rpl->rplRedis = redisCommand(rsrv->ctxRedis, cmd->s);
+	if(rpl->rplRedis == NULL)
+	{
+		/* null reply, reconnect and try again */
+		if(redisc_reconnect_server(rsrv)==0)
+		{
+			rpl->rplRedis = redisCommand(rsrv->ctxRedis, cmd->s);
+		}
+	}
 	cmd->s[cmd->len] = c;
 	return 0;
 }


More information about the sr-users mailing list