Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF » [CDO] Concurrent Access to Models
[CDO] Concurrent Access to Models [message #911549] Tue, 11 September 2012 20:50 Go to next message
Erik Englund is currently offline Erik EnglundFriend
Messages: 49
Registered: July 2009
Member
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());


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

java.lang.NullPointerException
	at org.eclipse.emf.internal.cdo.view.AbstractCDOView.invalidate(AbstractCDOView.java:1218)


I even tried using a write lock and got other errors:

CDOLock lock = library.cdoWriteLock();
lock.lock();
library.cdoReload();
library.getStock().add(book);
try {
    transaction.commit();
} catch (CommitException e) {
    e.printStackTrace();
} finally {
    lock.unlock();
}


!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 am very new to CDO so it is very likely I did something very simple wrong. Any help would be appreciated.
Re: [CDO] Concurrent Access to Models [message #911798 is a reply to message #911549] Wed, 12 September 2012 10:39 Go to previous messageGo to next message
Eike Stepper is currently offline Eike StepperFriend
Messages: 6682
Registered: July 2009
Senior Member
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


Re: [CDO] Concurrent Access to Models [message #911874 is a reply to message #911798] Wed, 12 September 2012 13:46 Go to previous messageGo to next message
Erik Englund is currently offline Erik EnglundFriend
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 Go to previous messageGo to next message
Eike Stepper is currently offline Eike StepperFriend
Messages: 6682
Registered: July 2009
Senior Member
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)
>
>
>
>


Re: [CDO] Concurrent Access to Models [message #912435 is a reply to message #912202] Thu, 13 September 2012 15:28 Go to previous message
Erik Englund is currently offline Erik EnglundFriend
Messages: 49
Registered: July 2009
Member
Eike,

I've submitted a bug request and included my test case plugin with the ticket.

https://bugs.eclipse.org/bugs/show_bug.cgi?id=389525

Thanks,
Erik
Previous Topic:[CDO] Example cdo-server.xml for a DB store
Next Topic:Loading XML file into EMF Model
Goto Forum:
  


Current Time: Thu Apr 25 10:32:45 GMT 2024

Powered by FUDForum. Page generated in 0.02921 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top