Skip to content

Commit

Permalink
usrloc: Organize mod_init() code
Browse files Browse the repository at this point in the history
Also remove the "init_flag" concept -- even if a module binds the usrloc
API functions before usrloc is initialized, this is completely fine!
  • Loading branch information
liviuchircu committed Mar 26, 2020
1 parent 25d37b6 commit fbfd800
Show file tree
Hide file tree
Showing 5 changed files with 153 additions and 136 deletions.
2 changes: 1 addition & 1 deletion modules/usrloc/ul_callback.c
Expand Up @@ -39,7 +39,7 @@

struct ulcb_head_list *ulcb_list;

int init_ulcb_list(void)
int ul_init_cbs(void)
{
ulcb_list = shm_malloc(sizeof *ulcb_list);
if (!ulcb_list) {
Expand Down
2 changes: 1 addition & 1 deletion modules/usrloc/ul_callback.h
Expand Up @@ -86,7 +86,7 @@ extern struct ulcb_head_list* ulcb_list;
( (ulcb_list->reg_types)&(_types_) )


int init_ulcb_list();
int ul_init_cbs();

void destroy_ulcb_list();

Expand Down
273 changes: 149 additions & 124 deletions modules/usrloc/ul_mod.c
Expand Up @@ -86,7 +86,9 @@ static void destroy(void); /*!< Module destroy */
static void _synchronize_all_udomains(unsigned int ticks, void* param);
static int child_init(int rank); /*!< Per-child init function */
static int mi_child_init(void);
int check_runtime_config(void);
int ul_init_globals(void);
int ul_check_config(void);
int ul_check_db(void);
int ul_deprec_shp(modparam_t _, void *modparam);

//static int add_replication_dest(modparam_t type, void *val);
Expand Down Expand Up @@ -159,7 +161,6 @@ int ul_hash_size = 9;
/* flag */
unsigned int nat_bflag = (unsigned int)-1;
static char *nat_bflag_str = 0;
unsigned int init_flag = 0;

/**
* A global SIP user location cluster. It must include all
Expand Down Expand Up @@ -363,143 +364,32 @@ struct module_exports exports = {
*/
static int mod_init(void)
{
unsigned int db_caps;
int idx;

LM_DBG("initializing\n");

/* Compute the lengths of string parameters */
init_db_url( db_url , 1 /*can be null*/);
contactid_col.len = strlen(contactid_col.s);
user_col.len = strlen(user_col.s);
domain_col.len = strlen(domain_col.s);
contact_col.len = strlen(contact_col.s);
expires_col.len = strlen(expires_col.s);
q_col.len = strlen(q_col.s);
callid_col.len = strlen(callid_col.s);
cseq_col.len = strlen(cseq_col.s);
flags_col.len = strlen(flags_col.s);
cflags_col.len = strlen(cflags_col.s);
user_agent_col.len = strlen(user_agent_col.s);
received_col.len = strlen(received_col.s);
path_col.len = strlen(path_col.s);
sock_col.len = strlen(sock_col.s);
methods_col.len = strlen(methods_col.s);
sip_instance_col.len = strlen(sip_instance_col.s);
kv_store_col.len = strlen(kv_store_col.s);
attr_col.len = strlen(attr_col.s);
last_mod_col.len = strlen(last_mod_col.s);

if (ul_hash_size > 16) {
LM_WARN("hash too big! max 2 ^ 16\n");
if (ul_init_globals() != 0) {
LM_ERR("failed to init globals\n");
return -1;
}

if(ul_hash_size<=1)
ul_hash_size = 512;
else
ul_hash_size = 1<<ul_hash_size;
ul_locks_no = ul_hash_size;

if (check_runtime_config() != 0) {
if (ul_check_config() != 0) {
LM_ERR("bad runtime config - exiting...\n");
return -1;
}

if (have_cdb_conns()) {
cdb_url.len = strlen(cdb_url.s);

if (cachedb_bind_mod(&cdb_url, &cdbf) < 0) {
LM_ERR("cannot bind functions for cachedb_url %.*s\n",
cdb_url.len, cdb_url.s);
return -1;
}

if (!CACHEDB_CAPABILITY(&cdbf, CACHEDB_CAP_COL_ORIENTED)) {
LM_ERR("not enough capabilities for cachedb_url %.*s\n",
cdb_url.len, cdb_url.s);
return -1;
}
}

if (cluster_mode != CM_NONE || rr_persist == RRP_LOAD_FROM_SQL) {
cid_keys = pkg_malloc(max_contact_delete *
(sizeof(db_key_t) + sizeof(db_val_t)));
if (cid_keys == NULL) {
LM_ERR("no more pkg memory\n");
return -1;
}

cid_vals = (db_val_t *)(cid_keys + max_contact_delete);
for (idx=0; idx < max_contact_delete; idx++) {
VAL_TYPE(cid_vals+idx) = DB_BIGINT;
VAL_NULL(cid_vals+idx) = 0;
cid_keys[idx] = &contactid_col;
}
}

/* check matching mode */
switch (matching_mode) {
case CT_MATCH_CONTACT_ONLY:
case CT_MATCH_CONTACT_CALLID:
break;
default:
LM_ERR("invalid matching mode %d\n", matching_mode);
}

if(ul_init_locks()!=0)
{
LM_ERR("locks array initialization failed\n");
if (ul_check_db() != 0) {
LM_ERR("DB support check failed\n");
return -1;
}

/* Register cache timer */
register_timer( "ul-timer", _synchronize_all_udomains, 0, timer_interval,
TIMER_FLAG_DELAY_ON_DELAY);
register_timer("ul-timer", _synchronize_all_udomains, 0, timer_interval,
TIMER_FLAG_DELAY_ON_DELAY);

/* init the callbacks list */
if ( init_ulcb_list() < 0) {
if (ul_init_cbs() < 0) {
LM_ERR("usrloc/callbacks initialization failed\n");
return -1;
}

/* use database if needed */
if (cluster_mode == CM_SQL_ONLY || rr_persist == RRP_LOAD_FROM_SQL) {
if (db_url.s==NULL || db_url.len==0) {
LM_ERR("selected mode requires a db connection -> db_url \n");
return -1;
}
if (db_bind_mod(&db_url, &ul_dbf) < 0) { /* Find database module */
LM_ERR("failed to bind database module\n");
return -1;
}
db_caps = DB_CAP_ALL;
if (cluster_mode == CM_SQL_ONLY)
db_caps |= DB_CAP_RAW_QUERY;
if (!DB_CAPABILITY(ul_dbf, db_caps)) {
LM_ERR("database module does not implement all functions"
" needed by the module\n");
return -1;
}
if (rr_persist == RRP_LOAD_FROM_SQL) {
if (!(sync_lock = lock_init_rw())) {
LM_ERR("cannot init rw lock\n");
return -1;
}
}
}

nat_bflag = get_flag_id_by_name(FLAG_TYPE_BRANCH, nat_bflag_str);

if (nat_bflag==(unsigned int)-1) {
nat_bflag = 0;
} else if ( nat_bflag>=8*sizeof(nat_bflag) ) {
LM_ERR("bflag index (%d) too big!\n", nat_bflag);
return -1;
} else {
nat_bflag = 1<<nat_bflag;
}

if (ul_event_init() < 0) {
LM_ERR("cannot initialize USRLOC events\n");
return -1;
Expand All @@ -510,8 +400,6 @@ static int mod_init(void)
return -1;
}

init_flag = 1;

return 0;
}

Expand Down Expand Up @@ -651,7 +539,7 @@ static void _synchronize_all_udomains(unsigned int ticks, void* param)
lock_stop_read(sync_lock);
}

int check_runtime_config(void)
int ul_check_config(void)
{
if (db_mode >= NO_DB && db_mode <= DB_ONLY) {
if (runtime_preset) {
Expand Down Expand Up @@ -924,3 +812,140 @@ int ul_deprec_shp(modparam_t _, void *modparam)

return 1;
}

int ul_init_globals(void)
{
int idx;

init_db_url(db_url, 1 /* can be null */);

/* Compute the lengths of string parameters */
contactid_col.len = strlen(contactid_col.s);
user_col.len = strlen(user_col.s);
domain_col.len = strlen(domain_col.s);
contact_col.len = strlen(contact_col.s);
expires_col.len = strlen(expires_col.s);
q_col.len = strlen(q_col.s);
callid_col.len = strlen(callid_col.s);
cseq_col.len = strlen(cseq_col.s);
flags_col.len = strlen(flags_col.s);
cflags_col.len = strlen(cflags_col.s);
user_agent_col.len = strlen(user_agent_col.s);
received_col.len = strlen(received_col.s);
path_col.len = strlen(path_col.s);
sock_col.len = strlen(sock_col.s);
methods_col.len = strlen(methods_col.s);
sip_instance_col.len = strlen(sip_instance_col.s);
kv_store_col.len = strlen(kv_store_col.s);
attr_col.len = strlen(attr_col.s);
last_mod_col.len = strlen(last_mod_col.s);

if (ul_hash_size > 16) {
LM_WARN("hash too big! max 2 ^ 16\n");
return -1;
}

if (ul_hash_size <= 1)
ul_hash_size = 512;
else
ul_hash_size = 1 << ul_hash_size;

ul_locks_no = ul_hash_size;

if (ul_init_locks() != 0) {
LM_ERR("locks array initialization failed\n");
return -1;
}

/* check matching mode */
switch (matching_mode) {
case CT_MATCH_CONTACT_ONLY:
case CT_MATCH_CONTACT_CALLID:
break;
default:
LM_ERR("invalid matching mode %d\n", matching_mode);
return -1;
}

if (cluster_mode != CM_NONE || rr_persist == RRP_LOAD_FROM_SQL) {
cid_keys = pkg_malloc(max_contact_delete *
(sizeof(db_key_t) + sizeof(db_val_t)));
if (!cid_keys) {
LM_ERR("oom\n");
return -1;
}

cid_vals = (db_val_t *)(cid_keys + max_contact_delete);
for (idx=0; idx < max_contact_delete; idx++) {
VAL_TYPE(cid_vals+idx) = DB_BIGINT;
VAL_NULL(cid_vals+idx) = 0;
cid_keys[idx] = &contactid_col;
}
}

nat_bflag = get_flag_id_by_name(FLAG_TYPE_BRANCH, nat_bflag_str);

if (nat_bflag == (unsigned int)-1) {
nat_bflag = 0;
} else if (nat_bflag >= 8 * sizeof(nat_bflag) ) {
LM_ERR("bflag index (%d) too big!\n", nat_bflag);
return -1;
} else {
nat_bflag = 1 << nat_bflag;
}

return 0;
}

int ul_check_db(void)
{
unsigned int db_caps;

if (have_cdb_conns()) {
cdb_url.len = strlen(cdb_url.s);

if (cachedb_bind_mod(&cdb_url, &cdbf) < 0) {
LM_ERR("cannot bind functions for cachedb_url %.*s\n",
cdb_url.len, cdb_url.s);
return -1;
}

if (!CACHEDB_CAPABILITY(&cdbf, CACHEDB_CAP_COL_ORIENTED)) {
LM_ERR("not enough capabilities for cachedb_url %.*s\n",
cdb_url.len, cdb_url.s);
return -1;
}
}

/* use database if needed */
if (cluster_mode == CM_SQL_ONLY || rr_persist == RRP_LOAD_FROM_SQL) {
if (ZSTR(db_url)) {
LM_ERR("selected mode requires a db connection -> db_url \n");
return -1;
}

if (db_bind_mod(&db_url, &ul_dbf) < 0) { /* Find database module */
LM_ERR("failed to bind database module\n");
return -1;
}

db_caps = DB_CAP_ALL;
if (cluster_mode == CM_SQL_ONLY)
db_caps |= DB_CAP_RAW_QUERY;

if (!DB_CAPABILITY(ul_dbf, db_caps)) {
LM_ERR("database module does not implement all functions"
" needed by the module\n");
return -1;
}

if (rr_persist == RRP_LOAD_FROM_SQL) {
if (!(sync_lock = lock_init_rw())) {
LM_ERR("cannot init rw lock\n");
return -1;
}
}
}

return 0;
}
6 changes: 2 additions & 4 deletions modules/usrloc/urecord.c
Expand Up @@ -866,10 +866,8 @@ int insert_ucontact(urecord_t* _r, str* _contact, ucontact_info_t* _ci,
_r->next_clabel = CLABEL_INC_AND_TEST(_r->next_clabel);
}

if (cluster_mode==CM_FULL_SHARING_CACHEDB
&& _ci->cdb_key.s==NULL) {
/* we need to build the cdb key for this new ucontact */
if (cdb_build_ucontact_key( _contact, _ci) < 0) {
if (cluster_mode == CM_FULL_SHARING_CACHEDB && !_ci->cdb_key.s) {
if (cdb_build_ucontact_key(_contact, _ci) < 0) {
LM_ERR("failed to generate CDB key\n");
return -1;
}
Expand Down
6 changes: 0 additions & 6 deletions modules/usrloc/usrloc.c
Expand Up @@ -36,7 +36,6 @@
#include "ul_mod.h"

extern unsigned int nat_bflag;
extern unsigned int init_flag;


int bind_usrloc(usrloc_api_t* api)
Expand All @@ -45,11 +44,6 @@ int bind_usrloc(usrloc_api_t* api)
LM_ERR("invalid parameter value\n");
return -1;
}
if (init_flag==0) {
LM_ERR("configuration error - trying to bind to usrloc module"
" before being initialized\n");
return -1;
}

api->register_udomain = register_udomain;
api->get_next_udomain = get_next_udomain;
Expand Down

0 comments on commit fbfd800

Please sign in to comment.