Skip to content

Commit

Permalink
p_usrloc: new parameter "mdb_availability_control" has been created.
Browse files Browse the repository at this point in the history
- The new parameter "mdb_availability_control" overwrites the "write_on_db" parameter based on the availability of master database.
  • Loading branch information
hdikme committed May 14, 2018
1 parent 066f0e8 commit d880def
Show file tree
Hide file tree
Showing 7 changed files with 93 additions and 11 deletions.
20 changes: 20 additions & 0 deletions src/modules/p_usrloc/doc/p_usrloc_admin.xml
Expand Up @@ -677,6 +677,26 @@ modparam("usrloc", "db_update_as_insert", 1)
...
modparam("p_usrloc", "default_db_url", "mysql://ser:ser@localhost/ser")
...
</programlisting>
</example>
</section>

<section>
<title><varname>mdb_availability_control</varname>(str)</title>
<para>
Checks the master database in certain time intervals specified by the <quote>retry_interval</quote> parameter. Overwrites the <quote>write_on_master_db</quote> parameter based on the reachability of master database. If the master db is unavailable then the aforementioned parameter will be deactivated.
</para>
<para>
<emphasis>
Default value is <quote>0</quote>.
</emphasis>
</para>
<example>
<title>Set <varname>mdb_availability_control</varname> parameter</title>
<programlisting format="linespecific">
...
modparam("p_usrloc", "mdb_availability_control", 1)
...
</programlisting>
</example>
</section>
Expand Down
17 changes: 15 additions & 2 deletions src/modules/p_usrloc/p_usrloc_mod.c
Expand Up @@ -165,6 +165,7 @@ int policy = DB_DEFAULT_POLICY;
int db_write = 0;
int db_master_write = 0;
int alg_location = 0;
int mdb_availability_control = 0;

int db_use_transactions = 0;
str db_transaction_level = str_init(DB_DEFAULT_TRANSACTION_LEVEL);
Expand All @@ -182,7 +183,7 @@ str default_db_type = str_init(DEFAULT_DB_TYPE);
str domain_db = str_init(DEFAULT_DOMAIN_DB);
int default_dbt = 0;
int expire = 0;

dbm_write_t *write_on_master_db_shared;

/*! \brief
* Exported functions
Expand Down Expand Up @@ -248,6 +249,7 @@ static param_export_t params[] = {
{"alg_location", INT_PARAM, &alg_location },
{"db_ops_ruid", INT_PARAM, &default_p_usrloc_cfg.db_ops_ruid},
{"db_update_as_insert", INT_PARAM, &default_p_usrloc_cfg.db_update_as_insert},
{"mdb_availability_control", INT_PARAM, &mdb_availability_control},
{0, 0, 0}
};

Expand Down Expand Up @@ -307,6 +309,13 @@ static int mod_init(void)
}
#endif

if((write_on_master_db_shared = shm_malloc(sizeof(dbm_write_t))) == NULL) {
LM_ERR("couldn't allocate shared memory.\n");
return -1;
} else {
write_on_master_db_shared->val = db_master_write;
}

if(ul_hash_size<=1)
ul_hash_size = 512;
else
Expand Down Expand Up @@ -395,10 +404,14 @@ static int mod_init(void)
LM_ERR("could not init database watch environment.\n");
return -1;
}
if(db_master_write){
if (lock_init(&write_on_master_db_shared->lock)==0){
LM_ERR("could not initialise lock\n");
}
if(write_on_master_db_shared->val){
/* register extra dummy timer to be created in init_db_check() */
register_dummy_timers(1);
}
check_master_db(db_master_write);
return 0;
}

Expand Down
6 changes: 6 additions & 0 deletions src/modules/p_usrloc/p_usrloc_mod.h
Expand Up @@ -123,5 +123,11 @@ extern int connection_expires;
extern int alg_location;

extern int max_loc_nr;
typedef struct dbm_write {
int val;
gen_lock_t lock;
} dbm_write_t;
extern dbm_write_t *write_on_master_db_shared;
extern int mdb_availability_control;

