Hello,

Excellent. Glad to be of use.

I'll try the new snapshot right away.

Cheers

Simon

On Wed, Apr 22, 2015 at 10:06 AM, Christian Grün <christian.gr...@gmail.com>
wrote:

> Hi Simon,
>
> I finally had time to look at your examples, and...
>
> > One more detail: [...]
>
> ...seemed to fix it! The original version of this class was written by
> Jens (in the cc), but I also believe that the basic problem was that
> the locks instance was not synchronized. In my fix, I used a
> ConcurrentHashMap instance and changed other minor things in the code
> (see [1], 8.2 branch).
>
> A new snapshot is available, too..
>
> Thanks for the helpful feedback!
> Christian
>
> [1]
> https://github.com/BaseXdb/basex/commit/d3503d36325cb0fea58a13ee9f54feb5ce8868a6
> [2] http://files.basex.org/releases/latest
>
>
> if in the unsetLockIfUnused() method in the DBLocking
> > class, I put the locks.remove(object) call in a synchronized(locks){}
> block,
> > the problem does not appear any more, but as I don't understand exactly
> what
> > the problem is, I am not sure if it really solves it or if it just change
> > the timing a little bit making the problem less likely to happen.
> >
> > Regards
> >
> > Simon
> >
> >
> >
> >>
> >> Hello Christian,
> >>
> >> After some testing on my side, I didn't see the
> >> ConcurrentModificationException any more.
> >> That's the good news.
> >>
> >> However, when running a slightly modified version of the small test case
> >> you wrote from my sample application, I faced another problem.
> >> The test can run for a few seconds to almost an hour but eventually, the
> >> following exception is thrown.
> >>
> >> 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.locks.DBLocking.release(DBLocking.java:215)
> >>     at org.basex.core.Context.unregister(Context.java:287)
> >>     at org.basex.core.Command.execute(Command.java:105)
> >>     at org.basex.api.client.LocalSession.execute(LocalSession.java:132)
> >>     at org.basex.api.client.Session.execute(Session.java:36)
> >>     at basextest.BaseXTestDBLocking$1.run(BaseXTestDBLocking.java:43)
> >>
> >> I attach my new test case (BaseXTestAdd.java), but the main modification
> >> is that in each created thread I also add documents to the collections
> >> instead of only opening it.
> >>
> >> I was also able to see that in the call to getOrCreateLock() in
> >> DBLocking#release(final Proc pr) (line 212) the lock is created while it
> >> should already be in the locks Map, but I really cannot understand how
> this
> >> is possible. It would mean that the lock was removed by another thread
> but
> >> for that the usage value must be wrong in the lockUsage map, and I
> cannot
> >> find any sequence of operation that could lead to such a situation.
> >>
> >> Trying to pin-point more precisely the problem, I wrote another test
> >> (BaseXTestDBLocking.java) that calls directly the acquire and release
> >> methods of the DBLocking class. The problem seems to happen more quickly
> >> with this test.
> >>
> >>
> >> Any thoughts ?
> >>
> >> Regards
> >>
> >> Simon
> >>
> >
>

Reply via email to