소스 검색

rtpengine: Add db 'weight' column

Add weight column with weight_col modparam.
Updated doku.
Stefan Mititelu 9 년 전
부모
커밋
410151eb6c
4개의 변경된 파일53개의 추가작업 그리고 27개의 파일을 삭제
  1. 31 9
      modules/rtpengine/doc/rtpengine_admin.xml
  2. 12 10
      modules/rtpengine/rtpengine.c
  3. 2 1
      modules/rtpengine/rtpengine.h
  4. 8 7
      modules/rtpengine/rtpengine_db.c

+ 31 - 9
modules/rtpengine/doc/rtpengine_admin.xml

@@ -510,17 +510,18 @@ mysql> describe rtpengine;
 | Field    | Type             | Null | Key | Default | Extra |
 +----------+------------------+------+-----+---------+-------+
 | setid    | int(10) unsigned | NO   |     | NULL    |       |
-| url      | varchar(64)      | NO   |     | NULL    |       |
+| url      | varchar(256)     | NO   |     | NULL    |       |
+| weight   | int(10) unsigned | NO   |     | NULL    |       |
 | disabled | int(11)          | NO   |     | NULL    |       |
 +----------+------------------+------+-----+---------+-------+
 
 mysql> select * from rtpengine;
-+-------+---------------------------+----------+
-| setid | url                       | disabled |
-+-------+---------------------------+----------+
-|     0 | udp:rtpproxy1.domain:8800 |        0 |
-|     0 | udp:rtpproxy2.domain:8800 |        1 |
-+-------+---------------------------+----------+
++-------+---------------------------+--------+----------+
+| setid | url                       | weight | disabled |
++-------+---------------------------+--------+----------+
+|     0 | udp:rtpproxy1.domain:8800 |    100 |        0 |
+|     0 | udp:rtpproxy2.domain:8800 |    200 |        1 |
++-------+---------------------------+--------+----------+
 
 mysql> select * from version;
 +---------------------------+---------------+
@@ -528,7 +529,6 @@ mysql> select * from version;
 +---------------------------+---------------+
 | rtpengine                 |             1 |
 +---------------------------+---------------+
-...
 </programlisting>
 		</example>
 	</section>
@@ -560,7 +560,7 @@ modparam("rtpengine", "setid_col", "setid_column_name")
 		<para>
 			Column name in the rtpengine table. If database mode is activated (i.e. valid db_url),
 			set the url of rtp nodes according to this column, on startup.
-			The MySQL value for this column should be INT UNSIGNED.
+			The MySQL value for this column should be VARCHAR.
 		</para>
 		<para>
 			By default, the column name is "url".
@@ -576,6 +576,28 @@ modparam("rtpengine", "url_col", "url_column_name")
 	</section>
 
 
+	<section id="rtpengine.p.weight_col">
+		<title><varname>weight_col</varname> (string)</title>
+		<para>
+			Column name in the rtpengine table. If database mode is activated (i.e. valid db_url),
+			set the weight of rtp nodes according to this column, on startup. The column value has
+			priority over the URL weight.
+			The MySQL value for this column should be INT UNSIGNED.
+		</para>
+		<para>
+			By default, the column name is "weight".
+		</para>
+		<example>
+		<title>Set <varname>weight_col</varname> parameter</title>
+<programlisting format="linespecific">
+...
+modparam("rtpengine", "weight_col", "weight_column_name")
+...
+</programlisting>
+		</example>
+	</section>
+
+
 	<section id="rtpengine.p.disabled_col">
 		<title><varname>disabled_col</varname> (string)</title>
 		<para>

+ 12 - 10
modules/rtpengine/rtpengine.c

@@ -204,7 +204,7 @@ static char *send_rtpp_command(struct rtpp_node *, bencode_item_t *, int *);
 static int get_extra_id(struct sip_msg* msg, str *id_str);
 
 static int rtpengine_set_store(modparam_t type, void * val);
-static int rtpengine_add_rtpengine_set(char * rtp_proxies, int disabled, unsigned int ticks);
+static int rtpengine_add_rtpengine_set(char * rtp_proxies, unsigned int weight, int disabled, unsigned int ticks);
 
 static int mod_init(void);
 static int child_init(int);
@@ -348,6 +348,7 @@ static param_export_t params[] = {
 	{"table_name",            PARAM_STR, &rtpp_table_name        },
 	{"setid_col",             PARAM_STR, &rtpp_setid_col         },
 	{"url_col",               PARAM_STR, &rtpp_url_col           },
+	{"weight_col",            PARAM_STR, &rtpp_weight_col        },
 	{"disabled_col",          PARAM_STR, &rtpp_disabled_col      },
 	{"extra_id_pv",           PARAM_STR, &extra_id_pv_param      },
 	{"setid_avp",             PARAM_STRING, &setid_avp_param     },
@@ -677,19 +678,20 @@ struct rtpp_set *get_rtpp_set(int set_id)
 }
 
 
