Re: [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]>
Here is a new version of the mtbach program.

- Introducing a Counter type
- Now handling correclty ack from bearerbox.
- typo fixes.

Vincent



Vincent CHAVANIS a écrit :
> 
> 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.
> 
>
mtbatchv2.c.patch (text/plain, 3.8 KB)
--- /gateway-cvs/utils/mtbatch.c        2009-01-14 10:24:23.000000000 +0100
+++ /gateway/utils/mtbatch.c    2009-03-31 18:42:18.000000000 +0200
@@ -65,7 +65,6 @@
  * Stipe Tolj <[email protected]>
  *
  * XXX add udh (etc.) capabilities. Currently we handle only 7-bit.
- * XXX add ACK handling by providing a queue and retrying if failed.
  */
 
 #include <string.h>
@@ -87,6 +86,7 @@
 static Octstr *bb_host;
 static long bb_port;
 static int bb_ssl;
+static Counter *counter;
 static Octstr *service = NULL;
 static Octstr *account = NULL;
 static Octstr *from = NULL;
@@ -135,10 +135,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 +162,7 @@
              */
             msg_destroy(msg);
         } else if (msg_type(msg) == ack) {
+            counter_increase(counter);
             switch (msg->ack.nack) {
                 case ack_success:
                     total_s++;
@@ -178,13 +179,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, secs, 
          (float)(total_s+total_f+total_ft+total_b) / secs);
 }
 
@@ -284,12 +286,16 @@
 
     info(0,"Receivers file `%s' contains %ld destination numbers.",
          octstr_get_cstr(rfilename), lineno);
+
+    counter = counter_create();
 }
 
-static void run_batch(void)
+unsigned long 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 +317,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,12 +326,16 @@
         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;
+    sended = 0;
 
     gwlib_init();
 
@@ -373,7 +386,7 @@
     
     if (optind == argc || argc-optind < 2) {
         help();
-        exit(0);
+        panic(0, "Stopping.");
     }
 
     /* check some mandatory elements */
@@ -392,7 +404,9 @@
     identify_to_bearerbox();
     gwthread_create(read_messages_from_bearerbox, NULL);
 
-    run_batch();
+    sended = run_batch();
+
+    while(counter_value(counter) < sended) { /* avoid exiting before sending all msgs */ }
 
     program_status = shutting_down;
     gwthread_join_all();
@@ -403,6 +417,7 @@
     octstr_destroy(service);
     octstr_destroy(account);
     octstr_destroy(smsc_id);
+    counter_destroy(counter);
     gwlist_destroy(lines, octstr_destroy_item); 
    
     gwlib_shutdown();
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.