[Haskell-cafe] Re: sendfile leaking descriptors on Linux?

Bardur Arantsson spam at scientician.net
Fri Feb 5 14:06:51 EST 2010


I desperation, I've tried to instrument a couple of the functions in 
SendFile:

 > sendFile'' :: Socket -> Handle -> Integer -> Integer -> IO ()
 > sendFile'' outs inp off count =
 >     do let out_fd = Fd (fdSocket outs)
 >        in_fd <- handleToFd inp
 >        putStrLn ("in_fd=" ++ show in_fd)
 >        finally (wrapSendFile' _sendFile out_fd in_fd off count)
 >                (do
 >                  putStrLn ("SENDFILE DONE " ++ show in_fd)
 >                )
 >
 > sendFile' :: Socket -> FilePath -> Integer -> Integer -> IO ()
 > sendFile' outs infp offset count =
 >     bracket
 >        (openBinaryFile infp ReadMode)
 >        (\h -> do
 >          putStrLn "CLOSING FILE!"
 >          hClose h
 >          putStrLn "FILE CLOSED!")
 >        (\inp -> sendFile'' outs inp offset count)

(Yes, this made me feel dirty.)

Here's the resulting output from around when the file descriptor gets lost:

---
Serving file 'X'...
Sending 674465792 bytes... 

in_fd=7 

SENDFILE DONE 7 

CLOSING FILE! 

FILE CLOSED! 

hums: Network.Socket.SendFile.Linux: resource vanished (Broken pipe) 

Got request for CONTENT for objectId=1700000000000000,f215040000000000 

Serving file 'X'...
Sending 672892928 bytes... 

in_fd=7 

SENDFILE DONE 7 

CLOSING FILE! 

FILE CLOSED! 

hums: Network.Socket.SendFile.Linux: resource vanished (Broken pipe) 

Got request for CONTENT for objectId=1700000000000000,f215040000000000 

Serving file 'X'...
Sending 670140416 bytes... 

in_fd=7 


<*----- What happened here?

Got request for CONTENT for objectId=1700000000000000,f215040000000000 

Serving file 'X'...
Sending 667256832 bytes... 

in_fd=9 

SENDFILE DONE 9 

CLOSING FILE! 

FILE CLOSED! 

hums: Network.Socket.SendFile.Linux: resource vanished (Broken pipe) 

Got request for CONTENT for objectId=1700000000000000,f215040000000000 

Serving file 'X'...
Sending 665028608 bytes... 

in_fd=9 

SENDFILE DONE 9 

CLOSING FILE! 

FILE CLOSED! 

hums: Network.Socket.SendFile.Linux: resource vanished (Broken pipe) 

Got request for CONTENT for objectId=1700000000000000,f215040000000000 

Serving file 'X'...
---


Anyone got any clues as to what might cause the behavior show at the mark?

The only idea I have is that *something* in the SendFile library kills 
the thread completely (or somehow evades "finally"), but I have no idea 
what it might be.

Cheers,



More information about the Haskell-Cafe mailing list