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