ソースを参照

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)
Stefan Mititelu 9 年 前
コミット
5192377be9

+ 21 - 0
modules/rtpengine/doc/rtpengine_admin.xml

@@ -453,6 +453,27 @@ modparam("rtpengine", "hash_table_size", "123")
 ...
 ...
 modparam("rtpengine", "hash_table_tout", "300")
 modparam("rtpengine", "hash_table_tout", "300")
 ...
 ...
+</programlisting>
+                </example>
+        </section>
+
+
+	<section id="rtpengine.p.disabled_col">
+		<title><varname>disabled_col</varname> (string)</title>
+		<para>
+			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.
+		</para>
+		<para>
+			By default, the column name is "disabled".
+		</para>
+		<example>
+		<title>Set <varname>disabled_col</varname> parameter</title>
+<programlisting format="linespecific">
+...
+modparam("rtpengine", "disabled_col", "disabled_column_name")
+...
 </programlisting>
 </programlisting>
 		</example>
 		</example>
 	</section>
 	</section>

+ 14 - 12
modules/rtpengine/rtpengine.c

@@ -103,9 +103,6 @@ MODULE_VERSION
 #define MI_SET_NATPING_STATE		"nh_enable_ping"
 #define MI_SET_NATPING_STATE		"nh_enable_ping"
 #define MI_DEFAULT_NATPING_STATE	1
 #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_ENABLE_RTP_PROXY			"nh_enable_rtpp"
 #define MI_SHOW_RTP_PROXIES			"nh_show_rtpp"
 #define MI_SHOW_RTP_PROXIES			"nh_show_rtpp"
 #define MI_PING_RTP_PROXY           "nh_ping_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_tout_ms",     INT_PARAM, &rtpengine_tout_ms      },
 	{"rtpengine_allow_op",    INT_PARAM, &rtpengine_allow_op     },
 	{"rtpengine_allow_op",    INT_PARAM, &rtpengine_allow_op     },
 	{"queried_nodes_limit",   INT_PARAM, &queried_nodes_limit    },
 	{"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 },
 	{"extra_id_pv",           PARAM_STR, &extra_id_pv_param },
 	{"setid_avp",             PARAM_STRING, &setid_avp_param },
 	{"setid_avp",             PARAM_STRING, &setid_avp_param },
 	{"force_send_interface",  PARAM_STRING, &force_send_ip_str	},
 	{"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. */
 	/* Make rtp proxies list. */
 	char *p, *p1, *p2, *plim;
 	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));
 		memset(pnode, 0, sizeof(*pnode));
 		pnode->idx = rtpp_no++;
 		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_weight = weight;
 		pnode->rn_umode = 0;
 		pnode->rn_umode = 0;
-		pnode->rn_disabled = 0;
+		pnode->rn_disabled = disabled;
 		pnode->rn_url.s = shm_malloc(p2 - p1 + 1);
 		pnode->rn_url.s = shm_malloc(p2 - p1 + 1);
 		if (pnode->rn_url.s == NULL) {
 		if (pnode->rn_url.s == NULL) {
 			shm_free(pnode);
 			shm_free(pnode);
@@ -775,7 +777,7 @@ static int rtpengine_add_rtpengine_set( char * rtp_proxies)
 
 
 	if (rtpp_list != NULL)
 	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;
 			goto error;
 		else
 		else
 			return 0;
 			return 0;
@@ -2114,8 +2116,8 @@ rtpp_test(struct rtpp_node *node, int isdisabled, int force)
 
 
 	cp = send_rtpp_command(node, dict, &ret);
 	cp = send_rtpp_command(node, dict, &ret);
 	if (!cp) {
 	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");
 		LM_ERR("proxy did not respond to ping\n");
 		goto error;
 		goto error;
 	}
 	}

+ 5 - 1
modules/rtpengine/rtpengine.h

@@ -26,6 +26,9 @@
 #include "bencode.h"
 #include "bencode.h"
 #include "../../str.h"
 #include "../../str.h"
 
 
+#define MI_MIN_RECHECK_TICKS		0
+#define MI_MAX_RECHECK_TICKS		(unsigned int)-1
+
 struct rtpp_node {
 struct rtpp_node {
 	unsigned int		idx;			/* overall index */
 	unsigned int		idx;			/* overall index */
 	str					rn_url;			/* unparsed, deletable */
 	str					rn_url;			/* unparsed, deletable */
@@ -59,7 +62,7 @@ struct rtpp_set_head{
 
 
 
 
 struct rtpp_set *get_rtpp_set(int set_id);
 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);
 int init_rtpproxy_db(void);
@@ -67,6 +70,7 @@ int init_rtpproxy_db(void);
 extern str rtpp_db_url;
 extern str rtpp_db_url;
 extern str rtpp_table_name;
 extern str rtpp_table_name;
 extern str rtpp_url_col;
 extern str rtpp_url_col;
+extern str rtpp_disabled_col;
 
 
 
 
 #endif
 #endif

+ 15 - 4
modules/rtpengine/rtpengine_db.c

@@ -34,6 +34,7 @@ str rtpp_db_url = {NULL, 0};
 str rtpp_table_name = str_init("rtpproxy");
 str rtpp_table_name = str_init("rtpproxy");
 str rtpp_set_id_col = str_init("set_id");
 str rtpp_set_id_col = str_init("set_id");
 str rtpp_url_col = str_init("url");
 str rtpp_url_col = str_init("url");
+str rtpp_disabled_col = str_init("disabled");
 
 
 static int rtpp_connect_db(void)
 static int rtpp_connect_db(void)
 {
 {
@@ -63,13 +64,16 @@ static int rtpp_load_db(void)
 	db1_res_t *res = NULL;
 	db1_res_t *res = NULL;
 	db_val_t *values = NULL;
 	db_val_t *values = NULL;
 	db_row_t *rows = 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;
 	str url;
 	int set_id;
 	int set_id;
+	int disabled;
+	unsigned int ticks;
+
 	/* int weight, flags; */
 	/* int weight, flags; */
 	int n_rows = 0;
 	int n_rows = 0;
-	int n_cols = 2;
+	int n_cols = 3;
 
 
 	if (rtpp_db_handle == NULL)
 	if (rtpp_db_handle == NULL)
 	{
 	{
@@ -101,6 +105,12 @@ static int rtpp_load_db(void)
 		set_id = VAL_INT(values);
 		set_id = VAL_INT(values);
 		url.s = VAL_STR(values+1).s;
 		url.s = VAL_STR(values+1).s;
 		url.len = strlen(url.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);
 		weight = VAL_INT(values+2);
 		flags = VAL_INT(values+3);
 		flags = VAL_INT(values+3);
@@ -111,9 +121,10 @@ static int rtpp_load_db(void)
 			continue;
 			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);
 		}
 		}
 	}
 	}