Home » Modeling » EMF » [CDO] Concurrent Access to Models
|
Re: [CDO] Concurrent Access to Models [message #911798 is a reply to message #911549] |
Wed, 12 September 2012 10:39 |
|
Am 11.09.2012 22:51, schrieb Erik Englund:
> So I have been trying to following the tutorial by Eike Stepper at
> http://thegordian.blogspot.com/2011/07/concurrent-access-to-models.html.
> I got a model setup and was able to connect to the CDO Server. I am running the CDO server with a mem data store.
>
> I create 100 jobs that all add an object to a list. I of course get conflicts.
> I am having problems trying to resolve those conflicts. I've tried several different approaches without any luck:
>
>
> transaction.options().addConflictResolver(new AbstractObjectConflictResolver.TakeRemoteChangesThenApplyLocalChanges());
Our conflict resolvers are suspected to suffer from an unanalyzed bug. This particular one is known not to work at all.
> or
>
> library.getStock().add(book);
> try {
> transaction.commit();
> } catch (CommitException e) {
> transaction.rollback();
> // Recursive call to this method to try again
> addBook(library, book, transaction);
> }
I can't see recursion here. A simple loop would be good.
> I get various problems:
>
> [ERROR] Rollback in MEMStore: java.util.ConcurrentModificationException: Attempt by Transaction[2:2] to modify
> historical revision: CDORevisionDelta[Library@OID3:0v1 --> [CDOFeatureDelta[stock, LIST, list=[CDOFeatureDelta[stock,
> ADD, value=oid1, index=0]]]]]
As you said, this is to be expected with 100 jobs trying to modify the same object.
> java.lang.NullPointerException
> at org.eclipse.emf.internal.cdo.view.AbstractCDOView.invalidate(AbstractCDOView.java:1218)
The complete stack trace or the exact build ID would help to see what is happening here or why. So I can only assume
that you're using 4.1 GA and this exception is a result of a race condition between the server and a client that's to be
notified about an actual remote change. The receiving client has just closed its view/transaction while the invalidation
notification is being processed in a background thread. If you submit a bugzilla I can prevent RuntimeException from
propagating if the view is already closed.
> I even tried using a write lock and got other errors:
>
>
> CDOLock lock = library.cdoWriteLock();
> lock.lock();
> library.cdoReload();
cdoReload() is not (almost never) needed. In particular the acquisition of a lock always atomically ensures that the
latest repository state is loaded for the locked object(s).
> library.getStock().add(book);
> try {
> transaction.commit();
> } catch (CommitException e) {
> e.printStackTrace();
> } finally {
> lock.unlock();
This unlock() is not needed with transaction.options().setAutoReleaseLocksEnabled(true), which is the default setting.
> }
>
> !MESSAGE An internal error occurred during: "Populator 2".
> !STACK 0
> org.eclipse.net4j.util.WrappedException: java.util.concurrent.TimeoutException
> at org.eclipse.net4j.util.WrappedException.wrap(WrappedException.java:54)
> at org.eclipse.emf.cdo.internal.net4j.protocol.CDOClientProtocol.lockObjects2(CDOClientProtocol.java:267)
I thought this would happen some day. If too many clients compete for the same write lock (whether it's implicit or
explicit) then some of the clients would run into a TimeoutException. IIRC the respective timeout is currently hardcoded
to 1000 milliseconds. If you submit a bugzilla I can see how to make it configurable.
Cheers
/Eike
----
http://www.esc-net.de
http://thegordian.blogspot.com
http://twitter.com/eikestepper
Cheers
/Eike
----
http://www.esc-net.de
http://thegordian.blogspot.com
http://twitter.com/eikestepper
|
|
|
Re: [CDO] Concurrent Access to Models [message #911874 is a reply to message #911798] |
Wed, 12 September 2012 13:46 |
Erik Englund Messages: 49 Registered: July 2009 |
Member |
|
|
Eike,
Thanks for the quick response!
Here is some more details.
I am using Eclipse 4.2.0 and CDO 4.1.0.v20120612-1844
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.getResource("/library.extlibrary");
Library library = (Library) resource.getContents().get(0);
boolean added = false;
try {
while (!added) {
try {
library.getStock().add(book);
transaction.commit();
added = true;
} catch (CommitException e) {
transaction.rollback();
}
}
}
finally {
transaction.close();
}
The server produced the following exceptions:
[ERROR] Attempt by Transaction[2:2] to modify historical revision: CDORevisionDelta[Library@OID3:0v1 --> [CDOFeatureDelta[stock, LIST, list=[CDOFeatureDelta[stock, ADD, value=oid1, index=0]]]]]
java.util.ConcurrentModificationException: Attempt by Transaction[2:2] to modify historical revision: CDORevisionDelta[Library@OID3:0v1 --> [CDOFeatureDelta[stock, LIST, list=[CDOFeatureDelta[stock, ADD, value=oid1, index=0]]]]]
at org.eclipse.emf.cdo.internal.server.TransactionCommitContext.computeDirtyObject(TransactionCommitContext.java:1035)
at org.eclipse.emf.cdo.internal.server.TransactionCommitContext.computeDirtyObjects(TransactionCommitContext.java:989)
at org.eclipse.emf.cdo.internal.server.TransactionCommitContext.write(TransactionCommitContext.java:479)
at org.eclipse.emf.cdo.spi.server.InternalCommitContext$1.runLoop(InternalCommitContext.java:43)
at org.eclipse.emf.cdo.spi.server.InternalCommitContext$1.runLoop(InternalCommitContext.java:1)
at org.eclipse.net4j.util.om.monitor.ProgressDistributor.run(ProgressDistributor.java:96)
at org.eclipse.emf.cdo.server.internal.net4j.protocol.CommitTransactionIndication.indicatingCommit(CommitTransactionIndication.java:262)
at org.eclipse.emf.cdo.server.internal.net4j.protocol.CommitTransactionIndication.indicating(CommitTransactionIndication.java:96)
at org.eclipse.emf.cdo.server.internal.net4j.protocol.CDOServerIndicationWithMonitoring.indicating(CDOServerIndicationWithMonitoring.java:109)
at org.eclipse.net4j.signal.IndicationWithMonitoring.indicating(IndicationWithMonitoring.java:86)
at org.eclipse.net4j.signal.IndicationWithResponse.doExtendedInput(IndicationWithResponse.java:92)
at org.eclipse.net4j.signal.Signal.doInput(Signal.java:328)
at org.eclipse.net4j.signal.IndicationWithResponse.execute(IndicationWithResponse.java:65)
at org.eclipse.net4j.signal.IndicationWithMonitoring.execute(IndicationWithMonitoring.java:65)
at org.eclipse.net4j.signal.Signal.runSync(Signal.java:253)
at org.eclipse.net4j.signal.Signal.run(Signal.java:149)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
The client produced the following error:
[ERROR] Rollback in MEMStore: java.util.ConcurrentModificationException: Attempt by Transaction[2:6] to modify historical revision: CDORevisionDelta[Library@OID3:0v1 --> [CDOFeatureDelta[stock, LIST, list=[CDOFeatureDelta[stock, ADD, value=oid1, index=0]]]]]
at org.eclipse.emf.cdo.internal.server.TransactionCommitContext.computeDirtyObject(TransactionCommitContext.java:1035)
at org.eclipse.emf.cdo.internal.server.TransactionCommitContext.computeDirtyObjects(TransactionCommitContext.java:989)
at org.eclipse.emf.cdo.internal.server.TransactionCommitContext.write(TransactionCommitContext.java:479)
at org.eclipse.emf.cdo.spi.server.InternalCommitContext$1.runLoop(InternalCommitContext.java:43)
at org.eclipse.emf.cdo.spi.server.InternalCommitContext$1.runLoop(InternalCommitContext.java:1)
at org.eclipse.net4j.util.om.monitor.ProgressDistributor.run(ProgressDistributor.java:96)
at org.eclipse.emf.cdo.server.internal.net4j.protocol.CommitTransactionIndication.indicatingCommit(CommitTransactionIndication.java:262)
at org.eclipse.emf.cdo.server.internal.net4j.protocol.CommitTransactionIndication.indicating(CommitTransactionIndication.java:96)
at org.eclipse.emf.cdo.server.internal.net4j.protocol.CDOServerIndicationWithMonitoring.indicating(CDOServerIndicationWithMonitoring.java:109)
at org.eclipse.net4j.signal.IndicationWithMonitoring.indicating(IndicationWithMonitoring.java:86)
at org.eclipse.net4j.signal.IndicationWithResponse.doExtendedInput(IndicationWithResponse.java:92)
at org.eclipse.net4j.signal.Signal.doInput(Signal.java:328)
at org.eclipse.net4j.signal.IndicationWithResponse.execute(IndicationWithResponse.java:65)
at org.eclipse.net4j.signal.IndicationWithMonitoring.execute(IndicationWithMonitoring.java:65)
at org.eclipse.net4j.signal.Signal.runSync(Signal.java:253)
at org.eclipse.net4j.signal.Signal.run(Signal.java:149)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
The client then failed:
!ENTRY org.eclipse.core.jobs 4 2 2012-09-12 09:33:21.280
!MESSAGE An internal error occurred during: "Populator 1".
!STACK 0
java.lang.IllegalStateException: Cannot modify a frozen revision
at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.checkFrozen(BaseCDORevision.java:828)
at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.setValue(BaseCDORevision.java:783)
at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.getList(BaseCDORevision.java:697)
at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.getList(BaseCDORevision.java:676)
at org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionDeltaImpl.compare(CDORevisionDeltaImpl.java:379)
at org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionDeltaImpl.<init>(CDORevisionDeltaImpl.java:111)
at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.compare(BaseCDORevision.java:431)
at org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl.handleRollback(CDOTransactionImpl.java:1492)
at org.eclipse.emf.internal.cdo.transaction.CDOSingleTransactionStrategyImpl.rollback(CDOSingleTransactionStrategyImpl.java:101)
at org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl.rollback(CDOTransactionImpl.java:1163)
at org.eclipse.emf.examples.extlibrary.tests.LibraryTest$1.addBook(LibraryTest.java:191)
at org.eclipse.emf.examples.extlibrary.tests.LibraryTest$1.run(LibraryTest.java:173)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
|
|
|
Re: [CDO] Concurrent Access to Models [message #912202 is a reply to message #911874] |
Thu, 13 September 2012 06:10 |
|
Hi Erik,
The first two ConcurrentModificationExceptions are expected and ok. The one on the server is a real exception and the
one on the client just reflects what has happened on the server. The "Cannot modify a frozen revision" seems bogus
during rollback, though. Can you please submit a bugzilla?
Cheers
/Eike
----
http://www.esc-net.de
http://thegordian.blogspot.com
http://twitter.com/eikestepper
Am 12.09.2012 15:46, schrieb Erik Englund:
> Eike,
>
> Thanks for the quick response!
>
> Here is some more details.
>
> I am using Eclipse 4.2.0 and CDO 4.1.0.v20120612-1844
>
>
> CDOTransaction transaction = session.openTransaction();
> CDOResource resource = transaction.getResource("/library.extlibrary");
> Library library = (Library) resource.getContents().get(0);
> boolean added = false;
> try {
> while (!added) {
> try {
> library.getStock().add(book);
> transaction.commit();
> added = true;
> } catch (CommitException e) {
> transaction.rollback();
> }
> }
> }
> finally {
> transaction.close();
> }
>
>
> The server produced the following exceptions:
>
> [ERROR] Attempt by Transaction[2:2] to modify historical revision: CDORevisionDelta[Library@OID3:0v1 -->
> [CDOFeatureDelta[stock, LIST, list=[CDOFeatureDelta[stock, ADD, value=oid1, index=0]]]]]
> java.util.ConcurrentModificationException: Attempt by Transaction[2:2] to modify historical revision:
> CDORevisionDelta[Library@OID3:0v1 --> [CDOFeatureDelta[stock, LIST, list=[CDOFeatureDelta[stock, ADD, value=oid1,
> index=0]]]]]
> at org.eclipse.emf.cdo.internal.server.TransactionCommitContext.computeDirtyObject(TransactionCommitContext.java:1035)
> at org.eclipse.emf.cdo.internal.server.TransactionCommitContext.computeDirtyObjects(TransactionCommitContext.java:989)
> at org.eclipse.emf.cdo.internal.server.TransactionCommitContext.write(TransactionCommitContext.java:479)
> at org.eclipse.emf.cdo.spi.server.InternalCommitContext$1.runLoop(InternalCommitContext.java:43)
> at org.eclipse.emf.cdo.spi.server.InternalCommitContext$1.runLoop(InternalCommitContext.java:1)
> at org.eclipse.net4j.util.om.monitor.ProgressDistributor.run(ProgressDistributor.java:96)
> at
> org.eclipse.emf.cdo.server.internal.net4j.protocol.CommitTransactionIndication.indicatingCommit(CommitTransactionIndication.java:262)
> at
> org.eclipse.emf.cdo.server.internal.net4j.protocol.CommitTransactionIndication.indicating(CommitTransactionIndication.java:96)
> at
> org.eclipse.emf.cdo.server.internal.net4j.protocol.CDOServerIndicationWithMonitoring.indicating(CDOServerIndicationWithMonitoring.java:109)
> at org.eclipse.net4j.signal.IndicationWithMonitoring.indicating(IndicationWithMonitoring.java:86)
> at org.eclipse.net4j.signal.IndicationWithResponse.doExtendedInput(IndicationWithResponse.java:92)
> at org.eclipse.net4j.signal.Signal.doInput(Signal.java:328)
> at org.eclipse.net4j.signal.IndicationWithResponse.execute(IndicationWithResponse.java:65)
> at org.eclipse.net4j.signal.IndicationWithMonitoring.execute(IndicationWithMonitoring.java:65)
> at org.eclipse.net4j.signal.Signal.runSync(Signal.java:253)
> at org.eclipse.net4j.signal.Signal.run(Signal.java:149)
> at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
> at java.lang.Thread.run(Unknown Source)
>
>
> The client produced the following error:
>
> [ERROR] Rollback in MEMStore: java.util.ConcurrentModificationException: Attempt by Transaction[2:6] to modify
> historical revision: CDORevisionDelta[Library@OID3:0v1 --> [CDOFeatureDelta[stock, LIST, list=[CDOFeatureDelta[stock,
> ADD, value=oid1, index=0]]]]]
> at org.eclipse.emf.cdo.internal.server.TransactionCommitContext.computeDirtyObject(TransactionCommitContext.java:1035)
> at org.eclipse.emf.cdo.internal.server.TransactionCommitContext.computeDirtyObjects(TransactionCommitContext.java:989)
> at org.eclipse.emf.cdo.internal.server.TransactionCommitContext.write(TransactionCommitContext.java:479)
> at org.eclipse.emf.cdo.spi.server.InternalCommitContext$1.runLoop(InternalCommitContext.java:43)
> at org.eclipse.emf.cdo.spi.server.InternalCommitContext$1.runLoop(InternalCommitContext.java:1)
> at org.eclipse.net4j.util.om.monitor.ProgressDistributor.run(ProgressDistributor.java:96)
> at
> org.eclipse.emf.cdo.server.internal.net4j.protocol.CommitTransactionIndication.indicatingCommit(CommitTransactionIndication.java:262)
> at
> org.eclipse.emf.cdo.server.internal.net4j.protocol.CommitTransactionIndication.indicating(CommitTransactionIndication.java:96)
> at
> org.eclipse.emf.cdo.server.internal.net4j.protocol.CDOServerIndicationWithMonitoring.indicating(CDOServerIndicationWithMonitoring.java:109)
> at org.eclipse.net4j.signal.IndicationWithMonitoring.indicating(IndicationWithMonitoring.java:86)
> at org.eclipse.net4j.signal.IndicationWithResponse.doExtendedInput(IndicationWithResponse.java:92)
> at org.eclipse.net4j.signal.Signal.doInput(Signal.java:328)
> at org.eclipse.net4j.signal.IndicationWithResponse.execute(IndicationWithResponse.java:65)
> at org.eclipse.net4j.signal.IndicationWithMonitoring.execute(IndicationWithMonitoring.java:65)
> at org.eclipse.net4j.signal.Signal.runSync(Signal.java:253)
> at org.eclipse.net4j.signal.Signal.run(Signal.java:149)
> at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
> at java.lang.Thread.run(Unknown Source)
>
>
> The client then failed:
>
> !ENTRY org.eclipse.core.jobs 4 2 2012-09-12 09:33:21.280
> !MESSAGE An internal error occurred during: "Populator 1".
> !STACK 0
> java.lang.IllegalStateException: Cannot modify a frozen revision
> at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.checkFrozen(BaseCDORevision.java:828)
> at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.setValue(BaseCDORevision.java:783)
> at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.getList(BaseCDORevision.java:697)
> at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.getList(BaseCDORevision.java:676)
> at org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionDeltaImpl.compare(CDORevisionDeltaImpl.java:379)
> at org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionDeltaImpl.<init>(CDORevisionDeltaImpl.java:111)
> at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.compare(BaseCDORevision.java:431)
> at org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl.handleRollback(CDOTransactionImpl.java:1492)
> at
> org.eclipse.emf.internal.cdo.transaction.CDOSingleTransactionStrategyImpl.rollback(CDOSingleTransactionStrategyImpl.java:101)
> at org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl.rollback(CDOTransactionImpl.java:1163)
> at org.eclipse.emf.examples.extlibrary.tests.LibraryTest$1.addBook(LibraryTest.java:191)
> at org.eclipse.emf.examples.extlibrary.tests.LibraryTest$1.run(LibraryTest.java:173)
> at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
>
>
>
>
Cheers
/Eike
----
http://www.esc-net.de
http://thegordian.blogspot.com
http://twitter.com/eikestepper
|
|
| |
Goto Forum:
Current Time: Thu Apr 25 10:32:45 GMT 2024
Powered by FUDForum. Page generated in 0.02921 seconds
|