static int child_init(int rank) { dlist_t* ptr; int i; if (rank == PROC_MAIN && ul_timer_procs > 0) { for (i = 0; i < ul_timer_procs; i++) { if (fork_sync_timer(PROC_TIMER, "IMS S-CSCF USRLOC Timer", 1 /*socks flag*/, ul_local_timer, (void*) (long) i, timer_interval /*sec*/) < 0) { LM_ERR("failed to start timer routine as process\n"); return -1; /* error */ } } } /* connecting to DB ? */ switch (db_mode) { case NO_DB: return 0; case WRITE_THROUGH: /* we need connection from working SIP and TIMER and MAIN * processes only */ if (rank <= 0 && rank != PROC_TIMER && rank != PROC_MAIN) return 0; break; } ul_dbh = ul_dbf.init(&db_url); /* Get a database connection per child */ if (!ul_dbh) { LM_ERR("child(%d): failed to connect to database\n", rank); return -1; } /* _rank==PROC_SIPINIT is used even when fork is disabled */ if (rank == PROC_SIPINIT && db_mode != DB_ONLY) { /* if cache is used, populate from DB */ for (ptr = root; ptr; ptr = ptr->next) { if (preload_udomain(ul_dbh, ptr->d) < 0) { LM_ERR("child(%d): failed to preload domain '%.*s'\n", rank, ptr->name.len, ZSW(ptr->name.s)); return -1; } } } return 0; }
static int child_init(int _rank) { dlist_t* ptr; /* connecting to DB ? */ switch (db_mode) { case NO_DB: return 0; case DB_ONLY: case WRITE_THROUGH: /* we need connection from working SIP, BIN, TIMER and MAIN procs */ if (_rank <= 0 && _rank != PROC_BIN && _rank != PROC_TIMER && _rank != PROC_MAIN) return 0; break; case WRITE_BACK: /* connect only from TIMER (for flush), from MAIN (for * final flush() and from child 1 for preload */ if (_rank!=PROC_TIMER && _rank!=PROC_MAIN && _rank!=1) return 0; break; } ul_dbh = ul_dbf.init(&db_url); /* Get a new database connection */ if (!ul_dbh) { LM_ERR("child(%d): failed to connect to database\n", _rank); return -1; } /* _rank==1 is used even when fork is disabled */ if (_rank==1 && db_mode!= DB_ONLY) { /* if cache is used, populate domains from DB */ for( ptr=root ; ptr ; ptr=ptr->next) { if (preload_udomain(ul_dbh, ptr->d) < 0) { LM_ERR("child(%d): failed to preload domain '%.*s'\n", _rank, ptr->name.len, ZSW(ptr->name.s)); return -1; } } } return 0; }
static int child_init(int _rank) { dlist_t* ptr; /* connecting to DB ? */ switch (db_mode) { case NO_DB: return 0; case WRITE_THROUGH: /* connect to db only from SIP workers, TIMER and MAIN processes */ if (_rank<=0 && _rank!=PROC_TIMER && _rank!=PROC_MAIN) return 0; break; case WRITE_BACK: /* connect to db only from TIMER (for flush), from MAIN (for * final flush() and from child 1 for preload */ if (_rank!=PROC_TIMER && _rank!=PROC_MAIN && _rank!=PROC_SIPINIT) return 0; break; } LM_DBG("Connecting to usrloc_pcscf DB for rank %d\n", _rank); if (connect_db(&db_url) != 0) { LM_ERR("child(%d): failed to connect to database\n", _rank); return -1; } /* _rank==PROC_SIPINIT is used even when fork is disabled */ if (_rank==PROC_SIPINIT && db_mode!=DB_ONLY) { // if cache is used, populate domains from DB for( ptr=root ; ptr ; ptr=ptr->next) { LM_DBG("Preloading domain %.*s\n", ptr->name.len, ptr->name.s); if (preload_udomain(ul_dbh, ptr->d) < 0) { LM_ERR("child(%d): failed to preload domain '%.*s'\n", _rank, ptr->name.len, ZSW(ptr->name.s)); return -1; } } } return 0; }
static int child_init(int rank) { dlist_t* ptr; /* connecting to DB ? */ switch (db_mode) { case NO_DB: return 0; case WRITE_THROUGH: /* we need connection from working SIP and TIMER and MAIN * processes only */ if (rank <= 0 && rank != PROC_TIMER && rank != PROC_MAIN) return 0; break; } ul_dbh = ul_dbf.init(&db_url); /* Get a database connection per child */ if (!ul_dbh) { LM_ERR("child(%d): failed to connect to database\n", rank); return -1; } /* _rank==PROC_SIPINIT is used even when fork is disabled */ if (rank == PROC_SIPINIT && db_mode != DB_ONLY) { /* if cache is used, populate from DB */ for (ptr = root; ptr; ptr = ptr->next) { if (preload_udomain(ul_dbh, ptr->d) < 0) { LM_ERR("child(%d): failed to preload domain '%.*s'\n", rank, ptr->name.len, ZSW(ptr->name.s)); return -1; } } } return 0; }
/* * Function registers a new domain with usrloc * if the domain exists, pointer to existing structure * will be returned, otherwise a new domain will be * created */ int register_udomain(const char* _n, udomain_t** _d) { dlist_t* d; str s; int ver; db_con_t* con; s.s = (char*)_n; s.len = strlen(_n); if (find_dlist(&s, &d) == 0) { *_d = d->d; return 0; } if (new_dlist(&s, &d) < 0) { LOG(L_ERR, "register_udomain(): Error while creating new domain\n"); return -1; } /* Preload domain with data from database if we are gonna * to use database */ if (db_mode != NO_DB) { con = ul_dbf.init(db_url.s); if (!con) { LOG(L_ERR, "register_udomain(): Can not open database connection\n"); goto err; } ver = table_version(&ul_dbf, con, &s); if (ver < 0) { LOG(L_ERR, "register_udomain(): Error while querying table version\n"); goto err; } else if (ver < TABLE_VERSION) { LOG(L_ERR, "register_udomain(): Invalid table version (use ser_mysql.sh reinstall)\n"); goto err; } if (preload_udomain(con, d->d) < 0) { LOG(L_ERR, "register_udomain(): Error while preloading domain '%.*s'\n", s.len, ZSW(s.s)); goto err; } ul_dbf.close(con); } d->next = root; root = d; *_d = d->d; return 0; err: if (con) ul_dbf.close(con); free_udomain(d->d); shm_free(d->name.s); shm_free(d); return -1; }
static int child_init(int _rank) { dlist_t* ptr; int i; if(sruid_init(&_ul_sruid, '-', "ulcx", SRUID_INC)<0) return -1; if(_rank==PROC_MAIN && ul_timer_procs>0) { for(i=0; i<ul_timer_procs; i++) { if(fork_sync_timer(PROC_TIMER, "USRLOC Timer", 1 /*socks flag*/, ul_local_timer, (void*)(long)i, timer_interval /*sec*/)<0) { LM_ERR("failed to start timer routine as process\n"); return -1; /* error */ } } } /* connecting to DB ? */ switch (db_mode) { case NO_DB: return 0; case DB_ONLY: case WRITE_THROUGH: /* connect to db only from SIP workers, TIMER and MAIN processes */ if (_rank<=0 && _rank!=PROC_TIMER && _rank!=PROC_MAIN) return 0; break; case WRITE_BACK: /* connect to db only from TIMER (for flush), from MAIN (for * final flush() and from child 1 for preload */ if (_rank!=PROC_TIMER && _rank!=PROC_MAIN && _rank!=PROC_SIPINIT) return 0; break; case DB_READONLY: /* connect to db only from child 1 for preload */ if(_rank!=PROC_SIPINIT) return 0; break; } ul_dbh = ul_dbf.init(&db_url); /* Get a database connection per child */ if (!ul_dbh) { LM_ERR("child(%d): failed to connect to database\n", _rank); return -1; } /* _rank==PROC_SIPINIT is used even when fork is disabled */ if (_rank==PROC_SIPINIT && db_mode!=DB_ONLY) { /* if cache is used, populate domains from DB */ for( ptr=root ; ptr ; ptr=ptr->next) { if (preload_udomain(ul_dbh, ptr->d) < 0) { LM_ERR("child(%d): failed to preload domain '%.*s'\n", _rank, ptr->name.len, ZSW(ptr->name.s)); return -1; } uldb_preload_attrs(ptr->d); } } return 0; }