From: thomas at tada.se (Thomas Hallgren) Date: Sun, 09 Mar 2014 12:06:37 +0100 Subject: [Pljava-dev] Is it safe to use multi-threaded PL/Java in single-threaded postgres process? In-Reply-To: <30A6B4B499494CED93770BBC4835840C@maumau> References: <30A6B4B499494CED93770BBC4835840C@maumau> Message-ID: <531C4B3D.8020102@tada.se> 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