2009-05-20 6 views
1

Ich habe eine Anwendung über 2 Knoten verteilt. Wenn ich den ersten Knoten stoppe(), funktioniert der Failover einwandfrei, aber (manchmal?) Wenn ich den ersten Knoten neu starte, schlägt die Übernahme fehl und die Anwendung stürzt ab, da start_link bereits gestartet ist.Erlang Übernahme fehlgeschlagen nach erfolgreichem Failover

SUPERVISOR REPORT <0.60.0>         2009-05-20 12:12:01 
=============================================================================== 
Reporting supervisor       {local,twitter_server_supervisor} 

Child process 
    errorContext              start_error 
    reason           {already_started,<2415.62.0>} 
    pid                undefined 
    name                 tag1 
    start_function        {twitter_server,start_link,[]} 
    restart_type              permanent 
    shutdown                10000 
    child_type               worker 

ok 

Meine app

start(_Type, Args)-> 
    twitter_server_supervisor:start_link(Args). 

stop(_State)-> 
    ok. 

Mein Vorgesetzter:

start_link(Args) -> 
    supervisor:start_link({local,?MODULE}, ?MODULE, Args).  

Beide Knoten die gleiche sys.config-Datei verwenden.

Was verstehe ich nicht über diesen Prozess, dass das oben genannte nicht funktionieren sollte?

+1

Kann ich Sie fragen, wo Sie so schön formatiert sasl Supervisor-Bericht bekommen? Es ist VIEL besser lesbar als Standard. Können Sie den Link oder die Quelle teilen? – gleber

+1

Es ist das Standardergebnis, das ich mit rb: show (N) auf einer Windows-Box mit erl_12B bekomme. Die einzigen anderen Variationen, die ich gesehen habe, ist, wenn Sie den Anruf über RPC machen, dann ist die Ausgabe mit Knotennamen überflutet? Was siehst du ? –

Antwort

2

Es scheint, als ob Ihr Problem von twitter Server-Supervisor stammt, der versucht, eines seiner Kinder zu starten. Da der Fehlerbericht beschwert sich über das Kind mit start_function

{twitter_server,start_link,[]} 

Und da Sie nicht, dass Code angezeigt werden, kann ich nur vermuten, dass es sich einen Namen registrieren versucht, aber es ist schon ein Prozess mit, dass registriert Name.

Noch mehr zu raten, zeigt der Grund für eine Pid, ​​die Pid, ​​die den Namen hat, die wir für uns selbst zu greifen versucht:

{already_started,<2415.62.0>} 

Die Pid es hat eine von Null verschiedene Anfangs ganze Zahl, wenn es Null war es bedeutet, dass es sich um einen lokalen Prozess handelt. Daraus entnehme ich, dass Sie versuchen, einen globalen Namen zu registrieren, und Sie sind mit einem anderen Knoten verbunden, wo bereits ein Prozess global unter diesem Namen registriert ist.