Re: [chunkd patch 1/6] Fix the leak of suddenly closed connections

Jeff Garzik <[email protected]> Tue, 25 May 2010 18:25:14 -0400
Newsgroups org.kernel.vger.hail-devel
Message-ID <[email protected]>
On 05/21/2010 12:54 AM, Pete Zaitcev wrote:
> After a period of uptime, chunkd may stop working with this:
>
> May 20 08:51:47 azdragon2 chunkd[4034]: tcp accept: Too many open files
>
> An examination with lsof shows that file descriptors for sockets and
> object data files are leaked in neat pairs. As it turns out, the root
> cause is not processing the case when tabled opens a connection to
> read an object, then closes it before the data is transferred.
> On some systems, sendfile returns no error in such case, but the
> amount of data that it attempted to send before it recognized that
> the socket was closed. If that happens, chunkd will not receive a
> POLLOUT indication and the struct cli will linger forever with
> non-empty write queue.
>
> The fix has two parts:
>
>   1. Permit a client in evt_recycle state to process outstanding
>      writes in the same manner a client in evt_dispose does.
>
>      Note that in our specific failure case no actual processing
>      is going to occur, so this part has an effect of permitting
>      the dispatch to work. If we do not do this, a POLLIN may
>      throw us into the evt_read_fixed stage.
>
>   2. Once we're getting dispatched, dispose of clients that
>      had connections closed, using the unmaskable POLLHUP bit.
>
> As an aside, tabled 0.5-0.7.x resets the connections when Firefox
> asks for a file that was modified after a certain date. In that case,
> tabled wants to know when the file was modified, so it reads the
> header off chunkd. If it turns out that the client is not interested
> in the data, tabled simply closes the connection without reading
> whatever data has arrived. This may change in the future, but the
> bug in chunkd should be fixed anyway, for general robustness.
>
> Signed-off-by: Pete Zaitcev<[email protected]>

applied 1-6, after fixing truncation bug newly introduced