[Lazarus] NETDB ResolveName unstable on Debian? Affects Indy 10.2.0.3 - causes intermittent EIdResolveError
Joshua Lim
joshua__lim at hotmail.com
Wed Jun 1 20:18:51 CEST 2011
Hi,
I've been trying to use Indy indy10.2.0.3 on Debian and after sometime I
noticed intermittent EIdResolveError, which doesn't happen on the
Windows host - I'm running Debian as Guest on Virtualbox. This problem
affects all Indy components that need to resolve dns.
After debugging Indy, I realized that the problem is with NETDB's
ResolveName. Indy calls ResolveName inside IdStackUnix.pas - see
below. LRetVal returns -1 or 0 (can't remember which) intermittently
even though network is up all the time.
The intermittent failure aside, another problem is if network is down
before the program calls ResolveName, every subsequent calls of
ResolveName will fail - NetAddr will always return 0.0.0.0. Is there
something which I need to do to "free" ResolveName?
I've also created a test program, details below. Any thoughts will be
appreciated. Thanks.
function TIdStackUnix.HostByName(const AHostName: string;
const AIPVersion: TIdIPVersion = ID_DEFAULT_IP_VERSION): string;
var
LI4 : array of THostAddr;
LH4 : THostEntry;
LI6 : array of THostAddr6;
LRetVal : Integer;
begin
case AIPVersion of
ID_IPv4 :
begin
if GetHostByName(AHostName,LH4) then
begin
Result := HostAddrToStr( LH4.Addr );
exit;
end
else
begin
SetLength(LI4, 10);
LRetVal := ResolveName(AHostName, LI4);
if LRetVal < 1 then begin
raise EIdResolveError.CreateFmt(RSResolveError, [AHostName,
'Error', LRetVal]); {do not localize}
end;
Result := NetAddrToStr(LI4[0]);
end;
end;
ID_IPv6 :
begin
SetLength(LI6, 10);
LRetVal := ResolveName6(AHostName, LI6);
if LRetVal < 1 then begin
raise EIdResolveError.CreateFmt(RSResolveError, [AHostName,
LRetVal]);
end;
Result := NetAddrToStr6(LI6[0]);
end;
end;
end;
Indy Trace:
----2011-06-01 22:47:01 stacktrace:
class: EIdResolveError
message: Error resolving host ismsgateway.com: Error (-1)
$0814DFB2 TIDSTACKUNIX__HOSTBYNAME, line 410 of
/home/joshua/Desktop/Data/send_20110421/indy/IdStackUnix.pas
$0814C3F6 TIDSTACK__RESOLVEHOST, line 518 of
/home/joshua/Desktop/Data/send_20110421/indy/IdStack.pas
$08165DF1 TIDIOHANDLERSTACK__CONNECTCLIENT, line 315 of
/home/joshua/Desktop/Data/send_20110421/indy/IdIOHandlerStack.pas
$08165514 TIDIOHANDLERSOCKET__OPEN, line 330 of
/home/joshua/Desktop/Data/send_20110421/indy/IdIOHandlerSocket.pas
$0815C5E4 TIDTCPCLIENTCUSTOM__CONNECT, line 305 of
/home/joshua/Desktop/Data/send_20110421/indy/IdTCPClient.pas
$081BDAB4 TIDTELNET__CONNECT, line 376 of
/home/joshua/Desktop/Data/send_20110421/indy/IdTelnet.pas
$08074EA6 TINDYTELNETTHREAD__ONTIMER, line 382 of indytelnetthread.pp
To confirm that this is not an Indy issue, I created a test console to
verify that ResolveName is the one that is giving problems. Download
full app source (inclusive of indy) from:-
http://www.2shared.com/file/S1U0A5zw/test_app.html
procedure TMyApplication.DoRun;
var
i: integer;
LI4 : array of THostAddr;
LRetVal : Integer;
begin
try
i := 1;
while i < 1000 do
begin
try
SetLength(LI4, 10);
LRetVal := ResolveName('google.com', LI4);
if LRetVal < 1 then writeln('Failed to retrieve address!');
writeln('NetAddr:'+NetAddrToStr(LI4[0]));
except
on E: Exception do begin
DumpException(E);
end;
end;
// sleep(100);
Inc(i);
end;
finally
end;
// stop program loop
Terminate;
end;
Here's the output from the console. You can also find a screen capture
here showing that PING works while the DNS resolve failed -
http://www.imageupload.org/?d=C894B4BF1
root at debian:/home/joshua/Desktop/Data/testapps/testpingclientconsole#
./project1
NetAddr:209.191.122.70
NetAddr:67.195.160.76
NetAddr:98.137.149.56
...............repeat........
NetAddr:67.195.160.76
NetAddr:209.191.122.70
NetAddr:98.137.149.56
NetAddr:69.147.125.65
Failed to retrieve address!
NetAddr:69.147.125.65
NetAddr:72.30.2.43
NetAddr:98.137.149.56
NetAddr:98.137.149.56
...............repeat........
NetAddr:98.137.149.56
NetAddr:69.147.125.65
NetAddr:98.137.149.56
Heap dump by heaptrc unit
753 memory blocks allocated : 23777/28248
753 memory blocks freed : 23777/28248
0 unfreed memory blocks : 0
True heap size : 131072
True free heap : 131072
root at debian:/home/joshua/Desktop/Data/testapps/testpingclientconsole#
Output from the console if network is down before console is launched,
and then network is reinstated, but ResolveName does not recover:-
joshua at debian:~/Desktop/Data/testapps/testresolvenameconsole$ ./project1
Failed to retrieve address!
NetAddr:0.0.0.0
Failed to retrieve address!
NetAddr:0.0.0.0
Failed to retrieve address!
NetAddr:0.0.0.0
Failed to retrieve address!
NetAddr:0.0.0.0
Failed to retrieve address!
NetAddr:0.0.0.0
Failed to retrieve address!
NetAddr:0.0.0.0
Failed to retrieve address!
NetAddr:0.0.0.0
Failed to retrieve address!
...............repeat........
Output from Console started with network up, disabled, and then enabled
again:-
joshua at debian:~/Desktop/Data/testapps/testresolvenameconsole$ ./project1
NetAddr:69.147.125.65
NetAddr:98.137.149.56
NetAddr:72.30.2.43
NetAddr:67.195.160.76
NetAddr:72.30.2.43
NetAddr:98.137.149.56
NetAddr:67.195.160.76
NetAddr:67.195.160.76
NetAddr:69.147.125.65
NetAddr:72.30.2.43
NetAddr:72.30.2.43
NetAddr:69.147.125.65
NetAddr:98.137.149.56
NetAddr:72.30.2.43
NetAddr:72.30.2.43
NetAddr:209.191.122.70
Failed to retrieve address!
NetAddr:209.191.122.70
Failed to retrieve address!
NetAddr:209.191.122.70
Failed to retrieve address!
NetAddr:209.191.122.70
Failed to retrieve address!
NetAddr:209.191.122.70
Failed to retrieve address!
NetAddr:209.191.122.70
Failed to retrieve address!
NetAddr:209.191.122.70
Failed to retrieve address!
..........repeat......
NetAddr:209.191.122.70
Failed to retrieve address!
NetAddr:209.191.122.70
Failed to retrieve address!
NetAddr:209.191.122.70
Failed to retrieve address!
NetAddr:209.191.122.70
Failed to retrieve address!
NetAddr:209.191.122.70
NetAddr:98.137.149.56
NetAddr:72.30.2.43
NetAddr:67.195.160.76
NetAddr:67.195.160.76
NetAddr:209.191.122.70
NetAddr:98.137.149.56
NetAddr:67.195.160.76
NetAddr:209.191.122.70
NetAddr:67.195.160.76
NetAddr:72.30.2.43
NetAddr:209.191.122.70
NetAddr:98.137.149.56
NetAddr:72.30.2.43
NetAddr:69.147.125.65
NetAddr:98.137.149.56
NetAddr:69.147.125.65
NetAddr:72.30.2.43
NetAddr:72.30.2.43
Failed to retrieve address!
NetAddr:72.30.2.43
NetAddr:98.137.149.56
NetAddr:69.147.125.65
NetAddr:209.191.122.70
NetAddr:209.191.122.70
NetAddr:98.137.149.56
NetAddr:98.137.149.56
NetAddr:69.147.125.65
NetAddr:72.30.2.43
NetAddr:209.191.122.70
NetAddr:69.147.125.65
Failed to retrieve address! <----down even though network connected.
NetAddr:69.147.125.65
NetAddr:69.147.125.65
NetAddr:98.137.149.56
..........repeat......
NetAddr:209.191.122.70
NetAddr:72.30.2.43
NetAddr:72.30.2.43
NetAddr:69.147.125.65
NetAddr:72.30.2.43
Heap dump by heaptrc unit
2153 memory blocks allocated : 63462/76648
2153 memory blocks freed : 63462/76648
0 unfreed memory blocks : 0
True heap size : 131072
True free heap : 131072
joshua at debian:~/Desktop/Data/testapps/testresolvenameconsole$
More information about the Lazarus
mailing list