sql-in-transactions profile param (only vaid on first load) weather or not to bundle sql stmts in transactions
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@15217 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
0b0867a706
commit
700fa6815b
|
@ -198,6 +198,7 @@ typedef enum {
|
||||||
PFLAG_MANUAL_REDIRECT,
|
PFLAG_MANUAL_REDIRECT,
|
||||||
PFLAG_AUTO_NAT,
|
PFLAG_AUTO_NAT,
|
||||||
PFLAG_SIPCOMPACT,
|
PFLAG_SIPCOMPACT,
|
||||||
|
PFLAG_SQL_IN_TRANS,
|
||||||
/* No new flags below this line */
|
/* No new flags below this line */
|
||||||
PFLAG_MAX
|
PFLAG_MAX
|
||||||
} PFLAGS;
|
} PFLAGS;
|
||||||
|
|
|
@ -881,6 +881,7 @@ end:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SQLLEN 1024 * 64
|
||||||
void *SWITCH_THREAD_FUNC sofia_profile_worker_thread_run(switch_thread_t *thread, void *obj)
|
void *SWITCH_THREAD_FUNC sofia_profile_worker_thread_run(switch_thread_t *thread, void *obj)
|
||||||
{
|
{
|
||||||
sofia_profile_t *profile = (sofia_profile_t *) obj;
|
sofia_profile_t *profile = (sofia_profile_t *) obj;
|
||||||
|
@ -889,7 +890,14 @@ void *SWITCH_THREAD_FUNC sofia_profile_worker_thread_run(switch_thread_t *thread
|
||||||
int loops = 0;
|
int loops = 0;
|
||||||
uint32_t qsize;
|
uint32_t qsize;
|
||||||
void *pop;
|
void *pop;
|
||||||
|
int loop_count = 0;
|
||||||
|
switch_size_t sql_len = SQLLEN;
|
||||||
|
char *tmp, *sqlbuf = NULL;
|
||||||
|
|
||||||
|
if (sofia_test_pflag(profile, PFLAG_SQL_IN_TRANS)) {
|
||||||
|
sqlbuf = (char *) malloc(sql_len);
|
||||||
|
}
|
||||||
|
|
||||||
ireg_loops = IREG_SECONDS;
|
ireg_loops = IREG_SECONDS;
|
||||||
gateway_loops = GATEWAY_SECONDS;
|
gateway_loops = GATEWAY_SECONDS;
|
||||||
|
|
||||||
|
@ -900,15 +908,57 @@ void *SWITCH_THREAD_FUNC sofia_profile_worker_thread_run(switch_thread_t *thread
|
||||||
qsize = switch_queue_size(profile->sql_queue);
|
qsize = switch_queue_size(profile->sql_queue);
|
||||||
|
|
||||||
while ((mod_sofia_globals.running == 1 && sofia_test_pflag(profile, PFLAG_RUNNING)) || qsize) {
|
while ((mod_sofia_globals.running == 1 && sofia_test_pflag(profile, PFLAG_RUNNING)) || qsize) {
|
||||||
if (qsize) {
|
if (sofia_test_pflag(profile, PFLAG_SQL_IN_TRANS)) {
|
||||||
switch_mutex_lock(profile->ireg_mutex);
|
if (qsize > 0 && (qsize >= 500 || ++loop_count >= 500)) {
|
||||||
while (switch_queue_trypop(profile->sql_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
|
switch_size_t newlen;
|
||||||
sofia_glue_actually_execute_sql(profile, SWITCH_TRUE, (char *) pop, NULL);
|
uint32_t itterations = 0;
|
||||||
free(pop);
|
switch_size_t len = 0;
|
||||||
}
|
|
||||||
switch_mutex_unlock(profile->ireg_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
switch_mutex_lock(profile->ireg_mutex);
|
||||||
|
|
||||||
|
sprintf(sqlbuf + len, "begin;\n");
|
||||||
|
len += 7;
|
||||||
|
|
||||||
|
while (switch_queue_trypop(profile->sql_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
|
||||||
|
char *sql = (char *) pop;
|
||||||
|
|
||||||
|
newlen = strlen(sql) + 2;
|
||||||
|
|
||||||
|
if (newlen + 10 < SQLLEN) {
|
||||||
|
itterations++;
|
||||||
|
if (len + newlen + 10 > sql_len) {
|
||||||
|
sql_len = len + 10 + SQLLEN;
|
||||||
|
if (!(tmp = realloc(sqlbuf, sql_len))) {
|
||||||
|
abort();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sqlbuf = tmp;
|
||||||
|
}
|
||||||
|
sprintf(sqlbuf + len, "%s;\n", sql);
|
||||||
|
len += newlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(pop);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(sqlbuf + len, "commit;\n");
|
||||||
|
|
||||||
|
//printf("TRANS:\n%s\n", sqlbuf);
|
||||||
|
sofia_glue_actually_execute_sql(profile, SWITCH_TRUE, sqlbuf, NULL);
|
||||||
|
switch_mutex_unlock(profile->ireg_mutex);
|
||||||
|
loop_count = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (qsize) {
|
||||||
|
switch_mutex_lock(profile->ireg_mutex);
|
||||||
|
while (switch_queue_trypop(profile->sql_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
|
||||||
|
sofia_glue_actually_execute_sql(profile, SWITCH_TRUE, (char *) pop, NULL);
|
||||||
|
free(pop);
|
||||||
|
}
|
||||||
|
switch_mutex_unlock(profile->ireg_mutex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (++loops >= 100) {
|
if (++loops >= 100) {
|
||||||
if (++ireg_loops >= IREG_SECONDS) {
|
if (++ireg_loops >= IREG_SECONDS) {
|
||||||
sofia_reg_check_expire(profile, switch_epoch_time_now(NULL), 0);
|
sofia_reg_check_expire(profile, switch_epoch_time_now(NULL), 0);
|
||||||
|
@ -935,6 +985,7 @@ void *SWITCH_THREAD_FUNC sofia_profile_worker_thread_run(switch_thread_t *thread
|
||||||
switch_mutex_unlock(profile->ireg_mutex);
|
switch_mutex_unlock(profile->ireg_mutex);
|
||||||
|
|
||||||
sofia_clear_pflag_locked(profile, PFLAG_WORKER_RUNNING);
|
sofia_clear_pflag_locked(profile, PFLAG_WORKER_RUNNING);
|
||||||
|
switch_safe_free(sqlbuf);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -2718,6 +2769,12 @@ switch_status_t config_sofia(int reload, char *profile_name)
|
||||||
if (switch_true(val)) {
|
if (switch_true(val)) {
|
||||||
sofia_set_pflag(profile, PFLAG_SIPCOMPACT);
|
sofia_set_pflag(profile, PFLAG_SIPCOMPACT);
|
||||||
}
|
}
|
||||||
|
} else if (!strcasecmp(var, "sql-in-transactions")) {
|
||||||
|
if (switch_true(val)) {
|
||||||
|
sofia_set_pflag(profile, PFLAG_SQL_IN_TRANS);
|
||||||
|
} else {
|
||||||
|
sofia_clear_pflag(profile, PFLAG_SQL_IN_TRANS);
|
||||||
|
}
|
||||||
} else if (!strcasecmp(var, "bitpacking")) {
|
} else if (!strcasecmp(var, "bitpacking")) {
|
||||||
if (!strcasecmp(val, "aal2")) {
|
if (!strcasecmp(val, "aal2")) {
|
||||||
profile->codec_flags = SWITCH_CODEC_FLAG_AAL2;
|
profile->codec_flags = SWITCH_CODEC_FLAG_AAL2;
|
||||||
|
|
Loading…
Reference in New Issue