java/72151: JVM crash on 5.2.1-R

Dan Nelson dnelson at allantgroup.com
Tue Sep 28 15:30:29 PDT 2004


The following reply was made to PR java/72151; it has been noted by GNATS.

From: Dan Nelson <dnelson at allantgroup.com>
To: Andrzej Bialecki <ab at getopt.org>
Cc: freebsd-gnats-submit at FreeBSD.org
Subject: Re: java/72151: JVM crash on 5.2.1-R
Date: Tue, 28 Sep 2004 17:21:58 -0500

 In the last episode (Sep 28), Andrzej Bialecki said:
 > Running an application for Internet search engine (www.nutch.org). JDK built from ports:
 > 
 > # java -version
 > java version "1.4.2-p6"
 > Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-p6-root_21_sep_2004_22_20)
 > Java HotSpot(TM) Client VM (build 1.4.2-p6-root_21_sep_2004_22_20, mixed mode)
 > 
 > When executing a multi-threaded crawl (~50 threads), and running it for a couple of hours, JVM crashes with the following error log:
 > 
 > An unexpected exception has been detected in native code outside the VM.
 > Unexpected Signal : 11 occurred at PC=0x28151624
 > Function=flockfile+0x24
 > Library=/lib/libc.so.5
 > 
 > Current Java thread:
 >         at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
 
 This is because java is calling gethostent() which is not thread-safe
 (POSIX does not require it to be, either).  It uses a global "hostf"
 FILE* to read /etc/hosts, so multiple threads doing DNS lookups will
 almost certainly trash each other.  My quick hack is this, which
 returns a DNS error if hostf ends up NULL.  A better fix would be to
 add a mutex around the DNS routines in
 Inet4AddressImpl.lookupAllHostAddr.
 
 Index: gethostbyht.c
 ===================================================================
 RCS file: /home/ncvs/src/lib/libc/net/gethostbyht.c,v
 retrieving revision 1.16
 diff -u -p -r1.16 gethostbyht.c
 --- gethostbyht.c	22 Mar 2002 21:52:29 -0000	1.16
 +++ gethostbyht.c	3 Aug 2004 16:43:02 -0000
 @@ -112,6 +112,10 @@ gethostent()
  		return (NULL);
  	}
   again:
 + 	if (!hostf) {
 +		h_errno = NETDB_INTERNAL;
 +		return (NULL);
 + 	}
  	if (!(p = fgets(hostbuf, sizeof hostbuf, hostf))) {
  		h_errno = HOST_NOT_FOUND;
  		return (NULL);
 
 
 
 -- 
 	Dan Nelson
 	dnelson at allantgroup.com


More information about the freebsd-java mailing list