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