[erlang-bugs] simple_one_by_one doesnt join args list properly

Angel J. Alvarez Miguel <>
Sun Jun 24 09:07:19 CEST 2012


Gist for this issue

 git://gist.github.com/2978625.git


/Angel

On Sábado, 23 de Junio de 2012 00:33:18 Angel J. Alvarez Miguel escribió:
> Hi
> 
> simple_one_for_one doesnt joint well args from childspec and start_child
> calls...
> 
> group_supervisor:init/1
> 
> init(Opts) ->                 & Opts is a large property list from cmd-line
> args parsed with getopt {ok, {
>          {simple_one_for_one, 1, 60},
>          [
>             {mucfsm,      {sim_group_fsm,      start_link, [Opts]}, 
> transient, 60, worker, [sim_group]} ]
>          }
>    }.
> 
> 
> 
> test:main/0
> 
> main() ->
>     io:format("Starting simple_one_by_one group supervisor...\n"),
>     SuppOpts = [{ŕecursive,true},{option1,40}],                            
>                % This root property list all sup children will inherit it
> {ok,Pid} = group_supervisor:start_link(SuppOpts),
>     wait(5),
>     io:format("Adding a child dynamically...\n",[]),
>     FSMOpts = [{fsm2,100}],                                            %
> This is another property list  we want new children to see it also
> {ok,_ChildPid} = supervisor:start_child(Pid,[FSMOpts]),
>     wait(20).
> 
> 
> children running sim_group_fsm should be started as :
> 
> sim_group_fsm:start_link/1 but sup builds args list the worng way
> thustrying to call undefined functions
> 
> start_link/n
> 
> with n > 1
> 
> 
> As docs state that simple_one_by_one sup will do apply(M,F,A) where A =
> ArgsFromChildSpec ++ ArgsFromStartChild call but as gen_fsm start_link is
> always arity ONE , supervisor must enclose A ina list to enrure always
> arity ONE.
> 
> I provide an example... and a patch
> 
> Im currently using a local patched version as i need using such a feature,
> howevre ive searched my local OTP installation and, most if not all
> {M,F,A} tuples in child specs era of the form A = [ ], also in most apps
> ive downloaded from GITHUB, so i think this feature of SOFO sups is
> probably not exercised enough, and nobody noticed this issue....
> 
> 
> Please take a look and show me the rigth way of doing this in case im
> wrong.
> 
> Regards, Angel
> 
> Patched supervidor example:
> 
> Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:4:4] [async-threads:0]
> [hipe] [kernel-poll:false]
> 
> [QuickCheck] [PropEr] [Erl0MQ]
> Starting simple_one_by_one group supervisor...
> Eshell V5.9.1  (abort with ^G)
> [GROUP SUP] staring with argument: [{option1,40}]
> 1> [GROUP SUP] Ready to manage MuC with opts: [{option1,40}]'s
> Adding a child dynamically...
> start_link called with 1 argument: [[{option1,40}],[{fsm2,100}]]
> init fsm with args: [[{option1,40}],[{fsm2,100}]]
> Im alive!
> Im alive!
> Im alive!
> 
> 
> Original unpatched supervisor (stdllib 1.18.1)
> 
> erl -run test main
> [QuickCheck] [PropEr] [Erl0MQ]
> test.erl:11: Warning: variable 'ChildPid' is unused
> Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:4:4] [async-threads:0]
> [hipe] [kernel-poll:false]
> 
> [QuickCheck] [PropEr] [Erl0MQ]
> Starting simple_one_by_one group supervisor...
> [GROUP SUP] staring with argument: [{option1,40}]
> Eshell V5.9.1  (abort with ^G)
> 1> [GROUP SUP] Ready to manage MuC with opts: [{option1,40}]'s
> Adding a child dynamically...
> {"init terminating in
> do_boot",{{badmatch,{error,{'EXIT',{undef,[{sim_group_fsm,start_link,[[{op
> tion1,40}],[{fsm2,100}]],[]},{supervisor,do_start_child_i,3,[{file,"supervi
> sor.erl"},{line,319}]},{supervisor,handle_call,3,[{file,"supervisor.erl"},{
> line,344}]},{gen_server,handle_msg,5,
> [{file,"gen_server.erl"},{line,588}]},{proc_lib,init_p_do_apply,3,[{file,"
> proc_lib.erl"},{line,227}]}]}}}},[{test,main,0,[{file,"test.erl"},{line,11}
> ]},{init,start_it,1,[]},{init,start_em,1,[]}]}}
> 
> Crash dump was written to: erl_crash.dump
> init terminating in do_boot ()


More information about the erlang-bugs mailing list