OTP socket.erl, unexpected interaction when receiving from errqueue

Raimo Niskanen raimo+erlang-questions@REDACTED
Wed Nov 25 11:37:12 CET 2020


Is it so that recvmsg(fd, &msg, MSG_ERRQUEUE) only receives from
the error queue, and never any regular data?

Today there is no VM support for a NIF do differ between POLLIN
and POLLERR.  I have asked the VM guys to have a look at that.

Without that you can as your response to receiving
{'$socket',Socket,select,SelectHandle}
call socket:recvmsg(Socket, [errqueue], 0), to poll, and then
if the poll gave {error,timeout} call socket:recvmsg(Socket, 0, nowait).

Then we will have to optimize Timeout =:= 0, and maybe introduce
Timeout =:= poll with a nicer return value for no data.

Timeout =:= 0 today causes quite some overhead, but it should work.

Cheers
/ Raimo


On Mon, Nov 23, 2020 at 05:42:23PM +0100, Andreas Schultz wrote:
> Hi,
> 
> If setup a socket with:
> 
>     socket:setopt(Socket, ip, recverr, true)
> 
> If then started a asynchronous recvmsg with:
> 
>     {select, SelectInfo} = socket:recvfrom(Socket, 0, [], nowait)
> 
> When now something arrives in the error queue, I'll get a select info
> message with:
> 
>     {'$socket', Socket, select, SelectInfo}
> 
> The problem is, nothing in there tells me to read from the error queue. The
> underlying OS poll/epoll call would have this information, but it is lost
> in the Erlang message.
> 
> When I now try to read from the socket with:
> 
>    socket:recvfrom(Socket, 0, [], nowait)
> 
> all I get is another `{select, SelectInfo}` tuple, followed by another
> `{'$socket', Socket, select, SelectInfo}` messages.
> This can actually end up in an endless busy loop.
> 
> To actually clear this I would to do a:
> 
>     socket:recvmsg(Socket, [errqueue], nowait)
> 
> On an POSIX socket, I would have to actually poll for POLLIN | POLLERR to
> get a similar behavior. But the return of the poll would tell me whether it
> was POLLIN or POLLERR (similar for epoll).
> For the Erlang API it might sense to always poll for both conditions, but
> we then should get an indication what exactly it was.
> 
> Would it be possible to change the $socket message to something like:
> 
>     {'$socket', Socket, error, SelectInfo}
> 
> for POLLERR/EPOLLERR ???
> 
> Regards
> Andreas
> --
> 
> Andreas Schultz

-- 

/ Raimo Niskanen, Erlang/OTP, Ericsson AB


More information about the erlang-questions mailing list