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

From: thomas at tada(dot)se (Thomas Hallgren)
To:
Subject: [Pljava-dev] Is it safe to use multi-threaded PL/Java in single-threaded postgres process?
Date: 2014-03-09 11:06:37
Message-ID: 531C4B3D.8020102@tada.se
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pljava-dev

On 2014-03-08 11:21, MauMau wrote:
> 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.
That wouldn't do much good since the psql backend that it links with
isn't built for multi-threading. This is also why the PL/Java protects
all calls to the psql backend. Only one single thread at a time can call
back to the backend.

>
> * 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.
>
That sounds correct.

> * 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.
>
Yes.

>
> 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.
>
While I understand your concern, I still believe that the PL/Java code
base does what's needed to run together with the PostgreSQL
single-threaded back-end. I don't think there are any problems with
errno or pointers. If there was, such problems would become apparent
immediately. Either as linker problems or as a general crash when the
runtime boots up. No such problems have been reported AFAIK.

> 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.
>
All true, but here we're marrying a JVM runtime with a single threaded
PostgreSQL backend. Normal recommendations don't really apply.

If you have time to really stress test PL/Java with respect to compiler
flags etc. that would of course be very valuable. I haven't performed
such tests since I first built PL/Java back in 2004. A lot has happened
since.

- thomas

> Regards
> MauMau
>
> _______________________________________________
> Pljava-dev mailing list
> Pljava-dev at lists.pgfoundry.org
> http://lists.pgfoundry.org/mailman/listinfo/pljava-dev

In response to

Browse pljava-dev by date

  From Date Subject
Next Message MauMau 2014-03-16 01:56:13 [Pljava-dev] Is it safe to use multi-threaded PL/Java in single-threaded postgres process?
Previous Message MauMau 2014-03-08 10:21:03 [Pljava-dev] Is it safe to use multi-threaded PL/Java in single-threaded postgres process?