Je charge dynamiquement une application Erlang dans le système en fonction d'un fichier de configuration qui m'empêche de démarrer l'application distribuée au démarrage -- je parviens à faire fonctionner la reprise en cas de panne, mais pas la reprise (ou en termes OTP, Takeover).
Disons que j'ai NodeA exécutant l'application, et NodeB comme nœud de secours. Je débranche NodeA, et l'application migre vers NodeB. C'est attendu. Mais lorsque je remets en ligne NodeA et essaie d'appeler application:start(MyApp)
, j'obtiens :
{error, {shutdown,{myapp, start, [normal,["config.xml"]]}}}
Ce qui indique que l'application échoue au démarrage.
Peu importe, l'échec de démarrage est dû au fait que j'ai déjà les superviseurs en cours d'exécution sur l'autre NodeB, et je les ai reliés via net_adm:ping.
J'imagine que je peux appeler application:takeover/2 sur MyApp pour reprendre le contrôle du nœud et arrêter l'application sur l'autre nœud.
{error,{not_running_distributed, MyApp}}
Mais cela ne fonctionne pas non plus. Ma liste de priorité de nœuds est [NodeA, {NodeB, NodeC}]
, donc je pensais que l'application saurait se déplacer vers le nœud de priorité la plus élevée une fois de retour en ligne.
Comment puis-je implémenter un Takeover dans ce scénario ?