[erlang-questions] tcp_send_error

Sverker Eriksson <>
Wed Apr 8 16:28:12 CEST 2009


Anthony Shipman wrote:
> I am looking at the source for inet_drv.c in 12B4. In the tcp_send_error() 
> function it says
>
> 	 * Note: The following message might get lost, in case the error
> 	 * occurred when we tried to write taken from the queue (no caller).
>
> Can the message really get lost and under what circumstances?
>
>   
When the process is not blocking in prim_inet:send() waiting for a 
reply. That is, the send operation was done asynchronous triggered by an 
internal polled write-event from the socket.

> In the kernel application prim_inet:send() the code waits indefinitely for a 
> response from the driver. If it can get lost then it looks like a send() can 
> block forever. I've got a case where high traffic over a very slow link 
> appears to result in prim_inet:send() getting stuck.
>
>   
Changes have been made to that code in R12B-5, R13A, R13B. Here are two 
fixes in the release notes regarding hanging send's:

R13A:
Calling gen_tcp:send() from several processes on socket with option 
send_timeout
could lead to much longer timeout than specified. The solution is a new 
socket option
{send_timeout_close,true} that will do automatic close on timeout. 
Subsequent calls
to send will then immediately fail due to the closed connection.

Coming R13B:
Fixed a bug on Windows that could make gen_tcp:send hang trying to send 
an iolist
of more than 16 binaries.


/Sverker, Erlang/OTP Ericsson





More information about the erlang-questions mailing list