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
