Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF » [CDO] Thread blocked on CDOIDUtil.createLong
[CDO] Thread blocked on CDOIDUtil.createLong [message #1850736] Tue, 15 March 2022 17:41 Go to next message
Gabe Colburn is currently offline Gabe ColburnFriend
Messages: 28
Registered: December 2012
Junior Member
We have a multi-threaded application using CDO. We sometimes need to store CDOID's in an external database for later retrieval.

To retrieve the objects, once we have the ID from the external system:

long cdoIdToRetrieve = getId() // made up function returning the ID of the CDO Object to look up.


We use the cdo view and CDOIDUtil function to retrieve the CDOObject:
CDOView view = getView() // returns the CDO View
CDOObject object = view.getObject(CDOIDUtil.createLong(cdoIdToRetrieve));


However the synchronized long interning causes threads to block:
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl$LongInterner.intern(CDOIDObjectLongImpl.java:155)
        - locked <0x0000000501c92598> (a org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl$LongInterner)
        at org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl.create(CDOIDObjectLongImpl.java:133)
        at org.eclipse.emf.cdo.common.id.CDOIDUtil.createLong(CDOIDUtil.java:243)


Are there any strategies to prevent the blocking? I understand the reasoning behind the intern call being synchronized, but not sure the best way to reduce thread blocking. Our need is just to retrieve the CDOObject from its ID.

Source code is here for CDOIDObjectLongImpl:
https://git.eclipse.org/c/cdo/cdo.git/tree/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectLongImpl.java

Thanks!

[Updated on: Tue, 15 March 2022 19:05]

Report message to a moderator

Re: [CDO] Thread blocked on CDOIDUtil.createLong [message #1850753 is a reply to message #1850736] Wed, 16 March 2022 06:25 Go to previous messageGo to next message
Eike Stepper is currently offline Eike StepperFriend
Messages: 6682
Registered: July 2009
Senior Member
Hi Gabe,

I don't think that you can avoid thread blocking in a mult-threaded application.

I'm not sure you've expressed a concrete problem. Are you saying you're experiencing deadlocks or unreasonable slowness?



Re: [CDO] Thread blocked on CDOIDUtil.createLong [message #1850782 is a reply to message #1850753] Wed, 16 March 2022 20:40 Go to previous messageGo to next message
Gabe Colburn is currently offline Gabe ColburnFriend
Messages: 28
Registered: December 2012
Junior Member
Thanks Eike. That's what I assumed.

We observed the blocking intermittently as shown in the thread dump.

Gabe

[Updated on: Wed, 16 March 2022 20:40]

Report message to a moderator

Re: [CDO] Thread blocked on CDOIDUtil.createLong [message #1851825 is a reply to message #1850782] Mon, 18 April 2022 22:57 Go to previous message
Gabe Colburn is currently offline Gabe ColburnFriend
Messages: 28
Registered: December 2012
Junior Member
Hi Eike,

We are still observing this blocking issue. What we observe is many threads waiting to acquire a lock on the CDOIDObjectLongImpl$LongInterner, including net4j threads.

"net4j-thread-71971" #85480 daemon prio=5 os_prio=0 cpu=48.95ms elapsed=32.11s tid=0x00007f22d00c9000 nid=0x5087 waiting for monitor entry  [0x00007f2281592000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl$LongInterner.intern(CDOIDObjectLongImpl.java:155)
        - waiting to lock <0x000000028293b338> (a org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl$LongInterner)
        at org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl.create(CDOIDObjectLongImpl.java:133)
        at org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl.create(CDOIDObjectLongImpl.java:139)
        at org.eclipse.emf.cdo.common.id.CDOIDUtil.readCDOIDObject(CDOIDUtil.java:557)
        at org.eclipse.emf.cdo.common.id.CDOIDUtil.read(CDOIDUtil.java:489)
        at org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl.readCDOID(CDODataInputImpl.java:436)
        at org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl$11.readValue(CDOTypeImpl.java:275)
        at org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl.readCDOList(CDODataInputImpl.java:539)
        at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.readValue(BaseCDORevision.java:270)
        at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.readValues(BaseCDORevision.java:247)
        at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.read(BaseCDORevision.java:192)
        at org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl.readCDORevision(CDODataInputImpl.java:483)
        at org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl.readCDORevision(CDODataInputImpl.java:473)
        at org.eclipse.emf.cdo.spi.common.revision.RevisionInfo.readRevision(RevisionInfo.java:223)
        at org.eclipse.emf.cdo.spi.common.revision.RevisionInfo.readResult(RevisionInfo.java:164)
        at org.eclipse.emf.cdo.internal.net4j.protocol.LoadRevisionsRequest.confirming(LoadRevisionsRequest.java:140)
        at org.eclipse.emf.cdo.internal.net4j.protocol.LoadRevisionsRequest.confirming(LoadRevisionsRequest.java:1)
        at org.eclipse.emf.cdo.internal.net4j.protocol.CDOClientRequest.confirming(CDOClientRequest.java:104)
        at org.eclipse.net4j.signal.RequestWithConfirmation.doExtendedInput(RequestWithConfirmation.java:126)
        at org.eclipse.net4j.signal.Signal.doInput(Signal.java:391)
        at org.eclipse.net4j.signal.RequestWithConfirmation.doExecute(RequestWithConfirmation.java:106)
        at org.eclipse.net4j.signal.SignalActor.execute(SignalActor.java:53)
        at org.eclipse.net4j.signal.Signal.runSync(Signal.java:297)
        at org.eclipse.net4j.signal.SignalProtocol.startSignal(SignalProtocol.java:527)
        at org.eclipse.net4j.signal.RequestWithConfirmation.doSend(RequestWithConfirmation.java:90)
        at org.eclipse.net4j.signal.RequestWithConfirmation.send(RequestWithConfirmation.java:76)
        at org.eclipse.emf.cdo.internal.net4j.protocol.CDOClientProtocol.send(CDOClientProtocol.java:696)
        at org.eclipse.emf.cdo.internal.net4j.protocol.CDOClientProtocol.send(CDOClientProtocol.java:729)
        at org.eclipse.emf.cdo.internal.net4j.protocol.CDOClientProtocol.loadRevisions(CDOClientProtocol.java:235)
        at org.eclipse.emf.cdo.internal.common.revision.CDORevisionManagerImpl.loadRevisions(CDORevisionManagerImpl.java:469)
        at org.eclipse.emf.cdo.internal.common.revision.CDORevisionManagerImpl.getRevisions(CDORevisionManagerImpl.java:351)
        at org.eclipse.emf.cdo.internal.common.revision.CDORevisionManagerImpl.getRevision(CDORevisionManagerImpl.java:332)
        at org.eclipse.emf.cdo.internal.common.revision.CDORevisionManagerImpl.getRevision(CDORevisionManagerImpl.java:324)
        at org.eclipse.emf.internal.cdo.view.CDOViewImpl.getRevision(CDOViewImpl.java:954)
        - locked <0x00000002ac199670> (a org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl)
        at org.eclipse.emf.internal.cdo.view.CDOStateMachine.internalLoad(CDOStateMachine.java:780)
        at org.eclipse.emf.internal.cdo.view.CDOStateMachine.access$4(CDOStateMachine.java:775)
        at org.eclipse.emf.internal.cdo.view.CDOStateMachine$LoadTransition.execute(CDOStateMachine.java:1506)
        at org.eclipse.emf.internal.cdo.view.CDOStateMachine$LoadTransition.execute(CDOStateMachine.java:1)
        at org.eclipse.net4j.util.fsm.FiniteStateMachine.process(FiniteStateMachine.java:169)
        at org.eclipse.emf.internal.cdo.view.CDOStateMachine.read(CDOStateMachine.java:358)
        - locked <0x00000002ac199670> (a org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl)
        at org.eclipse.emf.internal.cdo.view.CDOStoreImpl.readRevision(CDOStoreImpl.java:981)
        at org.eclipse.emf.internal.cdo.view.CDOStoreImpl.isSet(CDOStoreImpl.java:234)
        - locked <0x00000002ac199670> (a org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl)
        at org.eclipse.emf.internal.cdo.CDOObjectImpl.eDynamicIsSet(CDOObjectImpl.java:799)
        at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eIsSet(BasicEObjectImpl.java:1296)
        at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eIsSet(BasicEObjectImpl.java:1280)
        at org.eclipse.emf.ecore.util.EContentsEList$FeatureIteratorImpl.hasNext(EContentsEList.java:437)
        at org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl.removeCrossReferences(CDOTransactionImpl.java:3903)
        at org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl.invalidate(CDOTransactionImpl.java:3819)
        at org.eclipse.emf.internal.cdo.view.CDOViewImpl.doInvalidateSynced(CDOViewImpl.java:1263)
        at org.eclipse.emf.internal.cdo.view.CDOViewImpl.doInvalidate(CDOViewImpl.java:1216)
        - locked <0x00000002ac199670> (a org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl)
        at org.eclipse.emf.internal.cdo.view.CDOViewImpl$ViewInvalidation.doRun(CDOViewImpl.java:2861)
        at org.eclipse.net4j.util.concurrent.RunnableWithName.run(RunnableWithName.java:29)
        at org.eclipse.net4j.util.concurrent.SerializingExecutor.run(SerializingExecutor.java:82)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.6/Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.6/Unknown Source)


When looking for the thread that is locking the interner, it can be a net4j thread as well:

"net4j-thread-71928" #85437 daemon prio=5 os_prio=0 cpu=46.76ms elapsed=32.22s tid=0x00007f231c141000 nid=0x5083 waiting for monitor entry  [0x00007f22830ad000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl$LongInterner.intern(CDOIDObjectLongImpl.java:155)
        - locked <0x000000028293b338> (a org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl$LongInterner)
        at org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl.create(CDOIDObjectLongImpl.java:133)
        at org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl.create(CDOIDObjectLongImpl.java:139)
        at org.eclipse.emf.cdo.common.id.CDOIDUtil.readCDOIDObject(CDOIDUtil.java:557)
        at org.eclipse.emf.cdo.common.id.CDOIDUtil.read(CDOIDUtil.java:489)
        at org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl.readCDOID(CDODataInputImpl.java:436)
        at org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl$11.readValue(CDOTypeImpl.java:275)
        at org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl.readCDOList(CDODataInputImpl.java:539)
        at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.readValue(BaseCDORevision.java:270)
        at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.readValues(BaseCDORevision.java:247)
        at org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision.read(BaseCDORevision.java:192)
        at org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl.readCDORevision(CDODataInputImpl.java:483)
        at org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl.readCDORevision(CDODataInputImpl.java:473)
        at org.eclipse.emf.cdo.spi.common.revision.RevisionInfo.readRevision(RevisionInfo.java:223)
        at org.eclipse.emf.cdo.spi.common.revision.RevisionInfo.readResult(RevisionInfo.java:164)
        at org.eclipse.emf.cdo.internal.net4j.protocol.LoadRevisionsRequest.confirming(LoadRevisionsRequest.java:140)
        at org.eclipse.emf.cdo.internal.net4j.protocol.LoadRevisionsRequest.confirming(LoadRevisionsRequest.java:1)
        at org.eclipse.emf.cdo.internal.net4j.protocol.CDOClientRequest.confirming(CDOClientRequest.java:104)
        at org.eclipse.net4j.signal.RequestWithConfirmation.doExtendedInput(RequestWithConfirmation.java:126)
        at org.eclipse.net4j.signal.Signal.doInput(Signal.java:391)
        at org.eclipse.net4j.signal.RequestWithConfirmation.doExecute(RequestWithConfirmation.java:106)
        at org.eclipse.net4j.signal.SignalActor.execute(SignalActor.java:53)
        at org.eclipse.net4j.signal.Signal.runSync(Signal.java:297)
        at org.eclipse.net4j.signal.SignalProtocol.startSignal(SignalProtocol.java:527)
        at org.eclipse.net4j.signal.RequestWithConfirmation.doSend(RequestWithConfirmation.java:90)
        at org.eclipse.net4j.signal.RequestWithConfirmation.send(RequestWithConfirmation.java:76)
        at org.eclipse.emf.cdo.internal.net4j.protocol.CDOClientProtocol.send(CDOClientProtocol.java:696)
        at org.eclipse.emf.cdo.internal.net4j.protocol.CDOClientProtocol.send(CDOClientProtocol.java:729)
        at org.eclipse.emf.cdo.internal.net4j.protocol.CDOClientProtocol.loadRevisions(CDOClientProtocol.java:235)
        at org.eclipse.emf.cdo.internal.common.revision.CDORevisionManagerImpl.loadRevisions(CDORevisionManagerImpl.java:469)
        at org.eclipse.emf.cdo.internal.common.revision.CDORevisionManagerImpl.getRevisions(CDORevisionManagerImpl.java:351)
        at org.eclipse.emf.cdo.internal.common.revision.CDORevisionManagerImpl.getRevision(CDORevisionManagerImpl.java:332)
        at org.eclipse.emf.cdo.internal.common.revision.CDORevisionManagerImpl.getRevision(CDORevisionManagerImpl.java:324)
        at org.eclipse.emf.internal.cdo.view.CDOViewImpl.getRevision(CDOViewImpl.java:954)
        - locked <0x00000002ddf39490> (a org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl)
        at org.eclipse.emf.internal.cdo.view.CDOStateMachine.internalLoad(CDOStateMachine.java:780)
        at org.eclipse.emf.internal.cdo.view.CDOStateMachine.access$4(CDOStateMachine.java:775)
        at org.eclipse.emf.internal.cdo.view.CDOStateMachine$LoadTransition.execute(CDOStateMachine.java:1506)
        at org.eclipse.emf.internal.cdo.view.CDOStateMachine$LoadTransition.execute(CDOStateMachine.java:1)
        at org.eclipse.net4j.util.fsm.FiniteStateMachine.process(FiniteStateMachine.java:169)
        at org.eclipse.emf.internal.cdo.view.CDOStateMachine.read(CDOStateMachine.java:358)
        - locked <0x00000002ddf39490> (a org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl)
        at org.eclipse.emf.internal.cdo.view.CDOStoreImpl.readRevision(CDOStoreImpl.java:981)
        at org.eclipse.emf.internal.cdo.view.CDOStoreImpl.isSet(CDOStoreImpl.java:234)
        - locked <0x00000002ddf39490> (a org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl)
        at org.eclipse.emf.internal.cdo.CDOObjectImpl.eDynamicIsSet(CDOObjectImpl.java:799)
        at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eIsSet(BasicEObjectImpl.java:1296)
        at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eIsSet(BasicEObjectImpl.java:1280)
        at org.eclipse.emf.ecore.util.EContentsEList$FeatureIteratorImpl.hasNext(EContentsEList.java:437)
        at org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl.removeCrossReferences(CDOTransactionImpl.java:3903)
        at org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl.invalidate(CDOTransactionImpl.java:3819)
        at org.eclipse.emf.internal.cdo.view.CDOViewImpl.doInvalidateSynced(CDOViewImpl.java:1263)
        at org.eclipse.emf.internal.cdo.view.CDOViewImpl.doInvalidate(CDOViewImpl.java:1216)
        - locked <0x00000002ddf39490> (a org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl)
        at org.eclipse.emf.internal.cdo.view.CDOViewImpl$ViewInvalidation.doRun(CDOViewImpl.java:2861)
        at org.eclipse.net4j.util.concurrent.RunnableWithName.run(RunnableWithName.java:29)
        at org.eclipse.net4j.util.concurrent.SerializingExecutor.run(SerializingExecutor.java:82)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.6/Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.6/Unknown Source)


What's not clear, is why the thread holding the lock on the interner is blocked. Line 155 is invoking getHashCode.

Any ideas what the cause could be? We ended up having a huge pile up of blocked threads, and ultimately the user interface wasn't able to retrieve data.

Thanks!
Gabe
Previous Topic:Eclipse Indigo 3.7.2 Proxy Problem
Next Topic:[CDO] list=>database mapping: internal index is wrong in rare cases
Goto Forum:
  


Current Time: Fri Mar 29 05:22:28 GMT 2024

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

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

Back to the top