Hi andreas,


Andreas Fink a écrit :

On 05.08.2008, at 12:17, Vincent CHAVANIS wrote:

                                                   \
- (time(NULL) > (PRIVDATA(conn)->last_activity_time + PRIVDATA(conn)->keepalive))) + (time(NULL) >= (PRIVDATA(conn)->last_activity_time + PRIVDATA(conn)->keepalive)))

so this is keepalive always being +1... sounds good to me.

So you aggree to that fact that keepalive will be keepalive + 1 ?
The impact is that each UCP31 will be done with 1 second inlate. This is not what users want.
If I specify keepalive each 5 sec, i don't want it each 6 sec.


               } else if (emimsg->ot == 31) {
+ PRIVDATA(conn)->last_activity_time = time (NULL); /* XXX Process error codes here
                   if (octstr_get_char(emimsg->fields[0], 0) == 'N') {
                       long errorcode;

not sure why this is needed. Would sound like it would have never worked otherwise...

This is absolutly needed!
Take this exemple
00:00:00 you sent a UCP31
00:00:30 you received an ack of your UCP31
(the SMSC is overloaded in this case)
Then if your keepalive is set to 31 you will send just after 1 sec an other UCP31. And will result to block the sender thread (can_write = 0)




@@ -1269,7 +1317,7 @@
 */
static double emi2_get_timeouttime (SMSCConn *conn, Connection *server)
{
- double ka_timeouttime = PRIVDATA(conn)->keepalive ? PRIVDATA(conn)->keepalive + 1 : DBL_MAX; + double ka_timeouttime = PRIVDATA(conn)->keepalive ? PRIVDATA(conn)->keepalive : DBL_MAX;

shouldn't timeout be longer than keepalive? could above change not create a race condition to the fact that the keepalive was "just about to be sent" but timeout hit first?


double idle_timeouttime = (PRIVDATA(conn)->idle_timeout && server) ? PRIVDATA(conn)->idle_timeout : DBL_MAX; double result = ka_timeouttime < idle_timeouttime ? ka_timeouttime : idle_timeouttime;
@@ -1626,7 +1674,7 @@
    privdata->listening_socket = -1;
    privdata->can_write = 1;
    privdata->priv_nexttrn = 0;
-    privdata->last_activity_time = 0;
+ privdata->last_activity_time = time (NULL); /* to *NOT* force keepalive after login */

as I said I would leave keepalive at login.


This is not so trivial.

Vincent


Reply via email to