Re: OTP socket.erl, unexpected interaction when receiving from errqueue

Raimo Niskanen <[email protected]>
Newsgroups gmane.comp.lang.erlang.general
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.