You can set the debugging flag and check out the database log files to get more insight into what's going on.
On Tue, Sep 23, 2014 at 2:15 PM, Gerald de Jong gerald@delving.eu wrote:
Can I start up the basexserver with some kind of logging so I can see what leads to the IllegalMonitorStateException?
On Tue, Sep 23, 2014 at 1:53 PM, Christian Grün christian.gruen@gmail.com wrote:
Looking at these tests, it appears that none of them do large numbers of ADD commands. Did I miss something?
You may need to check the other tests. But as the (updating) add command will never be executed in parallel, it shouldn't cause any problems with parallelization (feel free to tell me if I'm wrong).
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
-- 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