process waits forever spawn_opt/5

Vyacheslav Levytskyy v.levytskyy@REDACTED
Wed Jun 16 09:13:12 CEST 2021


It's an old piece of code and the code is very simple: gen_server just 
spawns a function on several connected nodes. spawn_opt/5 is called by 
spawn/4, I don't call it directly.

The function doesn't interact with the gen_server that calls spawn/4, 
although I'd expect spawn/4 to run a process and return immediately 
anyway, am I wrong?

The code very literally looks like:

===

handle_cast(do_start, State) ->
     try
         my_start()
     catch
         What:Why:Stacktrace ->
             logger:warning("~p:~p~n~p", [What, Why, Stacktrace], #{mod 
=> ?MODULE, line => ?LINE})
     end,
     {noreply, State};

my_start() ->
     [spawn(Node, ?MODULE, my_action, [erlang:system_time(1)]) || Node 
<- [node() | my_cluster_nodes()]].

my_cluster_nodes() ->
     {L, _} = lists:unzip(ets:tab2list(?TBL)),
     L.

my_action(Now) ->
     % work with ETS, use an external database service

===


The code worked for a couple of years: I can't be 100% sure if this 
happened before or not, but in any case I see this situation for the 
first time. A recent change is upgrade to OTP24. The environment is 
Kubernetes, and the code runs inside docker container.

Thanks.

On 15.06.2021 22:12, Luke Bakken wrote:
> Hi Vyacheslav,
>
> It would be very helpful to share the code that spawn_opt is calling,
> or provide code to reproduce this condition.
>
> Does the function called by spawn_opt interact in _any_ way with the
> gen_server that calls spawn_opt?
>
> Thanks,
> Luke
>
> On Tue, Jun 15, 2021 at 1:09 PM Vyacheslav Levytskyy
> <v.levytskyy@REDACTED> wrote:
>> Hello,
>>
>> I'm surprised to see my gen_server process hanging forever when
>> executing spawn/4 call. Process info shows spawn_opt/5 as a current
>> function and status is waiting:
>>
>>   > process_info(P).
>> [{current_function,{erlang,spawn_opt,5}},
>>    {status,waiting},
>>    {message_queue_len,13},
>>    {trap_exit,false},
>>    {priority,normal},
>>    ...]
>>
>> Current stacktrace looks like:
>>
>>   > process_info(P, current_stacktrace).
>> {current_stacktrace,[{erlang,spawn_opt,5,[]},
>>                        {erlang,spawn,4,[]},
>>                        ...
>>                        {my_gen_server,handle_cast,2,
>>                                       [{file,"..."},
>>                                        {line,...}]},
>>                        {gen_server,try_dispatch,4,
>> [{file,"gen_server.erl"},{line,695}]},
>>                        {gen_server,handle_msg,6,
>> [{file,"gen_server.erl"},{line,771}]},
>>                        {proc_lib,init_p_do_apply,3,
>> [{file,"proc_lib.erl"},{line,226}]}]}
>>
>> I wonder what could be conditions that made spawn_opt/5 to stuck in this
>> state. Is there something I can do on my side to prevent such problems
>> in future?
>>
>> It's Erlang/OTP 24.0.2:
>>
>> Erlang/OTP 24 [erts-12.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10]
>> [async-threads:1] [jit]
>>
>> Thank you,
>> Vyacheslav
>>


More information about the erlang-questions mailing list