2015-11-19 7 views
6

Erlangのinet_resで問題があります。私は私のエリクシールシェルから、また私のErlangシェルからも使用しようとしましたが、予期しない動作があります。時々私は、ドメインを検索することができるよ、時々私は、戻り値を持っていない:あなたは、私はそれを呼ばれる最初の2回を見ることができるように`inet_res`ライブラリを使用したエリクサーエラー

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'}] 

は、それはそれは、空の配列とthrid時間を返さ良い値を返しました。

私は第四パラメータretry: 5ともtimeout: 10に追加しようとしましたが、それは助けにはならない:

: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'}] 

私はまたのerlangシェルから直接しようと、私はまったく同じ動作をします:

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"}] 

私はなぜこのような予期しない行動があるのか​​知っていますか?このライブラリを間違った方法で使用しますか?

編集: 詳細については、他のドメイン(gmail.comなど)で試したところ、同じ問題があります。他の人々も、このコードを自分のコンピュータ上で別の場所で試してみました。 Circle-CIにも同じ失敗があります。

EDIT2:私はスラックに持っていた議論(エリクサーチーム)から コピー&ペースト

troush [20:45]それは私のドメインのために正常に動作しています。おそらくこの問題のドメイン特有のものでしょうか?

kdisneur [8:47 PM] 複数回試しましたか?私はあなたがセッションを殺して再試行することを意味することもあります。

troush [20: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 [8:55 PM]接続isssue。

kdisneur [8:56 PM]はい、セッション中に1回動作しているときは、私と同じ結果が得られます。だからこそ私は新しいエリクシールシェルの再起動について尋ねていたのです。

troush [8:59 PM]ああ、わかりました。はい、私はこの問題を幅広い新しいiexセッションで得ました。空のレスポンスですが、あなたのドメインにしかありません。 gmail/google.comでそれは完全に動作します

troush [9:01]そして、私は自分のカスタムドメインで同じ問題を抱えています。そこで、いくつか問題があります:simple_smile:ごめんなさい。

私のネットワークや特定のドメインからのものではないと思います。私はそれが本当に私がこのライブラリを使う方法だと思う。

ありがとうございました

+0

私は両方の '' iex'とerl'でこれを試してみましたが、それは私のためにすべての時間を動作します。 –

+0

あなたの試行の間に新しい 'iex'または' erl'セッションを開始しましたか?セッションを開始して正常に動作しても、同じセッションで何度も同じコールを何度もやり直すと、セッションは停止しても新しいセッションを開始することができます。時にはそうではありません。 –

+0

はい、私はあなたが意味するものを参照してください。もう一度試してみると、結果が空であることが示されました。あなたのタイムアウトオプションを30に上げることをお勧めします。 –

答えて

2

これは競合状態です。あなたはまだ存在しないものからデータを要求しています。 VMの初期化時にinet_dbはリゾルバのリストを取得する必要があります。そのプロセスが完了する前にそのクエリを作成しています。「ファスト・トラック」に

は:

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'}] 
関連する問題