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


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 ?

yes because of >= versus >.


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)

This should never happen if you have window properly set. And while we have traffic, last activity is counting up so keepalive will not be sent out anyway as the activity keeps the link alive. Keepalive is ONLY sent if there is NO activity. But counting keepalive as activity itself doesnt sound wrong neither.




@@ -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