Hello all,
I experienced a situation when TWSocket's handlers confuse application workflow.
I have SessionConnected handler async-ly reporting an error and SessionClosed 
handler async-ly reconnecting/pausing/reporting an error - depends of several 
conditions.
Everything worked fine for months, but today the server I was connecting to 
went down.
Here's the log (Pos/SetState are my methods):

2011-10-12      10:37:39.311    7FD10330 Socket handle created 3572
2011-10-12      10:37:39.311    SocketChangeState wsClosed -> wsOpened
2011-10-12      10:37:39.311    TWSocket will connect to ****
2011-10-12      10:37:39.311    SocketChangeState wsOpened -> wsConnecting
2011-10-12      10:37:40.326    SocketChangeState wsConnecting -> wsConnected
2011-10-12      10:37:40.326    SocketSessionConnected, Connection refused 
(#10061) // OK. Error on connect. My code commands to report an error and 
reconnect
2011-10-12      10:37:40.326    PostState: csConnecting -> csError
2011-10-12      10:37:40.326    7FD10330 TCustomWSocket.Shutdown 1 3572
2011-10-12      10:37:40.326    SocketChangeState wsConnected -> wsClosed // ! 
Oops. The socket was "kinda connected" and then closed
2011-10-12      10:37:40.326    SocketSessionClosed // ! Looks like just an 
accident closing after successful connect, closing WITHOUT ANY ERROR. So my 
code commands to fall asleep
2011-10-12      10:37:40.326    PostState: csConnecting -> csSleeping
2011-10-12      10:37:40.326    SetState: csConnecting -> csError // OK. Here 
the state commanded in SocketSessionConnected is finally set
2011-10-12      10:37:40.326    PostState: csError -> csReconnect // OK. Here 
we command to retry after an error
2011-10-12      10:37:40.326    SetState: csError -> csSleeping // Oops! 
Command from SocketSessionClosed has arrived
2011-10-12      10:37:40.326    SetState: csSleeping -> csReconnect // Damn, 
the previous reconnect command has arrived
...

Frankly speaking, there was no serious trouble except for strange high CPU load 
which I still can't track. But I think the very principle of calling the 
methods here enables possible troubles. I see two major danger sources here:
1) Despite of error on connect, socket state changes to wsConnected anyway.
2) Close is called without any error code so it looks like an accidental line 
break.

What have I do to handle the descibed situation properly?
* I can't use only OnSessionConnected because then I won't catch disconnects 
after successful connect
* I can't use only OnSessionClosed because then I won't realise that an error 
occured on connect
* I can't use both of them because they're messing up.

So for now I have to invent some flag to tell the OnSessionClosed that 
OnSessionConnected has already handled the situation. 
Maybe you have more clever alternative?

-- 
Anton
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to