2015-11-19 15 views
6

Ich habe Probleme mit inet_res von Erlang. Ich habe versucht, es aus meiner Elixir-Shell und auch aus meiner Erlang-Shell zu verwenden, aber ich habe unerwartetes Verhalten. Manchmal eine Domain-Lookup Ich bin in der Lage, manchmal ich nicht den Rückgabewert haben:Elixir Fehler mit `inet_res` Bibliothek

iex(1)> :inet_res.lookup('disneur.me', :in, :mx) 
[] 
iex(2)> :inet_res.lookup('disneur.me', :in, :mx) 
[] 
iex(3)> :inet_res.lookup('disneur.me', :in, :mx) 
[{1, 'aspmx.l.google.com'}, {10, 'alt3.aspmx.l.google.com'}, 
{10, 'alt4.aspmx.l.google.com'}, {5, 'alt1.aspmx.l.google.com'}, 
{5, 'alt2.aspmx.l.google.com'}] 

Wie Sie die ersten beiden Male sehen kann ich es nannte, kehrte er ein leeres Array und die thrid Zeit, es hat den guten Wert zurückgegeben.

Ich habe versucht, in dem 4. Parameter retry: 5 und auch timeout: 10 hinzufügen, aber es hilft nicht:

:inet_res.lookup('disneur.me', :in, :mx, timeout: 10, retry: 5) 
[] 
iex(2)> :inet_res.lookup('disneur.me', :in, :mx, timeout: 10, retry: 5) 
[{1, 'aspmx.l.google.com'}, {10, 'alt3.aspmx.l.google.com'}, 
{10, 'alt4.aspmx.l.google.com'}, {5, 'alt1.aspmx.l.google.com'}, 
{5, 'alt2.aspmx.l.google.com'}] 

ich direkt von Erlang-Shell auch versucht, und ich habe genau das gleiche Verhalten:

1> inet_res:lookup("disneur.me", in, mx, [{timeout, 10}, {retry, 5}]). 
[] 
2> inet_res:lookup("disneur.me", in, mx, [{timeout, 10}, {retry, 5}]). 
[] 
3> inet_res:lookup("disneur.me", in, mx, [{timeout, 10}, {retry, 5}]). 
[] 
4> inet_res:lookup("disneur.me", in, mx, [{timeout, 10}, {retry, 5}]). 
[{1,"aspmx.l.google.com"}, 
{10,"alt3.aspmx.l.google.com"}, 
{10,"alt4.aspmx.l.google.com"}, 
{5,"alt1.aspmx.l.google.com"}, 
{5,"alt2.aspmx.l.google.com"}] 

Weißt du, warum ich solch unvorhersehbares Verhalten habe? Benutze ich diese Bibliothek falsch?

EDIT: Für Informationen habe ich versucht mit anderen Domänen (d. H. Gmail.com) und ich habe das gleiche Problem. Andere Leute haben diesen Code auch auf ihrem eigenen Computer und an verschiedenen Orten ausprobiert. Ich habe auch den gleichen Fehler bei Circle-CI.

EDIT2: Eine Copy-Paste aus einer Diskussion, die ich auf Slack hatte (Elixir Team)

troush [20.45] Es arbeitet für meine Domain in Ordnung. Vielleicht ist dieses Problem Domain-spezifisch?

kdisneur [8:47 PM] haben Sie mehrmals versucht? Ich meine, Sie zu töten und zu versuchen, weil es manchmal funktioniert, manchmal nicht.

troush [08.54]

iex(35)> :inet_res.lookup('google.com', :in, :mx) 
[{30, 'alt2.aspmx.l.google.com'}, {40, 'alt3.aspmx.l.google.com'}, 
{50, 'alt4.aspmx.l.google.com'}, {10, 'aspmx.l.google.com'}, 
{20, 'alt1.aspmx.l.google.com'}] 
iex(36)> :inet_res.lookup('google.com', :in, :mx) 
[{40, 'alt3.aspmx.l.google.com'}, {50, 'alt4.aspmx.l.google.com'}, 
{10, 'aspmx.l.google.com'}, {20, 'alt1.aspmx.l.google.com'}, 
{30, 'alt2.aspmx.l.google.com'}] 
iex(37)> :inet_res.lookup('google.com', :in, :mx) 
[{50, 'alt4.aspmx.l.google.com'}, {10, 'aspmx.l.google.com'}, 
{20, 'alt1.aspmx.l.google.com'}, {30, 'alt2.aspmx.l.google.com'}, 
{40, 'alt3.aspmx.l.google.com'}] 

troush [08.55] Vielleicht eine Verbindung isssue.

kdisneur [8:56 PM] ja, wenn Sie in einer Sitzung sind und es funktioniert einmal, ich habe das gleiche Ergebnis als Sie. Deshalb fragte ich nach Neustart einer neuen Elixir-Shell

Troushe [8:59 PM] Oh, okay, ich verstehe. Ja, ich habe dieses Problem bei einer neuen iex-Sitzung bekommen. Leere Antworten, aber nur für deine Domain Auf Google Mail/google.com funktioniert es perfekt

Troushe [9:01] Und ich habe dasselbe Problem auf meiner benutzerdefinierten Domäne. Also gibt es ein Problem damit: simple_smile: sorry für Disonanse

Also ich glaube nicht, dass es aus meinem Netzwerk oder für eine bestimmte Domäne kommt. Ich denke, es geht wirklich darum, wie ich diese Bibliothek nutze.

Danke für Ihre Hilfe

+0

Ich habe versucht, dies sowohl in der 'iex' und' erl' und es funktioniert jedes Mal für mich. –

+0

hast du eine neue 'iex' oder' erl' Sitzung zwischen deinen Versuchen gestartet? Ich meine, wenn ich eine Sitzung starte und es funktioniert gut, wenn ich denselben Anruf immer und immer wieder wiederhole (in derselben Sitzung), wird es weiter funktionieren ABER wenn ich meine Sitzung stoppe, starte eine neue, manchmal funktioniert es, manchmal nicht. –

+0

Ja, ich verstehe was du meinst. Ein erneuter Versuch zeigte, dass die Ergebnisse manchmal leer sind. Ich schlage vor, die Zeitüberschreitung auf 30 zu erhöhen. –

Antwort

2

Es ist eine Race-Bedingung ist. Sie fordern Daten von etwas an, das noch nicht existiert. Bei der VM-Initialisierung muss inet_db eine Liste von Resolvern abrufen. Sie machen diese Abfrage, bevor dieser Prozess abgeschlossen ist.

To 'Fast-Track':

iex(1)> :inet_db.add_ns({4,2,2,1}) ; :inet_res.lookup('disneur.me', :in, :mx) 
[{10, 'alt3.aspmx.l.google.com'}, {10, 'alt4.aspmx.l.google.com'}, 
{5, 'alt1.aspmx.l.google.com'}, {5, 'alt2.aspmx.l.google.com'}, 
{1, 'aspmx.l.google.com'}] 
Verwandte Themen