2015-11-19 42 views
6

我在Erlang的inet_res上遇到了一些麻煩。我試圖從我的Elixir shell以及從我的Erlang shell中使用它,但我有意外的行爲。有時候,我能夠查找域,有時我也沒有返回值:使用`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: 5timeout: 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'}] 

我也直接從二郎殼試過,我有完全一樣的行爲:

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 [8:45 PM]拷貝粘貼它爲我的域工作的罰款。也許這個問題領域具體?

kdisneur [8:47 PM] 你嘗試了幾次嗎?我的意思是殺死你的會議和重試,因爲有時它有效,有時它不會。

troush [下午8時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分]也許一個連接isssue。

kdisneur [8:56 PM]是的,當你在一個會議,它的工作一次,我有同樣的結果比你。這就是爲什麼我要求重新啓動一個新的Elixir外殼

troush [8:59 PM]哦,好吧,我明白了。是的,我在廣泛的新iex會議上討論了這個問題。空的回覆,但只在你的域名上。在gmail/google.com上它可以正常工作

troush [9:01]而且我的自定義域名也出現同樣的問題。所以這裏有一些問題:simple_smile:抱歉disonanse

所以我不認爲它來自我的網絡或特定域。我認爲這是關於我使用這個庫的方式。

感謝您的幫助

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