Hi,
I need testers to test the throttling patch of EMI/UCP smsc.
You need to configure the throughput option for the SMSC in order to make it
work.
Please find in attachement, the patch.
Then apply it to the current CVS sources.
You should now see in your logfiles :
2006-04-07 18:08:24.554 [31695] [42] DEBUG: EMI2[EMI-SMSC]: QOS: Traffic Policy
exceeded, we need to sleep <0.198170>sec
2006-04-07 18:08:24.567 [31695] [42] DEBUG: EMI2[EMI-SMSC]: QOS: Traffic Policy
exceeded, we need to sleep <0.185829>sec
2006-04-07 18:08:24.591 [31695] [42] DEBUG: EMI2[EMI-SMSC]: QOS: Traffic Policy
exceeded, we need to sleep <0.161633>sec
cf (Throttling is not obeyed due to gwthread_wakup of sender thread)
http://bugs.kannel.org/view_bug_page.php?f_id=0000332
Please repport any bugs/comments to this list or/and directly to me.
regards
Vincent
--
Telemaque - NICE - (FR)
Service Technique - Developpement
http://www.telemaque.fr/
[EMAIL PROTECTED]
Tel : +33 4 93 97 71 64 (fax 68)
diff -rau /gateway-cvs/gw/smsc/smsc_emi.c /gateway/gw/smsc/smsc_emi.c
--- /gateway-cvs/gw/smsc/smsc_emi.c 2006-04-07 14:54:06.000000000 +0200
+++ /gateway/gw/smsc/smsc_emi.c 2006-04-07 17:12:38.000000000 +0200
@@ -122,6 +122,7 @@
int priv_nexttrn; /* next TRN, this should never be accessed
directly.
* use int emi2_next_trn (SMSCConn *conn)
instead.
*/
+ struct timeval last_mt_microtime; /* the last microtime a MT was sent
over the SMSC */
time_t last_activity_time; /* the last time something was sent over
the main
* SMSC connection
*/
@@ -168,6 +169,9 @@
if (result >= 0 && emimsg->or == 'O' && ( emimsg->ot == 31 || emimsg->ot
== 51)) {
PRIVDATA(conn)->last_activity_time = time (NULL);
+ if (emimsg->ot == 51) {
+ gettimeofday(&PRIVDATA(conn)->last_mt_microtime, 0);
+ }
}
return result;
@@ -988,9 +990,13 @@
*/
static int emi2_do_send(SMSCConn *conn, Connection *server)
{
+ PrivData *privdata = conn->data;
struct emimsg *emimsg;
+ struct timeval tv;
Msg *msg;
double delay = 0;
+ double mt_microtime = 0;
+ double microtime = 0;
if (conn->throughput > 0) {
delay = 1.0 / conn->throughput;
@@ -1001,8 +1007,32 @@
(msg = gw_prioqueue_remove(PRIVDATA(conn)->outgoing_queue)) !=
NULL) {
int nexttrn = emi2_next_trn(conn);
+ gettimeofday(&tv, 0);
+
+ mt_microtime = (double) PRIVDATA(conn)->last_mt_microtime.tv_sec +
(double) PRIVDATA(conn)->last_mt_microtime.tv_usec / 1000000;
+ microtime = (double) tv.tv_sec + (double) tv.tv_usec / 1000000;
+
+ debug("smsc.emi2", 0, "EMI2[%s]: QOS: last_mt_microtime:<%f> now:<%f>",
+ octstr_get_cstr(conn->id), mt_microtime, microtime);
+
if (conn->throughput > 0)
+ {
+ debug("smsc.emi2", 0, "EMI2[%s]: QOS: Sleeping <%f>sec",
octstr_get_cstr(conn->id), delay);
gwthread_sleep(delay);
+ debug("smsc.emi2", 0, "EMI2[%s]: QOS: Sleeping Done.",
octstr_get_cstr(conn->id));
+ while (mt_microtime + delay > microtime)
+ {
+ debug("smsc.emi2", 0, "EMI2[%s]: QOS: Traffic Policy exceeded,
we need to sleep <%f>sec",
+ octstr_get_cstr(conn->id), (mt_microtime + delay) -
microtime);
+ /* Sleeping rest of time */
+ gwthread_sleep((mt_microtime + delay) - microtime);
+
+ /* Refreshing time */
+ gettimeofday(&tv, 0);
+ mt_microtime = (double)
PRIVDATA(conn)->last_mt_microtime.tv_sec + (double)
PRIVDATA(conn)->last_mt_microtime.tv_usec / 1000000;
+ microtime = (double) tv.tv_sec + (double) tv.tv_usec / 1000000;
+ }
+ }
/* convert the generic Kannel message into an EMI type message */
emimsg = msg_to_emimsg(msg, nexttrn, PRIVDATA(conn));