-int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabled, unsigned int ticks)
+int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy,
+			unsigned int weight, int disabled, unsigned int ticks)
 {
 	/* Make rtp proxies list. */
 	char *p, *p1, *p2, *plim;
 	struct rtpp_node *pnode;
 	struct rtpp_node *rtpp_node;
-	int weight;
+	int local_weight;
 
 	p = rtpproxy;
 	plim = p + strlen(p);
 
 	for(;;) {
-			weight = 1;
+		local_weight = weight;
 		while (*p && isspace((int)*p))
 			++p;
 		if (p >= plim)
@@ -702,7 +704,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl
 		/* Have weight specified? If yes, scan it */
 		p2 = memchr(p1, '=', p - p1);
 		if (p2 != NULL) {
-			weight = strtoul(p2 + 1, NULL, 10);
+			local_weight = strtoul(p2 + 1, NULL, 10);
 		} else {
 			p2 = p;
 		}
@@ -718,7 +720,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl
 		} else {
 			pnode->rn_recheck_ticks = ticks + get_ticks();
 		}
-		pnode->rn_weight = weight;
+		pnode->rn_weight = local_weight;
 		pnode->rn_umode = 0;
 		pnode->rn_disabled = disabled;
 		pnode->rn_url.s = shm_malloc(p2 - p1 + 1);
@@ -744,7 +746,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl
 			pnode->rn_address += 5;
 		}
 
-		// if node found in set, update it for disabled state
+		// if node found in set, update it
 		rtpp_node = get_rtpp_node(rtpp_list, &pnode->rn_url);
 		if (rtpp_node) {
 			rtpp_node->rn_disabled = pnode->rn_disabled;
@@ -770,7 +772,7 @@ int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabl
 /*	0-succes
  *  -1 - erorr
  * */
-static int rtpengine_add_rtpengine_set(char * rtp_proxies, int disabled, unsigned int ticks)
+static int rtpengine_add_rtpengine_set(char * rtp_proxies, unsigned int weight, int disabled, unsigned int ticks)
 {
 	char *p,*p2;
 	struct rtpp_set * rtpp_list;
@@ -824,7 +826,7 @@ static int rtpengine_add_rtpengine_set(char * rtp_proxies, int disabled, unsigne
 	if (rtpp_list != NULL)
 	{
 
-		if (add_rtpengine_socks(rtpp_list, rtp_proxies, disabled, ticks) != 0)
+		if (add_rtpengine_socks(rtpp_list, rtp_proxies, weight, disabled, ticks) != 0)
 			goto error;
 		else
 			return 0;
@@ -1474,7 +1476,7 @@ mod_init(void)
 	{
 		/* storing the list of rtp proxy sets in shared memory*/
 		for(i=0;i<rtpp_sets;i++){
-			if(rtpengine_add_rtpengine_set(rtpp_strings[i], 0, 0) !=0){
+			if(rtpengine_add_rtpengine_set(rtpp_strings[i], 1, 0, 0) !=0){
 				for(;i<rtpp_sets;i++)
 					if(rtpp_strings[i])
 						pkg_free(rtpp_strings[i]);

+ 2 - 1
modules/rtpengine/rtpengine.h

@@ -63,7 +63,7 @@ struct rtpp_set_head{
 
 struct rtpp_node *get_rtpp_node(struct rtpp_set *rtpp_list, str *url);
 struct rtpp_set *get_rtpp_set(int set_id);
-int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, int disabled, unsigned int ticks);
+int add_rtpengine_socks(struct rtpp_set * rtpp_list, char * rtpproxy, unsigned int weight, int disabled, unsigned int ticks);
 
 
 int init_rtpproxy_db(void);
@@ -72,6 +72,7 @@ extern str rtpp_db_url;
 extern str rtpp_table_name;
 extern str rtpp_setid_col;
 extern str rtpp_url_col;
+extern str rtpp_weight_col;
 extern str rtpp_disabled_col;
 
 

+ 8 - 7
modules/rtpengine/rtpengine_db.c

@@ -34,6 +34,7 @@ str rtpp_db_url = {NULL, 0};
 str rtpp_table_name = str_init("rtpengine");
 str rtpp_setid_col = str_init("setid");
 str rtpp_url_col = str_init("url");
+str rtpp_weight_col = str_init("weight");
 str rtpp_disabled_col = str_init("disabled");
 
 static int rtpp_connect_db(void)
@@ -64,16 +65,15 @@ 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_setid_col, &rtpp_url_col, &rtpp_disabled_col};
+	db_key_t query_cols[] = {&rtpp_setid_col, &rtpp_url_col, &rtpp_weight_col, &rtpp_disabled_col};
 
 	str url;
-	int setid;
-	int disabled;
-	unsigned int ticks;
+	int setid, disabled;
+	unsigned int weight, ticks;
 
 	/* int weight, flags; */
 	int n_rows = 0;
-	int n_cols = 3;
+	int n_cols = 4;
 
 	if (rtpp_db_handle == NULL)
 	{
@@ -105,7 +105,8 @@ static int rtpp_load_db(void)
 		setid = VAL_INT(values);
 		url.s = VAL_STR(values+1).s;
 		url.len = strlen(url.s);
-		disabled = VAL_INT(values+2);
+		weight = VAL_INT(values+2);
+		disabled = VAL_INT(values+3);
 		if (disabled) {
 			ticks = MI_MAX_RECHECK_TICKS;
 		} else {
@@ -121,7 +122,7 @@ static int rtpp_load_db(void)
 			continue;
 		}
 
-		if (add_rtpengine_socks(rtpp_list, url.s, disabled, ticks) !=  0)
+		if (add_rtpengine_socks(rtpp_list, url.s, weight, disabled, ticks) !=  0)
 		{
 			LM_ERR("error inserting '%.*s' into set %d disabled=%d\n",
 				url.len, url.s, setid, disabled);