On Fri, 20 Feb 2004, Adrian Chadd wrote:

> * i start mirroring something via lftp
> * lftp uses Keepalive in its HTTP requests
> * I hit ctrl-C in lftp
> * a client fd does this:
>   - read handler gets called, size 0
>   - commMarkHalfClosed() is called
>   - ... no more IO is scheduled
>   - write handler gets called, sucessful write
>   - since Keepalive, the next request is scheduled
>   - .. so, a comm_read is issued ..
>   - .. which schedules a read ..
>   - read returns size 0 since yes, the socket has gone away
>   - commMarkHalfClosed() is called
>   - but, since the socket is already marked as half-closed, we get an assert and
>     it all goes pear shaped

Yes, and the problem is that you should not start reading a new request on 
a closed connection. If the connection is already known to be closed you 
know that there is no way there can be a request read from the connection.

You should still process already read requests however.

And no, this is not related to FTP. Just reading of requests from a client 
connection.

> Now, my questions:
> 
> * in ConnStateData::readSomeData(), is it ok to just return if the socket
>   is marked as half closed? Will a half-closed socket ever be re-opened
>   somehow?

A half-closed socket will never get reopened. The client->server channel 
is permanently closed.

> * what is the whole point of AbortChecker? As far as I can tell
>   AbortChecker::doIOLoop() isn't being called at all. I've modified it
>   to actually be called once a second, with no ill effects.

Robert?

Regards
Henrik

Reply via email to