Module: kamailio
Branch: master
Commit: 785ede5bacfe55e88381ae8f7d672b24ec4b8cf6
URL:
https://github.com/kamailio/kamailio/commit/785ede5bacfe55e88381ae8f7d672b2…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)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/785ede5bacfe55e88381ae8f7d672b2…
Patch:
https://github.com/kamailio/kamailio/commit/785ede5bacfe55e88381ae8f7d672b2…
---
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;
+ }
}