2015-11-19 11 views
6

Ho qualche problema con inet_res da Erlang. Ho provato ad usarlo dalla mia shell Elixir e anche dalla mia shell Erlang ma ho un comportamento inaspettato. A volte sono in grado di ricercare un dominio, a volte non ho il valore di ritorno:Errori di elisir usando la libreria `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'}] 

Come si può vedere le prime due volte ho chiamato, è restituito un array vuoto e il tempo thrid, si ha restituito il buon valore.

Ho cercato di aggiungere a 4 ° parametri retry: 5 e anche timeout: 10 ma non aiuta:

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

Ho anche provato direttamente dalla shell erlang e ho esattamente lo stesso comportamento:

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

Sai perché ho un comportamento così imprevedibile? Uso questa libreria nel modo sbagliato?

MODIFICA: Per informazioni, ho provato con altri domini (ad esempio: gmail.com) e ho lo stesso problema. Altre persone hanno anche provato questo codice sul proprio computer e in un'altra posizione. Ho anche lo stesso fallimento su Circle-CI.

EDIT2: Una copia-incolla da una discussione che ho avuto sul Slack (squadra Elixir)

troush [20:45] Si sta lavorando bene per il mio dominio. Forse questo problema specifico del dominio?

kdisneur [20:47] hai provato più volte? Voglio dire uccidere la tua sessione e riprovare perché a volte funziona, a volte no.

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 [20:55] Forse un isssue connessione.

kdisneur [8:56 PM] sì, quando si è in una sessione e funziona una volta, ho lo stesso risultato di te. Ecco perché stavo chiedendo di riavviare una nuova conchiglia Elixir

troush [8:59 PM] Oh, ok, capisco. Sì, ho riscontrato questo problema nella nuova ampia sessione di iex. Risposte vuote, ma solo sul tuo dominio. Su gmail/google.com funziona perfettamente

troush [9:01] E ho lo stesso problema sul mio dominio personalizzato. Quindi c'è qualche problema con questo: simple_smile: sorry for disonanse

Quindi non penso che provenga dalla mia rete o per un dominio specifico. Penso che sia davvero il modo in cui utilizzo questa libreria.

Grazie per l'aiuto

+0

ho provato questo sia erl' 'iex' ed' e funziona per me ogni volta. –

+0

hai iniziato una nuova sessione 'iex' o' erl' tra i tuoi tentativi? Voglio dire, se inizio una sessione e funziona bene, se riprovo più volte la stessa chiamata (nella stessa sessione), continuerà a funzionare MA se interrompo la mia sessione, ne avvio una nuova, a volte funziona, a volte no. –

+0

Sì, capisco cosa intendi. Provare di nuovo ha mostrato che i risultati a volte sono vuoti. Suggerisco di aumentare l'opzione di timeout a 30. –

risposta

2

È una condizione di gara. Stai richiedendo dati da qualcosa che non esiste ancora. All'inizializzazione della VM inet_db è necessario prendere una lista di resolver. Stai facendo quella domanda prima che il processo sia completato.

Per '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'}] 
Problemi correlati