|
@@ -60,7 +60,7 @@ int ul_db_init(void) {
|
|
|
|
|
|
memset(results, 0, sizeof(results));
|
|
|
|
|
|
- if(write_on_master_db_shared->val){
|
|
|
+ if(db_master_write){
|
|
|
if(db_bind_mod(mdb.write.url, &mdb.write.dbf) < 0) {
|
|
|
LM_ERR("could not bind api for write db.\n");
|
|
|
return -1;
|
|
@@ -102,16 +102,19 @@ 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);
|
|
|
- lock_get(&write_on_master_db_shared->lock);
|
|
|
- if(write_on_master_db_shared->val){
|
|
|
+ if(db_master_write){
|
|
|
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;
|
|
|
+ if (mdb_availability_control) {
|
|
|
+ LM_INFO("starting with no connection to sip master db write\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ LM_ERR("could not connect to sip master db (write).\n");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
}
|
|
|
LM_INFO("write db connection for children initialized\n");
|
|
|
}
|
|
|
- lock_release(&write_on_master_db_shared->lock);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -138,6 +141,21 @@ void ul_db_shutdown(void) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+int init_w_dbh(ul_master_db_t *write) {
|
|
|
+ if (mdb_availability_control) {
|
|
|
+ if (!(*mdb_w_available)) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ if (write->dbh == NULL) {
|
|
|
+ if((write->dbh = write->dbf.init(write->url)) == NULL) {
|
|
|
+ LM_ERR("Could not recreate connection to master write db.\n");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ LM_INFO("Recreated connection to master write db.\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
int db_handle_error(ul_db_handle_t * handle, int no) {
|
|
|
int query_len;
|
|
@@ -150,12 +168,9 @@ int db_handle_error(ul_db_handle_t * handle, int no) {
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- lock_get(&write_on_master_db_shared->lock);
|
|
|
- if(!write_on_master_db_shared->val){
|
|
|
- lock_release(&write_on_master_db_shared->lock);
|
|
|
+ if (!db_master_write) {
|
|
|
return 0;
|
|
|
}
|
|
|
- lock_release(&write_on_master_db_shared->lock);
|
|
|
|
|
|
query_len = 35 + reg_table.len
|
|
|
+ error_col.len * 2 + id_col.len;
|
|
@@ -186,7 +201,10 @@ int db_handle_error(ul_db_handle_t * handle, int no) {
|
|
|
tmp.s = query;
|
|
|
tmp.len = strlen(query);
|
|
|
|
|
|
- if (mdb.write.dbf.raw_query (mdb.write.dbh, &tmp, NULL)) {
|
|
|
+ if (init_w_dbh(&mdb.write) < 0)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ if (mdb.write.dbf.raw_query(mdb.write.dbh, &tmp, NULL)) {
|
|
|
LM_ERR("error in database update.\n");
|
|
|
return -1;
|
|
|
}
|
|
@@ -209,6 +227,8 @@ int db_handle_error(ul_db_handle_t * handle, int no) {
|
|
|
handle->id, db->no, db->errors, cfg_get(p_usrloc, p_usrloc_cfg, db_err_threshold));
|
|
|
if(db->errors >= cfg_get(p_usrloc, p_usrloc_cfg, db_err_threshold)) {
|
|
|
LM_DBG("db_handle_error: now doing failover\n");
|
|
|
+ if (init_w_dbh(&mdb.write) < 0)
|
|
|
+ return -1;
|
|
|
if((db_failover(&mdb.write.dbf, mdb.write.dbh, handle, no)) < 0) {
|
|
|
LM_ERR("error in doing failover.\n");
|
|
|
return -1;
|
|
@@ -378,12 +398,9 @@ 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;
|
|
|
}
|
|
|
- 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);
|
|
|
+ if((ret = db_query(handle, _r_h, &f, table, _k, _op, _v, _c, _n, _nc, _o, _r, db_master_write)) < 0){
|
|
|
return ret;
|
|
|
}
|
|
|
- lock_release(&write_on_master_db_shared->lock);
|
|
|
add_dbf(*_r, f);
|
|
|
return ret;
|
|
|
}
|
|
@@ -401,34 +418,31 @@ int ul_db_free_result(db1_con_t ** dbh, db1_res_t * res){
|
|
|
}
|
|
|
|
|
|
int db_reactivate(ul_db_handle_t * handle, int no){
|
|
|
- lock_get(&write_on_master_db_shared->lock);
|
|
|
- if(!write_on_master_db_shared->val){
|
|
|
- lock_release(&write_on_master_db_shared->lock);
|
|
|
+ if(!db_master_write){
|
|
|
LM_ERR("running in read only mode, abort.\n");
|
|
|
return -1;
|
|
|
}
|
|
|
- lock_release(&write_on_master_db_shared->lock);
|
|
|
+ if (init_w_dbh(&mdb.write) < 0)
|
|
|
+ return -1;
|
|
|
return db_failover_reactivate(&mdb.write.dbf, mdb.write.dbh, handle, no);
|
|
|
}
|
|
|
|
|
|
int db_reset_failover_time(ul_db_handle_t * handle, int no){
|
|
|
- lock_get(&write_on_master_db_shared->lock);
|
|
|
- if(!write_on_master_db_shared->val){
|
|
|
- lock_release(&write_on_master_db_shared->lock);
|
|
|
+ if(!db_master_write){
|
|
|
LM_ERR("running in read only mode, abort.\n");
|
|
|
return -1;
|
|
|
}
|
|
|
- lock_release(&write_on_master_db_shared->lock);
|
|
|
+ if (init_w_dbh(&mdb.write) < 0)
|
|
|
+ return -1;
|
|
|
return db_failover_reset(&mdb.write.dbf, mdb.write.dbh, handle->id, no);
|
|
|
}
|
|
|
|
|
|
int ul_db_check(ul_db_handle_t * handle){
|
|
|
- lock_get(&write_on_master_db_shared->lock);
|
|
|
- if(write_on_master_db_shared->val){
|
|
|
- lock_release(&write_on_master_db_shared->lock);
|
|
|
+ if(db_master_write){
|
|
|
+ if (init_w_dbh(&mdb.write) < 0)
|
|
|
+ return -1;
|
|
|
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;
|
|
|
}
|