[erlang-bugs] simple_one_by_one doesnt join args list properly

Angel J. Alvarez Miguel <>
Sat Jun 23 00:33:18 CEST 2012


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,[[{option1,40}],[{fsm2,100}]],[]},{supervisor,do_start_child_i,3,[{file,"supervisor.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 ()

-------------- next part --------------
A non-text attachment was scrubbed...
Name: group_supervisor.erl
Type: text/x-erlang
Size: 528 bytes
Desc: not available
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20120623/472555e5/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: sim_group_fsm.erl
Type: text/x-erlang
Size: 2152 bytes
Desc: not available
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20120623/472555e5/attachment-0001.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test.erl
Type: text/x-erlang
Size: 573 bytes
Desc: not available
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20120623/472555e5/attachment-0002.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: supervisor.patch
Type: text/x-patch
Size: 538 bytes
Desc: not available
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20120623/472555e5/attachment-0003.bin>


More information about the erlang-bugs mailing list