[Freeswitch-svn] [commit] r4356 - freeswitch/trunk/src
Freeswitch SVN
anthm at freeswitch.org
Fri Feb 23 11:42:40 EST 2007
Author: anthm
Date: Fri Feb 23 11:42:40 2007
New Revision: 4356
Modified:
freeswitch/trunk/src/switch_core.c
Log:
fix transaction locking error in the core sql thread
Modified: freeswitch/trunk/src/switch_core.c
==============================================================================
--- freeswitch/trunk/src/switch_core.c (original)
+++ freeswitch/trunk/src/switch_core.c Fri Feb 23 11:42:40 2007
@@ -3782,6 +3782,96 @@
return switch_core_session_request(endpoint_interface, pool);
}
+static switch_status_t switch_core_db_persistant_execute_trans(switch_core_db_t *db, char *sql, uint32_t retries)
+{
+ char *errmsg;
+ switch_status_t status = SWITCH_STATUS_FALSE;
+ uint8_t forever = 0;
+ unsigned begin_retries = 100;
+ uint8_t again = 0;
+
+ if (!retries) {
+ forever = 1;
+ retries = 1000;
+ }
+
+ again:
+
+ while(begin_retries > 0) {
+ again = 0;
+
+ switch_core_db_exec(
+ db,
+ "begin transaction",
+ NULL,
+ NULL,
+ &errmsg
+ );
+
+ if (errmsg) {
+ begin_retries--;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SQL ERR [%s]\n", errmsg);
+ if (strstr(errmsg, "cannot start a transaction within a transaction")) {
+ again = 1;
+ }
+ switch_core_db_free(errmsg);
+
+ if (again) {
+ switch_core_db_exec(db, "end transaction", NULL, NULL, &errmsg);
+ goto again;
+ }
+
+ switch_yield(100000);
+
+ if(begin_retries == 0) {
+ goto done;
+ }
+ } else {
+ break;
+ }
+
+ }
+
+ while(retries > 0) {
+
+
+
+ switch_core_db_exec(
+ db,
+ sql,
+ NULL,
+ NULL,
+ &errmsg
+ );
+ if (errmsg) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SQL ERR [%s]\n", errmsg);
+ switch_core_db_free(errmsg);
+ switch_yield(100000);
+ retries--;
+ if (retries == 0 && forever) {
+ retries = 1000;
+ continue;
+ }
+ } else {
+ status = SWITCH_STATUS_SUCCESS;
+ break;
+ }
+ }
+
+
+ done:
+
+ switch_core_db_exec(
+ db,
+ "end transaction",
+ NULL,
+ NULL,
+ &errmsg
+ );
+
+ return status;
+}
+
SWITCH_DECLARE(switch_status_t) switch_core_db_persistant_execute(switch_core_db_t *db, char *sql, uint32_t retries)
{
char *errmsg;
@@ -3828,10 +3918,6 @@
uint8_t trans = 0, nothing_in_queue = 0;
uint32_t target = 1000;
switch_size_t len = 0, sql_len = SQLLEN;
- const char *begin_sql = "BEGIN DEFERRED TRANSACTION CORE1;\n";
- char *end_sql = "END TRANSACTION CORE1";
- switch_size_t begin_len = strlen(begin_sql);
- switch_size_t end_len = strlen(end_sql);
char *sqlbuf = (char *) malloc(sql_len);
char *sql;
switch_size_t newlen;
@@ -3850,18 +3936,15 @@
if (sql) {
newlen = strlen(sql) + 2;
+
+ if (itterations == 0) {
+ trans = 1;
+ }
/* ignore abnormally large strings sql strings as potential buffer overflow */
- if (newlen + end_len < SQLLEN) {
-
- if (itterations == 0) {
- len = begin_len;
- sprintf(sqlbuf, "%s", begin_sql);
- trans = 1;
- }
-
+ if (newlen < SQLLEN) {
itterations++;
- if (len + newlen + end_len > sql_len) {
+ if (len + newlen > sql_len) {
sql_len = len + SQLLEN;
if (!(sqlbuf = realloc(sqlbuf, sql_len))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "SQL thread ending on mem err\n");
@@ -3883,8 +3966,7 @@
if (trans && ((itterations == target) || nothing_in_queue)) {
- sprintf(sqlbuf + len, "%s", end_sql);
- if (switch_core_db_persistant_execute(runtime.event_db, sqlbuf, 1000) != SWITCH_STATUS_SUCCESS) {
+ if (switch_core_db_persistant_execute_trans(runtime.event_db, sqlbuf, 1000) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "SQL thread unable to commit transaction, records lost!\n");
}
itterations = 0;
More information about the Freeswitch-svn
mailing list