Is SPI safe to use in multi-threaded PL/Java? - Mailing list pgsql-hackers

From MauMau
Subject Is SPI safe to use in multi-threaded PL/Java?
Date
Msg-id D854220B41C34FBB94733445CDC62028@maumau
Whole thread Raw
Responses Re: Is SPI safe to use in multi-threaded PL/Java?
List pgsql-hackers
Hello,

Is PL/Java safe to use in terms of its threading design?  I'm going to ask 
the PL/Java community about this too, but I'd ask for opinions here because 
I believe people in this community have seasoned knowledge of OS and SPI.

To put the question in other words, is it safe to load a multi-threaded PL 
library in the single-threaded backend process, if the PL only calls SPI in 
the main thread?

PL/Java (pljava.so) is linked with the JNI (Java Native Interface) library, 
libjvm.so, in JRE.  libjvm.so is linked with libpthread.so, because Java VM 
is multi-threaded.  SO, "ldd pljava.so" shows libjvm.so and libpthread.so. 
pljava.so doesn't seem to be built for multh-threading --- none 
of -mt, -D_REENTRANT or -D_POSIX_C_SOURCE is specified when building it.

When the application calls Java stored function, pljava.so calls a function 
in libjvm.so to create a JVM in the backend process, then invokes the 
user-defined Java method in the main thread.  The user-defined Java method 
calls JDBC methods to access database.  The JDBC method calls are translated 
to backend SPI function calls through JNI.

The main thread can create Java threads using Java Thread API, and those 
threads can call JDBC methods.  However, PL/Java intercepts JDBC method 
calls and serializes SPI calls.  So, only one thread calls SPI functions at 
a time.  I'm wondering if this is the reason why PL/Java is safe for use.

What I'm concerned about is whether multi-threaded code (Java VM) can run 
safely in a single-threaded code (postgres).  I don't know what can be a 
particular problem with PL/Java, but in general, the mixture of 
single-threaded code and multi-threaded one seems to cause trouble around 
handling errno, memory and file handles/pointers.

FYI, JNI specification says that the code called from Java VM should be 
built for multi-threading as follows.  But postgres is not.

http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html#wp9502

[Excerpt]
Compiling, Loading and Linking Native Methods
Since the Java VM is multithreaded, native libraries should also be compiled 
and linked with multithread aware native compilers. For example, the -mt 
flag should be used for C++ code compiled with the Sun Studio compiler. For 
code complied with the GNU gcc compiler, the flags -D_REENTRANT 
or -D_POSIX_C_SOURCE should be used. For more information please refer to 
the native compiler documentation.

Regards
MauMau




pgsql-hackers by date:

Previous
From: Fabrízio de Royes Mello
Date:
Subject: Re: [PATCH] Store Extension Options
Next
From: Simon Riggs
Date:
Subject: Re: ALTER TABLE lock strength reduction patch is unsafe Reply-To: