论坛首页 综合技术论坛

Erlang supervisor 极其白痴的 Bug

浏览 5189 次
精华帖 (4) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-05-26  
根据supervisor的Document
如果把simple_one_for_one的supervisor的restart strategy设定为transient 那么

引用
Restart defines when a terminated child process should be restarted.

A permanent child process is always restarted.
A temporary child process is never restarted.
A transient child process is restarted only if it terminates abnormally, i.e. with another exit reason than normal.

也就是除了normal的exit,其他的情况都会从新启动.
但是事实上如果exit(Pid,shutdown)的话,就无法restart.
结果查了一下supervisor的source code,发现了一个极为白痴的错误

do_restart(_, shutdown, Child, State) ->
    NState = state_del_child(Child, State),
    {ok, NState};
do_restart(transient, Reason, Child, State) ->
    report_error(child_terminated, Reason, Child, State#state.name),
    restart(Child, State);

到底是document写错了呢?还是代码有问题。
但是按照常理推断,supervisor这种kernel库,应该是经过严格测试的,而且现在Erlang都已经version 12了,这种bug也应该有人发现吧.
   发表时间:2008-05-27  
normal一般约定为程序执行完成后正常退出,shutdown则约定为用户发起的退出,都算作正常退出。区分是有必要的,库里面有几个地方都有对这两个的特殊处理。
0 请登录后投票
   发表时间:2008-05-27  
to qiezi: 没看出来上面的程序有严重的bug吗? 这种bug对于erlang这样的系统算非常丢信心的哦。
0 请登录后投票
   发表时间:2008-06-02  
汗...确实有点白痴......
0 请登录后投票
   发表时间:2008-06-03  
到底有bug没??
0 请登录后投票
   发表时间:2009-05-23  
难道这已成为悬案?现在已经是R13了啊……
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics