Re: Throughput patches

Alvin Starr <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <[email protected]>
Here it is.

It was against 1.4.1

I don't remember the exact things I did. But I did spend about a day 
thinking about what to do and started a few times.

If you have a problem I will take a closer look at what I have running 
right now and verify this is the right patch.


Juan Nin wrote:
> I've tried Stuart Beck's patch, but it isn't working for me, as soon
> as an ACK is received, throughput is not respecte and  receive
> Throtling errors
>
> can u send your patch for me to test?
>
> what kannel version was it made against?
> 1.4.1?
>
> Thanks!
>
> Juan
>   
[snip]

-- 
Alvin Starr                   ||   voice: (416)585-9971
Interlink Connectivity        ||   fax:   (416)585-9974
[email protected]              ||
kannal.patch (text/x-patch, 5 KB)
--- gateway-1.4.1/gw/smsc/smsc_smpp.c	2006-06-13 09:50:49.000000000 -0400
+++ gateway-1.4.1-wip/gw/smsc/smsc_smpp.c	2007-05-21 19:55:18.000000000 -0400
@@ -980,20 +980,26 @@
 }
 
 
-static void send_messages(SMPP *smpp, Connection *conn, long *pending_submits)
+static void send_messages(SMPP *smpp, Connection *conn, long *pending_submits, long *last_sent)
 {
     Msg *msg;
     SMPP_PDU *pdu;
     Octstr *os;
     double delay = 0;
+    double nextenq;
+    long start_time;
 
     if (*pending_submits == -1)
         return;
 
+
     if (smpp->conn->throughput > 0) {
         delay = 1.0 / smpp->conn->throughput;
+    	if ((date_universal_now() - *last_sent) < delay)
+	    return;
     }
 
+
     while (*pending_submits < smpp->max_pending_submits) {
     	/* Get next message, quit if none to be sent */
     	msg = gwlist_extract_first(smpp->msgs_to_send);
@@ -1006,6 +1012,10 @@
             bb_smscconn_send_failed(smpp->conn, msg, SMSCCONN_FAILED_MALFORMED, octstr_create("MALFORMED SMS"));
             continue;
         }
+
+	start_time = date_universal_now();
+	*last_sent = start_time;
+
         /* check for write errors */
         if (send_pdu(conn, smpp->conn->id, pdu) == 0) {
             struct smpp_msg *smpp_msg = smpp_msg_create(msg);
@@ -1017,8 +1027,17 @@
             /*
              * obey throughput speed limit, if any.
              */
-            if (smpp->conn->throughput > 0)
-                gwthread_sleep(delay);
+            if (smpp->conn->throughput > 0) {
+		/*
+		 * exit if the next delay will run us over the time of the last enquire
+		 */
+		if ((*last_sent - start_time) + delay > smpp->enquire_link_interval) break;
+		/*
+		 * if we did not time out then likely there was an external event so we
+		 * should scan the loop again.
+		 */
+                if (gwthread_sleep(delay) != 0) break;
+	    }
         }
         else { /* write error occurs */
             smpp_pdu_destroy(pdu);
@@ -1728,10 +1747,12 @@
     Connection *conn;
     int ret;
     long last_enquire_sent;
+    long last_sent_time;
     long pending_submits;
     long len;
     SMPP_PDU *pdu;
     double timeout;
+    double throughput_timeout;
     time_t last_response, last_cleanup;
 
     io_arg = arg;
@@ -1751,13 +1772,20 @@
         else
             conn = open_receiver(smpp);
 
-        last_enquire_sent = last_cleanup = last_response = date_universal_now();
+        last_sent_time = last_enquire_sent = last_cleanup = last_response = date_universal_now();
         pending_submits = -1;
         len = 0;
         smpp->throttling_err_time = 0;
         for (;conn != NULL;) {
             timeout = last_enquire_sent + smpp->enquire_link_interval
                         - date_universal_now();
+            if (smpp->conn->throughput > 0) {
+		throughput_timeout = last_sent_time + (1.0/smpp->conn->throughput)
+                        - date_universal_now();
+		if (throughput_timeout < timeout ) timeout = throughput_timeout; 
+		if (timeout <= 0) timeout = 0;
+	    }
+
 
             if (conn_wait(conn, timeout) == -1)
                 break;
@@ -1809,7 +1837,7 @@
                 /* 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);
+                    send_messages(smpp, conn, &pending_submits,&last_sent_time);
                 }
             }
 
@@ -1837,7 +1865,7 @@
                                                                     
             if (transmitter && difftime(time(NULL), smpp->throttling_err_time) > SMPP_THROTTLING_SLEEP_TIME) {
                 smpp->throttling_err_time = 0;
-                send_messages(smpp, conn, &pending_submits);
+                send_messages(smpp, conn, &pending_submits,&last_sent_time);
             }
         }
 
--- gateway-1.4.1/gwlib/gwthread.h	2005-09-19 18:07:33.000000000 -0400
+++ gateway-1.4.1-wip/gwlib/gwthread.h	2007-05-21 14:44:39.000000000 -0400
@@ -139,8 +139,9 @@
 int gwthread_poll(struct pollfd *fds, long numfds, double timeout);
 
 /* Sleep until "seconds" seconds have elapsed, or until another thread
- * calls gwthread_wakeup on us.  Fractional seconds are allowed. */
-void gwthread_sleep(double seconds);
+ * calls gwthread_wakeup on us.  Fractional seconds are allowed. 
+ * 0 is returned if the sleep timed out -1 on error and +1 on external wakeup */
+int gwthread_sleep(double seconds);
 
 /* Force a specific thread to terminate. Returns 0 on success, -1 if the
  * thread has been terminated while calling and non-zero for the pthread
--- gateway-1.4.1/gwlib/gwthread-pthread.c	2006-05-23 12:28:57.000000000 -0400
+++ gateway-1.4.1-wip/gwlib/gwthread-pthread.c	2007-05-21 14:20:16.000000000 -0400
@@ -752,7 +752,7 @@
 }
 
 
-void gwthread_sleep(double seconds)
+int gwthread_sleep(double seconds)
 {
     struct pollfd pollfd;
     struct threadinfo *threadinfo;
@@ -777,6 +777,7 @@
     if (ret == 1) {
         flushpipe(pollfd.fd);
     }
+    return(ret);
 }
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.