Przeglądaj źródła

usrloc: store server_id, connection id and keepalive values for location records

- following the discussion on sr-dev to allow various optimizations for
  db-only mode
Daniel-Constantin Mierla 10 lat temu
rodzic
commit
67e40ec09e

+ 82 - 8
modules/usrloc/ucontact.c

@@ -133,6 +133,8 @@ ucontact_t* new_ucontact(str* _dom, str* _aor, str* _contact, ucontact_info_t* _
 	c->last_modified = _ci->last_modified;
 	c->last_keepalive = _ci->last_modified;
 	c->tcpconn_id = _ci->tcpconn_id;
+	c->server_id = _ci->server_id;
+	c->keepalive = (_ci->cflags & nat_bflag)?1:0;
 #ifdef WITH_XAVP
 	ucontact_xavp_store(c);
 #endif
@@ -464,8 +466,8 @@ int st_flush_ucontact(ucontact_t* _c)
 int db_insert_ucontact(ucontact_t* _c)
 {
 	char* dom;
-	db_key_t keys[18];
-	db_val_t vals[18];
+	db_key_t keys[21];
+	db_val_t vals[21];
 	int nr_cols;
 	
 	if (_c->flags & FL_MEM) {
@@ -622,6 +624,24 @@ int db_insert_ucontact(ucontact_t* _c)
 	vals[nr_cols].val.int_val = (int)_c->reg_id;
 	nr_cols++;
 
+	keys[nr_cols] = &srv_id_col;
+	vals[nr_cols].type = DB1_INT;
+	vals[nr_cols].nul = 0;
+	vals[nr_cols].val.int_val = (int)_c->server_id;
+	nr_cols++;
+
+	keys[nr_cols] = &con_id_col;
+	vals[nr_cols].type = DB1_INT;
+	vals[nr_cols].nul = 0;
+	vals[nr_cols].val.int_val = (int)_c->tcpconn_id;
+	nr_cols++;
+
+	keys[nr_cols] = &keepalive_col;
+	vals[nr_cols].type = DB1_INT;
+	vals[nr_cols].nul = 0;
+	vals[nr_cols].val.int_val = (int)_c->keepalive;
+	nr_cols++;
+
 	if (use_domain) {
 		keys[nr_cols] = &domain_col;
 		vals[nr_cols].type = DB1_STR;
@@ -671,8 +691,8 @@ int db_update_ucontact_addr(ucontact_t* _c)
 	db_val_t vals1[4];
 	int n1 = 0;
 
-	db_key_t keys2[16];
-	db_val_t vals2[16];
+	db_key_t keys2[19];
+	db_val_t vals2[19];
 	int nr_cols2 = 0;
 
 
@@ -853,6 +873,24 @@ int db_update_ucontact_addr(ucontact_t* _c)
 	vals2[nr_cols2].val.int_val = (int)_c->reg_id;
 	nr_cols2++;
 
+	keys2[nr_cols2] = &srv_id_col;
+	vals2[nr_cols2].type = DB1_INT;
+	vals2[nr_cols2].nul = 0;
+	vals2[nr_cols2].val.int_val = (int)_c->server_id;
+	nr_cols2++;
+
+	keys2[nr_cols2] = &con_id_col;
+	vals2[nr_cols2].type = DB1_INT;
+	vals2[nr_cols2].nul = 0;
+	vals2[nr_cols2].val.int_val = (int)_c->tcpconn_id;
+	nr_cols2++;
+
+	keys2[nr_cols2] = &keepalive_col;
+	vals2[nr_cols2].type = DB1_INT;
+	vals2[nr_cols2].nul = 0;
+	vals2[nr_cols2].val.int_val = (int)_c->keepalive;
+	nr_cols2++;
+
 	keys2[nr_cols2] = &contact_col;
 	vals2[nr_cols2].type = DB1_STR;
 	vals2[nr_cols2].nul = 0;
@@ -928,8 +966,8 @@ int db_update_ucontact_ruid(ucontact_t* _c)
 	db_val_t vals1[1];
 	int n1;
 
-	db_key_t keys2[15];
-	db_val_t vals2[15];
+	db_key_t keys2[18];
+	db_val_t vals2[18];
 	int n2;
 
 
@@ -1054,6 +1092,24 @@ int db_update_ucontact_ruid(ucontact_t* _c)
 	vals2[n2].val.int_val = (int)_c->reg_id;
 	n2++;
 
+	keys2[n2] = &srv_id_col;
+	vals2[n2].type = DB1_INT;
+	vals2[n2].nul = 0;
+	vals2[n2].val.int_val = (int)_c->server_id;
+	n2++;
+
+	keys2[n2] = &con_id_col;
+	vals2[n2].type = DB1_INT;
+	vals2[n2].nul = 0;
+	vals2[n2].val.int_val = (int)_c->tcpconn_id;
+	n2++;
+
+	keys2[n2] = &keepalive_col;
+	vals2[n2].type = DB1_INT;
+	vals2[n2].nul = 0;
+	vals2[n2].val.int_val = (int)_c->keepalive;
+	n2++;
+
 	keys2[n2] = &contact_col;
 	vals2[n2].type = DB1_STR;
 	vals2[n2].nul = 0;
@@ -1124,8 +1180,8 @@ int db_update_ucontact_instance(ucontact_t* _c)
 	db_val_t vals1[4];
 	int n1;
 
-	db_key_t keys2[13];
-	db_val_t vals2[13];
+	db_key_t keys2[16];
+	db_val_t vals2[16];
 	int n2;
 
 
@@ -1247,6 +1303,24 @@ int db_update_ucontact_instance(ucontact_t* _c)
 	vals2[n2].val.str_val = _c->callid;
 	n2++;
 
+	keys2[n2] = &srv_id_col;
+	vals2[n2].type = DB1_INT;
+	vals2[n2].nul = 0;
+	vals2[n2].val.bitmap_val = _c->server_id;
+	n2++;
+
+	keys2[n2] = &con_id_col;
+	vals2[n2].type = DB1_INT;
+	vals2[n2].nul = 0;
+	vals2[n2].val.bitmap_val = _c->tcpconn_id;
+	n2++;
+
+	keys2[n2] = &keepalive_col;
+	vals2[n2].type = DB1_INT;
+	vals2[n2].nul = 0;
+	vals2[n2].val.bitmap_val = _c->keepalive;
+	n2++;
+
 	keys2[n2] = &contact_col;
 	vals2[n2].type = DB1_STR;
 	vals2[n2].nul = 0;

+ 40 - 17
modules/usrloc/udomain.c

@@ -214,9 +214,10 @@ void print_udomain(FILE* _f, udomain_t* _d)
  * ua, received, path, socket, methods, last_modified)
  * \param vals database values
  * \param contact contact
+ * \param rcon restore connection id
  * \return pointer to the ucontact_info on success, 0 on failure
  */
-static inline ucontact_info_t* dbrow2info( db_val_t *vals, str *contact)
+static inline ucontact_info_t* dbrow2info(db_val_t *vals, str *contact, int rcon)
 {
 	static ucontact_info_t ci;
 	static str callid, ua, received, host, path;
@@ -342,8 +343,21 @@ static inline ucontact_info_t* dbrow2info( db_val_t *vals, str *contact)
 		ci.reg_id = VAL_UINT(vals+15);
 	}
 
-	/* tcp connection id */
+	/* server_id */
+	if (!VAL_NULL(vals+16)) {
+		ci.server_id = VAL_UINT(vals+16);
+	}
+
+	/* tcp connection id (not restored always) */
 	ci.tcpconn_id = -1;
+	if(rcon==1 && !VAL_NULL(vals+17)) {
+		ci.tcpconn_id = VAL_UINT(vals+17);
+	}
+
+	/* keepalive */
+	if (!VAL_NULL(vals+18)) {
+		ci.keepalive = VAL_UINT(vals+18);
+	}
 
 	return &ci;
 }
@@ -363,7 +377,7 @@ int preload_udomain(db1_con_t* _c, udomain_t* _d)
 	char uri[MAX_URI_SIZE];
 	ucontact_info_t *ci;
 	db_row_t *row;
-	db_key_t columns[18];
+	db_key_t columns[21];
 	db1_res_t* res = NULL;
 	str user, contact;
 	char* domain;
@@ -390,7 +404,10 @@ int preload_udomain(db1_con_t* _c, udomain_t* _d)
 	columns[14] = &ruid_col;
 	columns[15] = &instance_col;
 	columns[16] = &reg_id_col;
-	columns[17] = &domain_col;
+	columns[17] = &srv_id_col;
+	columns[18] = &con_id_col;
+	columns[19] = &keepalive_col;
+	columns[20] = &domain_col;
 
 	if (ul_dbf.use_table(_c, _d->name) < 0) {
 		LM_ERR("sql use_table failed\n");
@@ -402,7 +419,7 @@ int preload_udomain(db1_con_t* _c, udomain_t* _d)
 #endif
 
 	if (DB_CAPABILITY(ul_dbf, DB_CAP_FETCH)) {
-		if (ul_dbf.query(_c, 0, 0, 0, columns, 0, (use_domain)?(18):(17), 0,
+		if (ul_dbf.query(_c, 0, 0, 0, columns, 0, (use_domain)?(21):(20), 0,
 		0) < 0) {
 			LM_ERR("db_query (1) failed\n");
 			return -1;
@@ -412,7 +429,7 @@ int preload_udomain(db1_con_t* _c, udomain_t* _d)
 			return -1;
 		}
 	} else {
-		if (ul_dbf.query(_c, 0, 0, 0, columns, 0, (use_domain)?(18):(17), 0,
+		if (ul_dbf.query(_c, 0, 0, 0, columns, 0, (use_domain)?(21):(20), 0,
 		&res) < 0) {
 			LM_ERR("db_query failed\n");
 			return -1;
@@ -440,7 +457,7 @@ int preload_udomain(db1_con_t* _c, udomain_t* _d)
 			}
 			user.len = strlen(user.s);
 
-			ci = dbrow2info( ROW_VALUES(row)+1, &contact);
+			ci = dbrow2info(ROW_VALUES(row)+1, &contact, 0);
 			if (ci==0) {
 				LM_ERR("sipping record for %.*s in table %s\n",
 						user.len, user.s, _d->name->s);
@@ -448,7 +465,7 @@ int preload_udomain(db1_con_t* _c, udomain_t* _d)
 			}
 
 			if (use_domain) {
-				domain = (char*)VAL_STRING(ROW_VALUES(row) + 17);
+				domain = (char*)VAL_STRING(ROW_VALUES(row) + 20);
 				if (VAL_NULL(ROW_VALUES(row)+17) || domain==0 || domain[0]==0){
 					LM_CRIT("empty domain record for user %.*s...skipping\n",
 							user.len, user.s);
@@ -525,7 +542,7 @@ urecord_t* db_load_urecord(db1_con_t* _c, udomain_t* _d, str *_aor)
 	char tname_buf[64];
 	str tname;
 	ucontact_info_t *ci;
-	db_key_t columns[16];
+	db_key_t columns[19];
 	db_key_t keys[2];
 	db_key_t order;
 	db_val_t vals[2];
@@ -578,6 +595,9 @@ urecord_t* db_load_urecord(db1_con_t* _c, udomain_t* _d, str *_aor)
 	columns[13] = &ruid_col;
 	columns[14] = &instance_col;
 	columns[15] = &reg_id_col;
+	columns[16] = &srv_id_col;
+	columns[17] = &con_id_col;
+	columns[18] = &keepalive_col;
 
 	if (desc_time_order)
 		order = &last_mod_col;
@@ -604,7 +624,7 @@ urecord_t* db_load_urecord(db1_con_t* _c, udomain_t* _d, str *_aor)
 	r = 0;
 
 	for(i = 0; i < RES_ROW_N(res); i++) {
-		ci = dbrow2info(  ROW_VALUES(RES_ROWS(res) + i), &contact);
+		ci = dbrow2info(ROW_VALUES(RES_ROWS(res) + i), &contact, 1);
 		if (ci==0) {
 			LM_ERR("skipping record for %.*s in table %s\n",
 					_aor->len, _aor->s, _d->name->s);
@@ -722,7 +742,7 @@ done:
 urecord_t* db_load_urecord_by_ruid(db1_con_t* _c, udomain_t* _d, str *_ruid)
 {
 	ucontact_info_t *ci;
-	db_key_t columns[18];
+	db_key_t columns[21];
 	db_key_t keys[1];
 	db_key_t order;
 	db_val_t vals[1];
@@ -757,8 +777,11 @@ urecord_t* db_load_urecord_by_ruid(db1_con_t* _c, udomain_t* _d, str *_ruid)
 	columns[13] = &ruid_col;
 	columns[14] = &instance_col;
 	columns[15] = &reg_id_col;
-	columns[16] = &user_col;
-	columns[17] = &domain_col;
+	columns[16] = &srv_id_col;
+	columns[17] = &con_id_col;
+	columns[18] = &keepalive_col;
+	columns[19] = &user_col;
+	columns[20] = &domain_col;
 
 	if (desc_time_order)
 		order = &last_mod_col;
@@ -788,19 +811,19 @@ urecord_t* db_load_urecord_by_ruid(db1_con_t* _c, udomain_t* _d, str *_ruid)
 	/* use first row - shouldn't be more */
 	row = RES_ROWS(res);
 
-	ci = dbrow2info(ROW_VALUES(RES_ROWS(res)), &contact);
+	ci = dbrow2info(ROW_VALUES(RES_ROWS(res)), &contact, 1);
 	if (ci==0) {
 		LM_ERR("skipping record for %.*s in table %s\n",
 				_ruid->len, _ruid->s, _d->name->s);
 		goto done;
 	}
 
-	aor.s = (char*)VAL_STRING(ROW_VALUES(row) + 16);
+	aor.s = (char*)VAL_STRING(ROW_VALUES(row) + 19);
 	aor.len = strlen(aor.s);
 
 	if (use_domain) {
-		domain.s = (char*)VAL_STRING(ROW_VALUES(row) + 17);
-		if (VAL_NULL(ROW_VALUES(row)+17) || domain.s==0 || domain.s[0]==0){
+		domain.s = (char*)VAL_STRING(ROW_VALUES(row) + 20);
+		if (VAL_NULL(ROW_VALUES(row)+20) || domain.s==0 || domain.s[0]==0){
 			LM_CRIT("empty domain record for user %.*s...skipping\n",
 					aor.len, aor.s);
 			goto done;

+ 9 - 0
modules/usrloc/ul_mod.c

@@ -78,6 +78,9 @@ MODULE_VERSION
 #define INSTANCE_COL   "instance"
 #define REG_ID_COL     "reg_id"
 #define LAST_MOD_COL   "last_modified"
+#define SRV_ID_COL     "server_id"
+#define CON_ID_COL     "connection_id"
+#define KEEPALIVE_COL  "keepalive"
 
 #define ULATTRS_USER_COL       "username"
 #define ULATTRS_DOMAIN_COL     "domain"
@@ -137,6 +140,9 @@ str methods_col     = str_init(METHODS_COL);	/*!< Name of column containing the
 str instance_col    = str_init(INSTANCE_COL);	/*!< Name of column containing the SIP instance value */
 str reg_id_col      = str_init(REG_ID_COL);		/*!< Name of column containing the reg-id value */
 str last_mod_col    = str_init(LAST_MOD_COL);	/*!< Name of column containing the last modified date */
+str srv_id_col      = str_init(REG_ID_COL);		/*!< Name of column containing the server id value */
+str con_id_col      = str_init(REG_ID_COL);		/*!< Name of column containing the connection id value */
+str keepalive_col   = str_init(REG_ID_COL);		/*!< Name of column containing the keepalive value */
 
 str ulattrs_user_col   = str_init(ULATTRS_USER_COL);   /*!< Name of column containing username */
 str ulattrs_domain_col = str_init(ULATTRS_DOMAIN_COL); /*!< Name of column containing domain */
@@ -202,6 +208,9 @@ static param_export_t params[] = {
 	{"methods_column",      PARAM_STR, &methods_col   },
 	{"instance_column",     PARAM_STR, &instance_col  },
 	{"reg_id_column",       PARAM_STR, &reg_id_col    },
+	{"server_id_column",    PARAM_STR, &srv_id_col    },
+	{"connection_id_column",PARAM_STR, &con_id_col    },
+	{"keepalive_column",    PARAM_STR, &keepalive_col },
 	{"matching_mode",       INT_PARAM, &matching_mode   },
 	{"cseq_delay",          INT_PARAM, &cseq_delay      },
 	{"fetch_rows",          INT_PARAM, &ul_fetch_rows   },

+ 4 - 1
modules/usrloc/ul_mod.h

@@ -39,7 +39,7 @@
  */
 
 
-#define UL_TABLE_VERSION 6
+#define UL_TABLE_VERSION 7
 
 extern str ruid_col;
 extern str user_col;
@@ -58,6 +58,9 @@ extern str sock_col;
 extern str methods_col;
 extern str instance_col;
 extern str reg_id_col;
+extern str srv_id_col;
+extern str con_id_col;
+extern str keepalive_col;
 extern str last_mod_col;
 
 extern str ulattrs_user_col;

+ 6 - 2
modules/usrloc/usrloc.h

@@ -90,7 +90,9 @@ typedef struct ucontact {
 	unsigned int methods;   /*!< Supported methods */
 	str instance;           /*!< SIP instance value - gruu */
 	unsigned int reg_id;    /*!< reg-id parameters */
-	int tcpconn_id;          /* unique tcp connection id */
+	int server_id;          /*!< server id */
+	int tcpconn_id;         /*!< unique tcp connection id */
+	int keepalive;          /*!< keepalive */
 #ifdef WITH_XAVP
 	sr_xavp_t * xavp;       /*!< per contact xavps */
 #endif
@@ -116,7 +118,9 @@ typedef struct ucontact_info {
 	unsigned int methods;     /*!< supported methods */
 	str instance;             /*!< SIP instance value - gruu */
 	unsigned int reg_id;      /*!< reg-id parameters */
-	int tcpconn_id;
+	int server_id;            /*!< server id */
+	int tcpconn_id;           /*!< connection id */
+	int keepalive;            /*!< keepalive */
 #ifdef WITH_XAVP
 	sr_xavp_t * xavp;         /*!< per contact xavps */
 #endif