From 5192377be91a09b48476944b05c3ec182758e88c Mon Sep 17 00:00:00 2001 From: Stefan Mititelu Date: Tue, 17 Nov 2015 12:39:22 +0200 Subject: [PATCH] rtpengine: Add db 'disabled' column Able to load rtp nodes state from database. Add "disabled" column with disabled_col modparam: - if disabled != 0, disable the node permanent (similar to disabling it manually using kamctl fifo command) - if disabled == 0, keep the current behaviour (set ticks to 0, ping and disable temporary in case the node is not responding) --- modules/rtpengine/doc/rtpengine_admin.xml | 21 ++++++++++++++++++ modules/rtpengine/rtpengine.c | 26 ++++++++++++----------- modules/rtpengine/rtpengine.h | 6 +++++- modules/rtpengine/rtpengine_db.c | 19 +++++++++++++---- 4 files changed, 55 insertions(+), 17 deletions(-) diff --git a/modules/rtpengine/doc/rtpengine_admin.xml b/modules/rtpengine/doc/rtpengine_admin.xml index 8b623c8c112..b29a1087d6e 100644 --- a/modules/rtpengine/doc/rtpengine_admin.xml +++ b/modules/rtpengine/doc/rtpengine_admin.xml @@ -453,6 +453,27 @@ modparam("rtpengine", "hash_table_size", "123") ... modparam("rtpengine", "hash_table_tout", "300") ... + + + + + +
+ <varname>disabled_col</varname> (string) + + Column name in the rtpproxy table. If database mode is activated, + set the state of rtp nodes according to this column, on startup. + The MySQL value for this column is INT. + + + By default, the column name is "disabled". + + + Set <varname>disabled_col</varname> parameter + +... +modparam("rtpengine", "disabled_col", "disabled_column_name") +...
diff --git a/modules/rtpengine/rtpengine.c b/modules/rtpengine/rtpengine.c index bba10efc4b7..016d82c6d06 100644 --- a/modules/rtpengine/rtpengine.c +++ b/modules/rtpengine/rtpengine.c @@ -103,9 +103,6 @@ MODULE_VERSION #define MI_SET_NATPING_STATE "nh_enable_ping" #define MI_DEFAULT_NATPING_STATE 1 -#define MI_MIN_RECHECK_TICKS 0 -#define MI_MAX_RECHECK_TICKS (unsigned int)-1 - #define MI_ENABLE_RTP_PROXY "nh_enable_rtpp" #define MI_SHOW_RTP_PROXIES "nh_show_rtpp" #define MI_PING_RTP_PROXY "nh_ping_rtpp" @@ -338,9 +335,10 @@ static param_export_t params[] = { {"rtpengine_tout_ms", INT_PARAM, &rtpengine_tout_ms }, {"rtpengine_allow_op", INT_PARAM, &rtpengine_allow_op }, {"queried_nodes_limit", INT_PARAM, &queried_nodes_limit }, - {"db_url", PARAM_STR, &rtpp_db_url }, - {"table_name", PARAM_STR, &rtpp_table_name }, - {"url_col", PARAM_STR, &rtpp_url_col }, + {"db_url", PARAM_STR, &rtpp_db_url }, + {"table_name", PARAM_STR, &rtpp_table_name }, + {"url_col", PARAM_STR, &rtpp_url_col }, + {"disabled_col", PARAM_STR, &rtpp_disabled_col }, {"extra_id_pv", PARAM_STR, &extra_id_pv_param }, {"setid_avp", PARAM_STRING, &setid_avp_param }, {"force_send_interface", PARAM_STRING, &force_send_ip_str }, @@ -644,7 +642,7 @@ struct rtpp_set *get_rtpp_set(int set_id) } -int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy) +int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabled, unsigned int ticks) { /* Make rtp proxies list. */ char *p, *p1, *p2, *plim; @@ -679,10 +677,14 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy) } memset(pnode, 0, sizeof(*pnode)); pnode->idx = rtpp_no++; - pnode->rn_recheck_ticks = 0; + if (ticks == MI_MAX_RECHECK_TICKS) { + pnode->rn_recheck_ticks = ticks; + } else { + pnode->rn_recheck_ticks = ticks + get_ticks(); + } pnode->rn_weight = weight; pnode->rn_umode = 0; - pnode->rn_disabled = 0; + pnode->rn_disabled = disabled; pnode->rn_url.s = shm_malloc(p2 - p1 + 1); if (pnode->rn_url.s == NULL) { shm_free(pnode); @@ -775,7 +777,7 @@ static int rtpengine_add_rtpengine_set( char * rtp_proxies) if (rtpp_list != NULL) { - if (add_rtpengine_socks(rtpp_list, rtp_proxies) != 0) + if (add_rtpengine_socks(rtpp_list, rtp_proxies, 0, 0) != 0) goto error; else return 0; @@ -2114,8 +2116,8 @@ rtpp_test(struct rtpp_node *node, int isdisabled, int force) cp = send_rtpp_command(node, dict, &ret); if (!cp) { - node->rn_disabled = 1; - node->rn_recheck_ticks = get_ticks() + rtpengine_disable_tout; + node->rn_disabled = 1; + node->rn_recheck_ticks = get_ticks() + rtpengine_disable_tout; LM_ERR("proxy did not respond to ping\n"); goto error; } diff --git a/modules/rtpengine/rtpengine.h b/modules/rtpengine/rtpengine.h index 71ce2645485..5d46b5bb4e2 100644 --- a/modules/rtpengine/rtpengine.h +++ b/modules/rtpengine/rtpengine.h @@ -26,6 +26,9 @@ #include "bencode.h" #include "../../str.h" +#define MI_MIN_RECHECK_TICKS 0 +#define MI_MAX_RECHECK_TICKS (unsigned int)-1 + struct rtpp_node { unsigned int idx; /* overall index */ str rn_url; /* unparsed, deletable */ @@ -59,7 +62,7 @@ struct rtpp_set_head{ struct rtpp_set *get_rtpp_set(int set_id); -int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy); +int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabled, unsigned int ticks); int init_rtpproxy_db(void); @@ -67,6 +70,7 @@ int init_rtpproxy_db(void); extern str rtpp_db_url; extern str rtpp_table_name; extern str rtpp_url_col; +extern str rtpp_disabled_col; #endif diff --git a/modules/rtpengine/rtpengine_db.c b/modules/rtpengine/rtpengine_db.c index 82c64bb4a1a..bd4f08fcd86 100644 --- a/modules/rtpengine/rtpengine_db.c +++ b/modules/rtpengine/rtpengine_db.c @@ -34,6 +34,7 @@ str rtpp_db_url = {NULL, 0}; str rtpp_table_name = str_init("rtpproxy"); str rtpp_set_id_col = str_init("set_id"); str rtpp_url_col = str_init("url"); +str rtpp_disabled_col = str_init("disabled"); static int rtpp_connect_db(void) { @@ -63,13 +64,16 @@ static int rtpp_load_db(void) db1_res_t *res = NULL; db_val_t *values = NULL; db_row_t *rows = NULL; - db_key_t query_cols[] = {&rtpp_set_id_col, &rtpp_url_col}; + db_key_t query_cols[] = {&rtpp_set_id_col, &rtpp_url_col, &rtpp_disabled_col}; str url; int set_id; + int disabled; + unsigned int ticks; + /* int weight, flags; */ int n_rows = 0; - int n_cols = 2; + int n_cols = 3; if (rtpp_db_handle == NULL) { @@ -101,6 +105,12 @@ static int rtpp_load_db(void) set_id = VAL_INT(values); url.s = VAL_STR(values+1).s; url.len = strlen(url.s); + disabled = VAL_INT(values+2); + if (disabled) { + ticks = MI_MAX_RECHECK_TICKS; + } else { + ticks = 0; + } /* weight = VAL_INT(values+2); flags = VAL_INT(values+3); @@ -111,9 +121,10 @@ static int rtpp_load_db(void) continue; } - if (add_rtpengine_socks(rtpp_list, url.s) != 0) + if (add_rtpengine_socks(rtpp_list, url.s, disabled, ticks) != 0) { - LM_ERR("error inserting '%.*s' into set %d\n", url.len, url.s, set_id); + LM_ERR("error inserting '%.*s' into set %d disabled=%d\n", + url.len, url.s, set_id, disabled); } }