[Pljava-dev] Is it safe to use multi-threaded PL/Java in single-threaded postgres process?

From: maumau307 at gmail(dot)com (MauMau)
To:
Subject: [Pljava-dev] Is it safe to use multi-threaded PL/Java in single-threaded postgres process?
Date: 2014-03-08 10:21:03
Message-ID: 30A6B4B499494CED93770BBC4835840C@maumau
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pljava-dev

Hello,

Is PL/Java safe to use in terms of its threading design? I've just asked
pgsql-hackers about this and am waiting for response, adding the sentence:

"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?"

My understanding is:

* 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 cannot point out 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

Responses

Browse pljava-dev by date

  From Date Subject
Next Message Thomas Hallgren 2014-03-09 11:06:37 [Pljava-dev] Is it safe to use multi-threaded PL/Java in single-threaded postgres process?
Previous Message Adam 2014-02-28 08:11:49 [Pljava-dev] Build using maven nar on Windows with mingw-w64 for Postgres 9.3