SQL Box fixes

"Rene Kluwen" <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel,gmane.spam.detected
Message-ID <[email protected]>
Sometimes sqlbox died all of a sudden (with a clean exit).

 

Also connections to bearerbox were kept open after an smsbox disconnected.

 

This patch addresses these issues.

 

== Rene
sqlbox_fixes.patch (application/octet-stream, 5.9 KB)
Index: gw/sqlbox.c
===================================================================
--- gw/sqlbox.c	(revision 32)
+++ gw/sqlbox.c	(working copy)
@@ -149,6 +149,10 @@
     return 0;
 }
 
+#undef OCTSTR
+#undef SINGLE_GROUP
+#undef MULTI_GROUP
+
 static int sqlbox_is_single_group(Octstr *query)
 {
     #define OCTSTR(name)
@@ -173,48 +177,25 @@
 
 static Msg *read_from_box(Connection *conn, Boxc *boxconn)
 {
-    int ret;
-    Octstr *pack;
     Msg *msg;
 
-    pack = NULL;
-    while (sqlbox_status != SQL_DEAD && boxconn->alive) {
-            /* XXX: if box doesn't send (just keep conn open) we block here while shutdown */
-        pack = conn_read_withlen(conn);
-        gw_claim_area(pack);
-        if (pack != NULL)
-            break;
-/*
-        RK: 20041012 - function conn_read_error has disappeared.
-        if (conn_read_error(conn)) {
-            info(0, "Read error when reading from box <%s>, disconnecting",
-                 octstr_get_cstr(boxconn->client_ip));
-            return NULL;
-        }
-*/
-        if (conn_eof(conn)) {
-            info(0, "Connection closed by the box <%s>",
-                 octstr_get_cstr(boxconn->client_ip));
-            return NULL;
-        }
-
-        ret = conn_wait(conn, -1.0);
-        if (ret < 0) {
-            error(0, "Connection to box <%s> broke.",
-                  octstr_get_cstr(boxconn->client_ip));
-            return NULL;
-        }
+    while (boxconn->alive) {
+	switch (read_from_bearerbox_real(conn, &msg, 1.0)) {
+	case -1:
+	    /* connection to bearerbox lost */
+	    return NULL;
+	    break;
+	case  0:
+	    /* all is well */
+	    return msg;
+	    break;
+	case  1:
+	    /* timeout */
+	    break;
+	}
     }
 
-    if (pack == NULL)
-        return NULL;
-
-    msg = msg_unpack(pack);
-    octstr_destroy(pack);
-
-    if (msg == NULL)
-        error(0, "Failed to unpack data!");
-    return msg;
+    return NULL;
 }
 
 /*
@@ -268,13 +249,13 @@
 
         if (msg_type(msg) == sms) {
             debug("sqlbox", 0, "smsbox_to_bearerbox: sms received");
-
 	    msg_escaped = msg_duplicate(msg);
-            gw_sql_save_msg(msg_escaped, octstr_imm("MT"));
+	    gw_sql_save_msg(msg_escaped, octstr_imm("MT"));
 	    msg_destroy(msg_escaped);
-        }
+	}
 
-        send_msg(conn->bearerbox_connection, conn, msg);
+	send_msg(conn->bearerbox_connection, conn, msg);
+
         /* if this is an identification message from an smsbox instance */
         if (msg_type(msg) == admin && msg->admin.command == cmd_identify) {
             /*
@@ -383,12 +364,22 @@
     while (sqlbox_status != SQL_DEAD && conn->alive) {
 
     msg = read_from_box(conn->bearerbox_connection, conn);
-        if (msg == NULL) {
+
+    if (msg == NULL) {
+        /* tell sqlbox to die */
+	conn->alive = 0;
+	debug("sqlbox", 0, "bearerbox_to_smsbox: connection to bearerbox died.");
+	break;
+    }
+    if (msg_type(msg) == admin) {
+	if (msg->admin.command == cmd_shutdown || msg->admin.command == cmd_restart) {
             /* tell sqlbox to die */
-        conn->alive = 0;
-            debug("sqlbox", 0, "bearerbox_to_smsbox: connection to bearerbox died.");
-        break;
-        }
+	    conn->alive = 0;
+            debug("sqlbox", 0, "bearerbox_to_smsbox: Bearerbox told us to shutdown.");
+	    break;
+	}
+    }
+
         if (msg_type(msg) == heartbeat) {
         // todo
             debug("sqlbox", 0, "bearerbox_to_smsbox: catch an heartbeat - we are alive");
@@ -396,9 +387,9 @@
             continue;
         }
         if (!conn->alive) {
-        msg_destroy(msg);
-        break;
-    }
+	    msg_destroy(msg);
+	    break;
+	}
     if ((msg_type(msg) == sms) && (strcmp(octstr_get_cstr(msg->sms.msgdata),"ACK/") != 0)) {
 	msg_escaped = msg_duplicate(msg);
         if (msg->sms.sms_type != report_mo)
@@ -411,7 +402,6 @@
         msg_destroy(msg);
     }
     /* the client closes the connection, after that die in receiver */
