[
https://issues.apache.org/jira/browse/CAY-1868?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Andrus Adamchik closed CAY-1868.
--------------------------------
Resolution: Fixed
I just committed the latest patch to trunk and 3.1 branch. So now we've removed
the contention point, and will deal with dirty lazy initialization code in
ObjRelationship some other day. Thanks for the patch!
Postmortem notes:
1. You still left the "synchronized" keyword in the "refreshFromDeferredPath"
method. I removed it myself (see r1553803).
2. I suggest before submitting patches that you do "git svn rebase" your work
branch against the current state of the remote SVN branch. This way the patch
can be applied cleanly by a reviewer (at least for some time until SVN state
diverges again). From the patch structure it appears you haven't rebased for
some time.
> Select contention with multiple contexts
> -----------------------------------------
>
> Key: CAY-1868
> URL: https://issues.apache.org/jira/browse/CAY-1868
> Project: Cayenne
> Issue Type: Bug
> Affects Versions: 3.1B2, 3.2M1
> Reporter: Andrus Adamchik
> Assignee: Andrus Adamchik
> Fix For: 3.1B3, 3.2.M2
>
> Attachments: cay1868.patch, cay1868v3_1.patch
>
>
> I am mostly using local cache and a single app-scoped ObjectContext for
> selects. So I was oblivious to this issue. Today I tried shared cache and a
> pool of app-scoped ObjectContexts randomly assigned to requests. I quickly
> hit a contention point:
>
> java.lang.Thread.State: BLOCKED (on object monitor)
> at
> org.apache.cayenne.map.ObjRelationship.refreshFromDeferredPath(ObjRelationship.java:572)
> - waiting to lock <0x424bf840> (a
> org.apache.cayenne.map.ObjRelationship)
> at
> org.apache.cayenne.map.ObjRelationship.isToMany(ObjRelationship.java:431)
> at
> org.apache.cayenne.map.ObjRelationship.isOptional(ObjRelationship.java:310)
> at
> org.apache.cayenne.map.ObjRelationship.isSourceDefiningTargetPrecenseAndType(ObjRelationship.java:346)
> at
> org.apache.cayenne.access.DataDomainQueryAction.interceptRelationshipQuery(DataDomainQueryAction.java:239)
> ObjRelationship recalculating its 'toMany' value on every call is evil by
> itself. Doing parts of it in a synchronized block is completely unacceptable.
>
--
This message was sent by Atlassian JIRA
(v6.1.5#6160)