2012-11-28 37 views
0

我試圖建立一個監督樹,其中我有這樣的結構:二郎監督樹終止

1根主管 - > 3「水平」上司 - >每個級別主管具有一個初始化監 - > X數目的工作人員(現在只有1爲例)

但由於某種原因,啓動二級監督使整個樹終止,如果我只開始1根 - > 1級 - > 1初始化 - > 1工人(或更多的工作人員)這很好,但只要我嘗試添加更多的主管,樹就會終止。

-module(otp_supervisor). 
-behavior(supervisor). 

-export([start_cell/1]). 
-export([init/1]). 

start_cell(root) -> 
    supervisor:start_link({local, root}, ?MODULE, [root]); 
start_cell({Type, Role}) -> 
    supervisor:start_link({local, Type}, ?MODULE, [{Type, Role}]). 

init([root]) -> 
    init_root(one_for_one, 3, 60); 
init([{level, Param}]) -> 
    init_level(one_for_one, 3, 60, {member, Param}); 
init([{member, Param}]) -> 
    init_member(one_for_one, 3, 60, Param). 

init_root(RestartStrategy, MaxRestart, MaxTime) -> 
    io:format("~p ~s: Spawning...~n", [self(), root_supervisor]), 
    {ok, { 
     {RestartStrategy, MaxRestart, MaxTime}, 
     [ 
      {olevel, 
       {otp_supervisor, start_cell, [{level, overseer}]}, 
       permanent, 1000, supervisor, [otp_supervisor] 
      }, 
      {slevel, 
       {otp_supervisor, start_cell, [{level, supervisor}]}, 
       permanent, 1000, supervisor, [otp_supervisor] 
      }, 
      {wlevel, 
       {otp_supervisor, start_cell, [{level, worker}]}, 
       permanent, 1000, supervisor, [otp_supervisor] 
      } 
     ] 
     } 
    }. 

init_level(RestartStrategy, MaxRestart, MaxTime, {member, overseer}) -> 
    io:format("~p ~s: Spawning...~n", [self(), overseer_level_supervisor]), 
    {ok, { 
     {RestartStrategy, MaxRestart, MaxTime}, 
     [ 
      {oinit, 
       {otp_supervisor, start_cell, [{member, overseer}]}, 
       permanent, 1000, supervisor, [otp_supervisor]} 
     ] 
     } 
    }; 
init_level(RestartStrategy, MaxRestart, MaxTime, {member, supervisor}) -> 
    io:format("~p ~s: Spawning...~n", [self(), supervisor_level_supervisor]), 
    {ok, { 
     {RestartStrategy, MaxRestart, MaxTime}, 
     [ 
      {sinit, 
       {otp_supervisor, start_cell, [{member, supervisor}]}, 
       permanent, 1000, supervisor, [otp_supervisor]} 
     ] 
     } 
    }; 
init_level(RestartStrategy, MaxRestart, MaxTime, {member, worker}) -> 
    io:format("~p ~s: Spawning...~n", [self(), worker_level_supervisor]), 
    {ok, { 
     {RestartStrategy, MaxRestart, MaxTime}, 
     [ 
      {winit, 
       {otp_supervisor, start_cell, [{member, worker}]}, 
       permanent, 1000, supervisor, [otp_supervisor]} 
     ] 
     } 
    }. 

init_member(RestartStrategy, MaxRestart, MaxTime, overseer) -> 
    io:format("~p ~s: Spawning...~n", [self(), init_overseer]), 
    {ok, { 
     {RestartStrategy, MaxRestart, MaxTime}, 
     [ 
      {ol_core, 
       {aux_datasocket, start, [ol_overseer1]}, 
       permanent, 1000, worker, [aux_datasocket] 
      } 
     ] 
     } 
    }; 
init_member(RestartStrategy, MaxRestart, MaxTime, supervisor) -> 
    io:format("~p ~s: Spawning...~n", [self(), init_supervisor]), 
    {ok, { 
     {RestartStrategy, MaxRestart, MaxTime}, 
     [ 
      {sl_core, 
       {aux_datasocket, start, [sl_overseer1]}, 
       permanent, 1000, worker, [aux_datasocket] 
      } 
     ] 
     } 
    }; 
init_member(RestartStrategy, MaxRestart, MaxTime, worker) -> 
    io:format("~p ~s: Spawning...~n", [self(), init_worker]), 
    {ok, { 
     {RestartStrategy, MaxRestart, MaxTime}, 
     [ 
      {wl_core, 
       {aux_datasocket, start, [wl_overseer1]}, 
       permanent, 1000, worker, [aux_datasocket] 
      } 
     ] 
     } 
    }. 

的aux_datasocket模塊是一個非常簡單的gen_server,通過自身工作完全正常(因爲它只不過是現在就開始了gen_server),所以我肯定錯誤不在於該模塊中。

+0

您是否收到任何崩潰報告? – legoscia

回答

1

猜測:您正在使用{local, Type}註冊點對同一位主管進行多次註冊。調試的方法是運行rel -boot start_sasl,然後查找崩潰/進度報告並嘗試找出錯誤。多重性問題表明這是錯誤的。

另一個重要的事情是,從殼體此樹鏈接到外殼。所以如果你最終因爲錯誤而殺死shell,poof也會進入supervisor樹。您需要將其移出鏈接的網絡:

Pid = spawn(fun() -> {ok, _} = supervisor_tree_start(), receive stop -> ok end end), 
... 
Pid ! stop.