-    sqlbox_status = SQL_SHUTDOWN;
     conn->alive = 0;
 }
 
@@ -453,6 +443,7 @@
 
     while(sqlbox_status != SQL_DEAD) {
 
+        ret = gwthread_pollfd(fd, POLLIN, 1.0);
         if (sqlbox_status == SQL_SHUTDOWN) {
             if (ret == -1 || !timeout)
                     break;
@@ -460,7 +451,6 @@
                     timeout--;
         }
 
-            ret = gwthread_pollfd(fd, POLLIN, 1.0);
         if (ret > 0) {
             gwthread_create(function, (void *)fd);
             gwthread_sleep(1.0);
@@ -493,7 +483,7 @@
     Boxc *conn = (Boxc *)arg;
     Msg *msg, *mack;
 
-    while (sqlbox_status == SQL_RUNNING) {
+    while (sqlbox_status == SQL_RUNNING && conn->alive) {
         msg = read_from_box(conn->bearerbox_connection, conn);
 
         if (msg == NULL) {    /* garbage/connection lost */
@@ -514,7 +504,7 @@
                     /* tell sqlbox to die */
             conn->alive = 0;
             sqlbox_status = SQL_SHUTDOWN;
-            debug("sqlbox", 0, "bearerbox_to_sql: connection to bearerbox died.");
+            debug("sqlbox", 0, "bearerbox_to_sql: Bearerbox told us to shutdown.");
             break;
         }
         if ((msg_type(msg) == sms) && (strcmp(octstr_get_cstr(msg->sms.msgdata),"ACK/") != 0)) {
@@ -559,13 +549,13 @@
 
     identify_to_bearerbox(boxc);
 
-    while (sqlbox_status == SQL_RUNNING) {
+    while (sqlbox_status == SQL_RUNNING && boxc->alive) {
         if ((msg = gw_sql_fetch_msg()) != NULL) {
             if (global_sender != NULL && (msg->sms.sender == NULL || octstr_len(msg->sms.sender) == 0)) {
                 msg->sms.sender = octstr_duplicate(global_sender);
             }
-            send_msg(boxc->bearerbox_connection, boxc, msg);
-            gw_sql_save_msg(msg, octstr_imm("MT"));
+	    send_msg(boxc->bearerbox_connection, boxc, msg);
+	    gw_sql_save_msg(msg, octstr_imm("MT"));
         }
         else {
             gwthread_sleep(SLEEP_BETWEEN_SELECTS);
@@ -715,6 +705,7 @@
     if (sql_type == NULL) {
         panic(0, "No proper SQL server defined.");
     }
+
     gw_sql_enter(cfg);
 
     sqlbox_status = SQL_RUNNING;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.