RE: Please have a look at this patch adding option to configure SMPP throttling sleep time

Michael Zervakis <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <[email protected]>
Hi,

Resubmitted because previous patch has a logic error. For anyone 
interested this patch will adjust wait time to 500 msec after receiving 
a 0x58 throttling error instead of one or more seconds. The 
SMPP_THROTTLING_SLEEP_TIME is in usec and not in sec.

BR
smpp.patch (text/plain, 5.9 KB)
? smpp.patch
? test/test_date
Index: gw/smsc/smsc_smpp.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsc/smsc_smpp.c,v
retrieving revision 1.112
diff -u -r1.112 smsc_smpp.c
--- gw/smsc/smsc_smpp.c	29 Jan 2009 11:38:28 -0000	1.112
+++ gw/smsc/smsc_smpp.c	10 Feb 2009 16:25:14 -0000
@@ -111,7 +111,7 @@
 #define SMPP_MAX_PENDING_SUBMITS    10
 #define SMPP_DEFAULT_VERSION        0x34
 #define SMPP_DEFAULT_PRIORITY       0
-#define SMPP_THROTTLING_SLEEP_TIME  15
+#define SMPP_THROTTLING_SLEEP_TIME  500000
 #define SMPP_DEFAULT_CONNECTION_TIMEOUT  10 * SMPP_ENQUIRE_LINK_INTERVAL
 #define SMPP_DEFAULT_WAITACK        60
 #define SMPP_DEFAULT_SHUTDOWN_TIMEOUT 30
@@ -158,7 +158,7 @@
     int version;
     int priority;       /* set default priority for messages */    
     int validityperiod;    
-    time_t throttling_err_time;
+    struct timeval throttling_err_time;
     int smpp_msg_id_type;  /* msg id in C string, hex or decimal */
     int autodetect_addr;
     Octstr *alt_charset;
@@ -251,7 +251,8 @@
     smpp->priority = priority;
     smpp->validityperiod = validity;
     smpp->conn = conn; 
-    smpp->throttling_err_time = 0;
+    smpp->throttling_err_time.tv_sec = 0;
+    smpp->throttling_err_time.tv_usec = 0;
     smpp->smpp_msg_id_type = smpp_msg_id_type;    
     smpp->autodetect_addr = autodetect_addr;
     smpp->alt_charset = octstr_duplicate(alt_charset);
@@ -1502,10 +1503,13 @@
                  * check to see if we got a "throttling error", in which case we'll just
                  * sleep for a while
                  */
-                if (pdu->u.submit_sm_resp.command_status == SMPP_ESME_RTHROTTLED)
-                    time(&(smpp->throttling_err_time));
-                else
-                    smpp->throttling_err_time = 0;
+                if (pdu->u.submit_sm_resp.command_status == SMPP_ESME_RTHROTTLED) {
+                    gettimeofday(&(smpp->throttling_err_time), NULL);
+                }
+                else {
+                    smpp->throttling_err_time.tv_sec = 0;
+                    smpp->throttling_err_time.tv_usec = 0;
+                }
 
                 bb_smscconn_send_failed(smpp->conn, msg, reason, 
                         octstr_format("%ld/%s", pdu->u.submit_sm_resp.command_status,
@@ -1641,10 +1645,13 @@
                  * check to see if we got a "throttling error", in which case we'll just
                  * sleep for a while
                  */
-                if (cmd_stat == SMPP_ESME_RTHROTTLED)
-                    time(&(smpp->throttling_err_time));
-                else
-                    smpp->throttling_err_time = 0;
+                if (cmd_stat == SMPP_ESME_RTHROTTLED) {
+                    gettimeofday(&(smpp->throttling_err_time), NULL);
+                }
+                else {
+                    smpp->throttling_err_time.tv_sec = 0;
+                    smpp->throttling_err_time.tv_usec = 0;
+                }
 
                 reason = smpp_status_to_smscconn_failure_reason(cmd_stat);
                 bb_smscconn_send_failed(smpp->conn, msg, reason,
@@ -1771,6 +1778,7 @@
     SMPP_PDU *pdu;
     double timeout;
     time_t last_response, last_cleanup;
+    struct timeval eval_time;
 
     io_arg = arg;
     smpp = io_arg->smpp;
@@ -1792,7 +1800,8 @@
         last_enquire_sent = last_cleanup = last_response = date_universal_now();
         pending_submits = -1;
         len = 0;
-        smpp->throttling_err_time = 0;
+        smpp->throttling_err_time.tv_sec = 0;
+        smpp->throttling_err_time.tv_usec = 0;
         for (;conn != NULL;) {
             timeout = last_enquire_sent + smpp->enquire_link_interval
                         - date_universal_now();
@@ -1845,9 +1854,19 @@
                 send_enquire_link(smpp, conn, &last_enquire_sent);
 
                 /* Make sure we send even if we read a lot */
-                if (transmitter && difftime(time(NULL), smpp->throttling_err_time) > SMPP_THROTTLING_SLEEP_TIME) {
-                    smpp->throttling_err_time = 0;
-                    send_messages(smpp, conn, &pending_submits);
+                if (transmitter) {
+                   if (smpp->throttling_err_time.tv_sec == 0) {
+                      send_messages(smpp, conn, &pending_submits);
+                   }
+                   else {
+                      gettimeofday(&eval_time, NULL);
+                      unsigned long diff_usec = (eval_time.tv_sec - smpp->throttling_err_time.tv_sec)*1000000;
+                      if (diff_usec + eval_time.tv_usec - smpp->throttling_err_time.tv_usec > SMPP_THROTTLING_SLEEP_TIME) {
+                          smpp->throttling_err_time.tv_sec = 0;
+                          smpp->throttling_err_time.tv_usec = 0;
+                          send_messages(smpp, conn, &pending_submits);
+                      }
+                   }
                 }
             }
 
@@ -1873,10 +1892,21 @@
                 last_cleanup = time(NULL);
             }
                                                                     
-            if (transmitter && difftime(time(NULL), smpp->throttling_err_time) > SMPP_THROTTLING_SLEEP_TIME) {
-                smpp->throttling_err_time = 0;
-                send_messages(smpp, conn, &pending_submits);
+            if (transmitter) {
+               if (smpp->throttling_err_time.tv_sec == 0) {
+                  send_messages(smpp, conn, &pending_submits);
+                }
+                else {
+                  gettimeofday(&eval_time, NULL);
+                  unsigned long diff_usec = (eval_time.tv_sec - smpp->throttling_err_time.tv_sec)*1000000;
+                  if (diff_usec + eval_time.tv_usec - smpp->throttling_err_time.tv_usec > SMPP_THROTTLING_SLEEP_TIME) {
+                     smpp->throttling_err_time.tv_sec = 0;
+                     smpp->throttling_err_time.tv_usec = 0;
+                     send_messages(smpp, conn, &pending_submits);
+                  }
+                }
             }
+
         }
 
         if (conn != NULL) {
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.