Thanks Christian. I will try to find out how I can possibly cause an IllegalMonitorStateException.
Looking at these tests, it appears that none of them do large numbers of ADD commands. Did I miss something?
On Tue, Sep 23, 2014 at 1:34 PM, Christian Grün christian.gruen@gmail.com wrote:
The fact that it's scala should be insignificant, since I'm using the
Java
API.
Well, it might be theoretically insignificant, but we cannot give a quick answer on what's your problem. In general, parallel client requests are no problem, we have various JUnit tests doing exactly that (see e.g. [1], [2] or [3]).
[1] https://github.com/BaseXdb/basex/blob/master/basex-core/src/test/java/org/ba... [2] https://github.com/BaseXdb/basex/blob/master/basex-tests/src/test/java/org/b... [3] https://github.com/BaseXdb/basex/blob/master/basex-tests/src/test/java/org/b...
What's happening is that two (or more) threads are doing this at the same time:
ClientSession session = new ClientSession(...); session.execute(new Open(database)); session.execute(new Set("autoflush", "false")); session.add([path string], [document-bytes]); // a zillion times session.execute(new Flush()); session.close();
My first question is of course if this should work parallel with no
problems
"in theory".
On Tue, Sep 23, 2014 at 12:46 PM, Christian Grün <
christian.gruen@gmail.com>
wrote:
...difficult to tell, as we don't have too much experience with Scala. Could you provide this example as Java code?
On Tue, Sep 23, 2014 at 12:10 PM, Gerald de Jong gerald@delving.eu wrote:
Dear BaseX experts,
I'm wondering if anybody can see something that I'm doing wrong. I
would
expect it to be possible to add documents from multiple threads. Am I wrong about that??
When I set two of my datasets saving documents to BaseX 7.9 at the
same
time, I get this exception:
$ basexserver BaseX 7.9 [Server] Server was started (port: 1984) Exception in thread "Thread-2295"
java.lang.IllegalMonitorStateException
at
java.util.concurrent.locks.ReentrantReadWriteLock$Sync.tryRelease(ReentrantReadWriteLock.java:374)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1260)
at
java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.unlock(ReentrantReadWriteLock.java:1131)
at org.basex.core.DBLocking.release(DBLocking.java:219) at org.basex.core.Context.unregister(Context.java:249) at org.basex.core.Command.execute(Command.java:104) at org.basex.core.Command.execute(Command.java:117) at org.basex.server.ClientListener.execute(ClientListener.java:384) at org.basex.server.ClientListener.add(ClientListener.java:355) at org.basex.server.ClientListener.run(ClientListener.java:100)
All I am doing is making concurrent calls in two parallel sessions:
session = new ClientSession(...) session.execute(new Open(database)) session.execute(new Set("autoflush", "false")) session.add([path string], [document-bytes]) // a zillion times session.execute(new Flush())
During the execution of the parallel add commands, it crashes.
The relevant code:
def withSession[T](block: ClientSession => T): T = { val session = new ClientSession(host, port, user, pass) try { block(session) } finally { session.close() } }
def withDbSession[T](database: String)(block: ClientSession => T):
T =
{ withSession { session => session.execute(new Open(database)) session.execute(new Set("autoflush", "false")) val result = block(session) session.execute(new Flush()) result } }
then:
withDbSession { session => // many calls to session.add(...) }
-- Delving BV, Vasteland 8, Rotterdam http://www.delving.eu http://twitter.com/fluxe skype: beautifulcode +31629339805
-- Delving BV, Vasteland 8, Rotterdam http://www.delving.eu http://twitter.com/fluxe skype: beautifulcode +31629339805