Date: Wed, 17 Aug 2005 10:52:57 -0700 (PDT) From: Nick Johnson <freebsd@spatula.net> To: FreeBSD-gnats-submit@FreeBSD.org Subject: threads/85112: Resource temporarily unavailable reading from sockets with Java/libpthread/jdbc Message-ID: <20050817175257.E24F31701D@turing.morons.org> Resent-Message-ID: <200508190510.j7J5ABxb037178@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 85112
>Category: threads
>Synopsis: Resource temporarily unavailable reading from sockets with Java/libpthread/jdbc
>Confidential: no
>Severity: critical
>Priority: medium
>Responsible: freebsd-threads
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Aug 19 05:10:08 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator: Nick Johnson
>Release: FreeBSD 5.4-STABLE i386
>Organization:
morons.org
>Environment:
System: FreeBSD turing.morons.org 5.4-STABLE FreeBSD 5.4-STABLE #4: Mon Aug 15 21:22:19 PDT 2005 root@turing.morons.org:/usr/src/sys/i386/compile/TURING i386
Java 1.4.2-p7 built from ports
Postgresql 8.0.3 built from ports; however still using the Postgresql 7.4 JDBC driver
>Description:
When attempting to get a database connection with Java linked to libpthread, a socket exception is thrown:
java.net.SocketException: Resource temporarily unavailable
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:183)
at java.io.BufferedInputStream.read(BufferedInputStream.java:201)
at org.postgresql.PG_Stream.ReceiveChar(PG_Stream.java:139)
at org.postgresql.jdbc1.AbstractJdbc1Connection.openConnection(AbstractJdbc1Connection.java:190)
at org.postgresql.Driver.connect(Driver.java:122)
at java.sql.DriverManager.getConnection(DriverManager.java:512)
at java.sql.DriverManager.getConnection(DriverManager.java:193)
at net.spatula.news.Utils.getJDBCconnection(Utils.java:816)
Here is the code from getJDBCconnection, verbatim, including ugliness just for fun...
public static synchronized Connection getJDBCconnection() {
try {
Class.forName("org.postgresql.Driver");
} catch (Exception e) {
e.printStackTrace();
}
int retryCount = 5;
while (retryCount >0) {
try {
//XXX database name and username should be properties
String dbURL = "jdbc:postgresql://"+ getProperty("spatula.dbhost")+":"+
getProperty("spatula.dbport")+"/morons.org?user=www&password="+
getProperty("spatula.dbpass");
Connection c = DriverManager.getConnection(dbURL); // <--- this is line 816
return c;
} catch (Exception e) {
e.printStackTrace();
}
retryCount--;
try {
Thread.sleep(200 + (int)(Math.random()*50.0));
} catch (Exception e) {}
}
return null;
}
This fails every time when java links against libpthread and works every time when it is linked against libc_r.
I'm not entirely sure, but this may have started showing itself after I added this to /etc/make.conf:
CPUTYPE?=i686
CFLAGS=-O2 -pipe
or it may be totally unrelated. See also threads/84778 (http://www.freebsd.org/cgi/query-pr.cgi?pr=84778) which was previously
preventing me from getting far enough to make a database connection. (Once the class files were compiled with a process
linked against libc_r, they were in place for a process linked against libpthread to use.)
>How-To-Repeat:
Try to get a database connection.
>Fix:
Workaround is to configure the linker to use libc_r for all Java processes
in /etc/libmap.conf:
[/usr/local/jdk1.4.2/]
libpthread.so.1 libc_r.so.5
libpthread.so libc_r.so
>Release-Note:
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050817175257.E24F31701D>
