[sr-dev] git:master:785ede5b: rtpengine: use version number to track building rtpengine sockets on reload

Daniel-Constantin Mierla miconda at gmail.com
Fri Dec 28 09:56:51 CET 2018


Module: kamailio
Branch: master
Commit: 785ede5bacfe55e88381ae8f7d672b24ec4b8cf6
URL: https://github.com/kamailio/kamailio/commit/785ede5bacfe55e88381ae8f7d672b24ec4b8cf6

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2018-12-28T09:56:26+01:00

rtpengine: use version number to track building rtpengine sockets on reload

- check on list size fails if same list is reloaded with different
  attributes
- reload command has a safe interval of 10 seconds between executions to
  allow building internal list of sockets

---

Modified: src/modules/rtpengine/rtpengine.c

---

Diff:  https://github.com/kamailio/kamailio/commit/785ede5bacfe55e88381ae8f7d672b24ec4b8cf6.diff
Patch: https://github.com/kamailio/kamailio/commit/785ede5bacfe55e88381ae8f7d672b24ec4b8cf6.patch

---

diff --git a/src/modules/rtpengine/rtpengine.c b/src/modules/rtpengine/rtpengine.c
index 46a55e6669..484ce05f35 100644
--- a/src/modules/rtpengine/rtpengine.c
+++ b/src/modules/rtpengine/rtpengine.c
@@ -169,6 +169,16 @@ struct minmax_stats_vals {
 	long long avg_samples; /* our own running count to average the averages */
 };
 
+#define RTPE_LIST_VERSION_DELAY	10
+
+typedef struct rtpe_list_version {
+	int vernum;
+	time_t vertime;
+} rtpe_list_version_t;
+
+static rtpe_list_version_t *_rtpe_list_version = NULL;
+static int _rtpe_list_vernum_local = 0;
+
 static char *gencookie();
 static int rtpp_test(struct rtpp_node*, int, int);
 static int start_recording_f(struct sip_msg *, char *, char *);
@@ -283,7 +293,6 @@ static struct minmax_mos_label_stats global_mos_stats,
 int got_any_mos_pvs;
 
 
-
 static cmd_export_t cmds[] = {
 	{"set_rtpengine_set",	(cmd_function)set_rtpengine_set_f,	1,
 		fixup_set_id, 0,
@@ -1169,16 +1178,26 @@ static int rtpp_test_ping(struct rtpp_node *node)
 
 static void rtpengine_rpc_reload(rpc_t* rpc, void* ctx)
 {
+	time_t tnow;
+
 	if (rtpp_db_url.s == NULL) {
 		// no database
 		rpc->fault(ctx, 500, "No Database URL");
 		return;
 	}
+
 	if(!sr_instance_ready()) {
 		rpc->fault(ctx, 500, "Initializing - try later");
 		return;
 	}
 
+	tnow = time(NULL);
+	if(tnow - _rtpe_list_version->vertime < RTPE_LIST_VERSION_DELAY) {
+		rpc->fault(ctx, 500, "Too short reload interval - try later");
+		return;
+	}
+	_rtpe_list_version->vertime = tnow;
+
 	if (init_rtpproxy_db() < 0) {
 		// fail reloading from database
 		rpc->fault(ctx, 500, "Failed reloading db");
@@ -1186,9 +1205,15 @@ static void rtpengine_rpc_reload(rpc_t* rpc, void* ctx)
 	}
 
 	if (build_rtpp_socks(1, 1)) {
-		rpc->fault(ctx, 500, "Out of memory");
+		rpc->fault(ctx, 500, "Failed to build rtpengine sockets");
 		return;
 	}
+
+	_rtpe_list_version->vernum += 1;
+	_rtpe_list_version->vertime = time(NULL);
+	LM_DBG("current rtpengines list version: %d (%u)\n",
+			_rtpe_list_version->vernum,
+			(unsigned int)_rtpe_list_version->vertime);
 }
 
 static int rtpengine_rpc_iterate(rpc_t* rpc, void* ctx, const str *rtpp_url,
@@ -1473,6 +1498,14 @@ mod_init(void)
 	unsigned short avp_flags;
 	str s;
 
+	_rtpe_list_version = (rtpe_list_version_t*)shm_mallocxz(sizeof(rtpe_list_version_t));
+	if(_rtpe_list_version==NULL) {
+		LM_ERR("no more shm memory for rtpe list version\n");
+		return -1;
+	}
+	_rtpe_list_version->vernum = 1;
+	_rtpe_list_version->vertime = time(NULL);
+
 	if(rtpengine_rpc_init()<0)
 	{
 		LM_ERR("failed to register RPC commands\n");
@@ -1666,13 +1699,15 @@ static int build_rtpp_socks(int lmode, int rtest) {
 	int ip_mtu_discover = IP_PMTUDISC_DONT;
 #endif
 
+	if(_rtpe_list_vernum_local == _rtpe_list_version->vernum) {
+		/* same version for the list of rtpengines */
+		return 0;
+	}
+
 	rtpe_reload_lock_get(rtpp_no_lock);
 	current_rtpp_no = *rtpp_no;
 	rtpe_reload_lock_release(rtpp_no_lock);
 
-	if (current_rtpp_no == rtpp_socks_size)
-		return 0;
-
 	// close current sockets
 	for (i = 0; i < rtpp_socks_size; i++) {
 		if (rtpp_socks[i] >= 0) {
@@ -1690,6 +1725,7 @@ static int build_rtpp_socks(int lmode, int rtest) {
 	memset(rtpp_socks, -1, sizeof(int)*(rtpp_socks_size));
 
 	rtpe_reload_lock_get(rtpp_set_list->rset_head_lock);
+	_rtpe_list_vernum_local = _rtpe_list_version->vernum;
 	for (rtpp_list = rtpp_set_list->rset_first; rtpp_list != 0;
 		rtpp_list = rtpp_list->rset_next) {
 
@@ -1948,6 +1984,10 @@ static void mod_destroy(void)
 	} else {
 		LM_DBG("rtpengine_hash_table_destroy() success!\n");
 	}
+	if(_rtpe_list_version!=NULL) {
+		shm_free(_rtpe_list_version);
+		_rtpe_list_version = NULL;
+	}
 }
 
 




More information about the sr-dev mailing list