#endif /* UL_MOD_H */
34 changes: 26 additions & 8 deletions src/modules/p_usrloc/ul_db.c
Expand Up @@ -60,7 +60,7 @@ int ul_db_init(void) {

memset(results, 0, sizeof(results));

if(db_master_write){
if(write_on_master_db_shared->val){
if(db_bind_mod(mdb.write.url, &mdb.write.dbf) < 0) {
LM_ERR("could not bind api for write db.\n");
return -1;
Expand Down Expand Up @@ -102,13 +102,16 @@ int ul_db_child_init(void) {
if(ul_db_child_locnr_init() == -1) return -1;

LM_INFO("location number is %d\n", max_loc_nr);
if(db_master_write){
lock_get(&write_on_master_db_shared->lock);
if(write_on_master_db_shared->val){
if((mdb.write.dbh = mdb.write.dbf.init(mdb.write.url)) == NULL) {
LM_ERR("could not connect to sip master db (write).\n");
lock_release(&write_on_master_db_shared->lock);
return -1;
}
LM_INFO("write db connection for children initialized");
}
lock_release(&write_on_master_db_shared->lock);
return 0;
}

Expand Down Expand Up @@ -146,10 +149,13 @@ int db_handle_error(ul_db_handle_t * handle, int no) {
LM_ERR("NULL pointer in parameter.\n");
return -1;
}

if(!db_master_write){

lock_get(&write_on_master_db_shared->lock);
if(!write_on_master_db_shared->val){
lock_release(&write_on_master_db_shared->lock);
return 0;
}
lock_release(&write_on_master_db_shared->lock);

query_len = 35 + reg_table.len
+ error_col.len * 2 + id_col.len;
Expand Down Expand Up @@ -372,9 +378,12 @@ int ul_db_query(str * table, str * first, str * second, db1_con_t *** _r_h,
LM_ERR("could not retrieve db handle.\n");
return -1;
}
if((ret = db_query(handle, _r_h, &f, table, _k, _op, _v, _c, _n, _nc, _o, _r, db_master_write)) < 0){
lock_get(&write_on_master_db_shared->lock);
if((ret = db_query(handle, _r_h, &f, table, _k, _op, _v, _c, _n, _nc, _o, _r, write_on_master_db_shared->val)) < 0){
lock_release(&write_on_master_db_shared->lock);
return ret;
}
lock_release(&write_on_master_db_shared->lock);
add_dbf(*_r, f);
return ret;
}
Expand All @@ -392,25 +401,34 @@ int ul_db_free_result(db1_con_t ** dbh, db1_res_t * res){
}

int db_reactivate(ul_db_handle_t * handle, int no){
if(!db_master_write){
lock_get(&write_on_master_db_shared->lock);
if(!write_on_master_db_shared->val){
lock_release(&write_on_master_db_shared->lock);
LM_ERR("running in read only mode, abort.\n");
return -1;
}
lock_release(&write_on_master_db_shared->lock);
return db_failover_reactivate(&mdb.write.dbf, mdb.write.dbh, handle, no);
}

int db_reset_failover_time(ul_db_handle_t * handle, int no){
if(!db_master_write){
lock_get(&write_on_master_db_shared->lock);
if(!write_on_master_db_shared->val){
lock_release(&write_on_master_db_shared->lock);
LM_ERR("running in read only mode, abort.\n");
return -1;
}
lock_release(&write_on_master_db_shared->lock);
return db_failover_reset(&mdb.write.dbf, mdb.write.dbh, handle->id, no);
}

int ul_db_check(ul_db_handle_t * handle){
if(db_master_write){
lock_get(&write_on_master_db_shared->lock);
if(write_on_master_db_shared->val){
lock_release(&write_on_master_db_shared->lock);
return check_handle(&mdb.write.dbf, mdb.write.dbh, handle);
} else {
lock_release(&write_on_master_db_shared->lock);
LM_ERR("checking is useless in read-only mode\n");
return 0;
}
Expand Down
1 change: 1 addition & 0 deletions src/modules/p_usrloc/ul_db.h
Expand Up @@ -56,6 +56,7 @@ typedef struct ul_master_db_set {
} ul_master_db_set_t;

extern int required_caps;
extern ul_master_db_set_t mdb;

int ul_db_init();

Expand Down
24 changes: 23 additions & 1 deletion src/modules/p_usrloc/ul_db_watch.c
Expand Up @@ -96,7 +96,10 @@ void check_dbs(unsigned int ticks, void *param){
ul_db_handle_list_t * tmp2, * new_element;
int found;
int i;


if(mdb_availability_control) {
check_master_db(db_master_write);
}
if(!list_lock){
return;
}
Expand Down Expand Up @@ -149,6 +152,25 @@ void check_dbs(unsigned int ticks, void *param){
lock_release(list_lock);
}

void check_master_db(int dbm_write_default) {
if(mdb_availability_control) {
if(mdb.write.dbh){
mdb.write.dbf.close(mdb.write.dbh);
mdb.write.dbh = NULL;
}

lock_get(&write_on_master_db_shared->lock);

if((mdb.write.dbh = mdb.write.dbf.init(mdb.write.url)) == NULL) {
write_on_master_db_shared->val = 0;
LM_WARN("Master db is unavailable.\n");
} else {
write_on_master_db_shared->val = dbm_write_default;
}
lock_release(&write_on_master_db_shared->lock);
}
}

int ul_register_watch_db(int id){
ul_db_watch_list_t * new_id = NULL, * tmp;
if(!list_lock){
Expand Down
2 changes: 2 additions & 0 deletions src/modules/p_usrloc/ul_db_watch.h
Expand Up @@ -35,4 +35,6 @@ int ul_register_watch_db(int id);

int ul_unregister_watch_db(int id);

void check_master_db(int dbm_write_default);

#endif

0 comments on commit d880def

Please sign in to comment.