Question

J'essaie de comprendre ce qui se passe ici:

J'ai un superviseur qui est cyclique redémarrage d'un client sans déclenchement de la MaxR, MaxT le mécanisme.Le client se bloque juste assez lentement pour ne jamais déclencher le taux de prescription.

Il y aurait eu un autre mécanisme qui utilise supervisor:which_children/1 et delete_child/2, start_child/2 pour adapter l'ensemble des enfants à la réalité (son balayage pour les périphériques USB en essayant d'avoir un superviseur de l'enfant et par appareil).

Cela devrait normalement se comporter comme un filet de sécurité pour le taux de limitation, mais étrangement, il ressemble au mécanisme qui supprime et commence des enfants n'est pas appelée à tous.

Pour savoir ce qu'il se passe, j'ai appelé supervisor:which_children/1 de la coque et il ressemble à l'appel des blocs et ne revient jamais.

Se peut-il que les appels au superviseur sont bloqués alors qu'il est occupé à essayer de redémarrer un enfant?

Addendum:

il ressemble à l'incident se produit au cours enfant:

=SUPERVISOR REPORT==== 29-Mar-2011::21:36:20 ===
     Supervisor: {local,gateway_sup}
     Context:    start_error
     Reason:     {'EXIT',{timeout,{gen_server,call,[<0.155.0>,late_init]}}}
     Offender:   [{pid,<0.76.0>},
              {name,gw_3_5},
              {mfa,{channel,start_link,
                            [[{gateways,[{left,108},{right,103}]}],
                             {3,5}]}},
              {restart_type,transient},
              {shutdown,10000},
              {child_type,worker}]
Était-ce utile?

La solution

La réponse à la question en plus de la discussion est la suivante:

Lors du redémarrage d'un enfant qui échoue pendant le démarrage, les boucles de superviseur à l'intérieur de son processus (c'est un Gen_Server en interne) ne manipulant aucun appels d'API.

Il est donc particulièrement mauvais si la limitation des taux du superviseur est configurée pour ne pas déclencher sur les erreurs de démarrage des enfants.J'ai une startup lente (surtout sur l'erreur) dans mon exemple.

Donc, si le superviseur est en train de tenter à jamais de redémarrer un enfant, il n'est pas accessible pour les appels ... ce qui est généralement mauvais.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top