[PATCH] Fix bug #495 - System error 104: Connection reset by peer

Vincent CHAVANIS <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <[email protected]>
The issue is located on the mtbatch program that exit before receiving all ack/nack from bearerbox.
(btw, Thanks to alex pointing me this)

The result is an TCP broken pipe System error 104: Connection reset by peer

This patch fixes this.

Vincent.


-- 
Telemaque - 06560 SOPHIA-ANTIPOLIS - (FR)
Service Technique/Reseau - NOC
Direction du Developpement xMS+
http://www.telemaque.fr/
[email protected]
Tel : +33 4 92 90 99 84 (fax 9142)
mtbatch.c.patch (text/plain, 3.4 KB)
--- /operateurs/cvsroot/gateway/utils/mtbatch.c 2009-01-14 10:24:23.000000000 +0100
+++ mtbatch.c   2009-03-27 18:05:08.000000000 +0100
@@ -87,6 +87,7 @@
 static Octstr *bb_host;
 static long bb_port;
 static int bb_ssl;
+static volatile unsigned long backed = 0;
 static Octstr *service = NULL;
 static Octstr *account = NULL;
 static Octstr *from = NULL;
@@ -135,10 +136,10 @@
 {
     time_t start, t;
     unsigned long secs;
-    unsigned long total_s, total_f, total_ft, total_b;
+    unsigned long total_s, total_f, total_ft, total_b, total_o;
     Msg *msg;
 
-    total_s = total_f = total_ft = total_b = 0;
+    total_s = total_f = total_ft = total_b = total_o = 0;
     start = t = time(NULL);
     while (program_status != shutting_down) {
         int ret;
@@ -162,6 +163,7 @@
              */
             msg_destroy(msg);
         } else if (msg_type(msg) == ack) {
+            backed++;
             switch (msg->ack.nack) {
                 case ack_success:
                     total_s++;
@@ -178,13 +180,14 @@
             }
             msg_destroy(msg);
         } else {
-            warning(0, "Received other message than sms/admin, ignoring!");
+            warning(0, "Received other message than ack/admin, ignoring!");
             msg_destroy(msg);
+            total_o++;
         }
     }
     secs = difftime(time(NULL), start);
-    info(0, "Received acks: %ld success, %ld failed, %ld failed temporarly, %ld queued in %ld seconds "
-        "(%.2f per second)", total_s, total_f, total_ft, total_b, secs, 
+    info(0, "Received acks: %ld success, %ld failed, %ld failed temporarly, %ld queued, %ld other in %.2f seconds "
+        "(%.2f per second)", total_s, total_f, total_ft, total_b, total_o, (float) secs, 
          (float)(total_s+total_f+total_ft+total_b) / secs);
 }
 
@@ -262,7 +265,7 @@
 static void init_batch(Octstr *cfilename, Octstr *rfilename)
 {
     Octstr *receivers;
-    long lineno = 0; 
+    unsigned long lineno = 0; 
 
     content = octstr_read_file(octstr_get_cstr(cfilename)); 
     octstr_strip_crlfs(content);
@@ -286,10 +289,12 @@
          octstr_get_cstr(rfilename), lineno);
 }
 
-static void run_batch(void)
+int run_batch(void)
 {
     Octstr *no;
+    unsigned long linerr = 0;
     unsigned long lineno = 0;
+    int r = 0;
 
     while ((no = gwlist_consume(lines)) != NULL) {
        if (octstr_check_range(no, 0, 256, gw_isdigit)) {
@@ -310,6 +315,7 @@
         msg->sms.coding = DC_7BIT;
 
         if (send_message(msg) < 0) {
+            linerr++;
             panic(0,"Failed to send message at line <%ld> for receiver `%s' to bearerbox.",
                   lineno, octstr_get_cstr(no));
         }
@@ -317,18 +324,21 @@
         octstr_destroy(no);
         }
     }
+    info(0,"mtbatch has processed %ld messages with %ld errors", lineno, linerr);
+    return lineno;
 } 
 
 int main(int argc, char **argv)
 {
     int opt;
+    unsigned long sended;
     Octstr *cf, *rf;
 
     gwlib_init();
 
     bb_host = octstr_create("localhost");
     bb_port = 13001;
-    bb_ssl = 0;
+    bb_ssl = sended = 0;
         
     while ((opt = getopt(argc, argv, "hv:b:p:si:n:a:f:d:r:")) != EOF) {
         switch (opt) {
@@ -392,7 +402,9 @@
     identify_to_bearerbox();
     gwthread_create(read_messages_from_bearerbox, NULL);
 
-    run_batch();
+    sended = run_batch();
+
+    while(backed < sended) { /* avoid exiting before sending all msgs */ }
 
     program_status = shutting_down;
     gwthread_join_all();
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.