Using socket module in production?

Vans S vans_163@REDACTED
Fri Jun 12 18:31:50 CEST 2020


 We notice often using gen_tcp with sockets backend we get this warning printed:

3:24:4.923 <0.1018.0> [module: :gen_tcp_socket, socket: {:"$socket", #Reference<0.504347063.3068526593.55942>}, unknown_event: {:info, {:"$socket", {:"$socket", #Reference<0.504347063.3068526593.55942>}, :select, #Reference<0.504347063.3083599875.167918>}}, state: :connected]

Ignore the log format this is our custom format.

Seems to be some kinda race condition in the implementation.
    On Friday, June 12, 2020, 09:30:07 a.m. EDT, pablo platt <pablo.platt@REDACTED> wrote:  
 
 Hi Raimo,
I don't mind small changes in the API if changes will be indicated in the release notes.But I worry about other breaking changes or hidden bugs.If anyone from the community is already using it in production it will be reassuring.
Thank you.

On Fri, Jun 12, 2020 at 4:00 PM Raimo Niskanen <raimo+erlang-questions@REDACTED> wrote:

Hi Pablo!

We will still make backwards incompatible changes.  But we do not know of
any stability issues, and welcome all that stress test the code.

So your code might stop working work in a future 23.X release.

/ Raimo


On Fri, Jun 12, 2020 at 01:48:32PM +0300, pablo platt wrote:
> Hi,
> 
> Is it safe to use the NIF socket module for UDP in production in OTP 23?
> It's working in my tests but I'm not sure if it's considered unstable or if
> I'm missing configuration or error handling.
> 
> This is how I'm using it:
> 
> open() ->
>   {ok, Socket} = socket:open(inet, dgram, udp),
>   {ok, Port} = socket:bind(Socket, any),
>   {Socket, Port}.
> 
> active_once(Socket) ->
>     case socket:recvfrom(Socket, 0, [], nowait) of
>         {ok, {#{port := Port, addr := Addr}, Data}} ->
>             {udp, Addr, Port, Data};
>         {select, {select_info, _SelectTag, SelectRef}} ->
>             SelectRef;
>         {error, Reason} ->
>             exit(Reason),
>             error
>     end.
> 
> send(Socket, Addr, Port, Data) ->
>     Dest = #{family => inet,
>              port => Port,
>              addr => Addr},
>     case socket:sendto(Socket, Data, Dest, [], nowait) of
>         ok -> ok;
>         {select, {select_info, _SelectTag, _SelectRef}} ->
>             % need to wait for {'$socket', Socket, select, SelectRef}  and
> resend Data?
>             ok
>     end.
> 
> close(Socket) ->
>     socket:close(Socket).
> 
> % listen for select ref
> handle_info({'$socket', Socket, select, SelectRef}, _State) ->
>     case socket:recvfrom(Socket, 0, [], nowait) of
>         {ok, {#{port := Port, addr := Addr}, Data}} ->
>             % handle Data
>             ok;
>         {select, {select_info, _SelectTag, SelectRef}} ->
>            SelectRef;
>      {error, Reason} ->
>          exit(Reason),
>          error
>     end,
>     {noreply, State}.

-- 

/ Raimo Niskanen, Erlang/OTP, Ericsson AB

  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20200612/993f5980/attachment.htm>


More information about the erlang-questions mailing list