You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2012/10/21 12:56:41 UTC
svn commit: r1400619 -
/cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java
Author: aadamchik
Date: Sun Oct 21 10:56:41 2012
New Revision: 1400619
URL: http://svn.apache.org/viewvc?rev=1400619&view=rev
Log:
CAY-1749 NPE on simple nested context commit
(cherry picked from commit f513bcaae3f76f0cb4b7abd692b0748e2268dbb0)
Modified:
cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java
Modified: cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java?rev=1400619&r1=1400618&r2=1400619&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java (original)
+++ cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java Sun Oct 21 10:56:41 2012
@@ -110,9 +110,22 @@ class DataContextMergeHandler implements
}
public void graphFlushed(GraphEvent event) {
+
// peer is committed
if (shouldProcessEvent(event)) {
- event.getDiff().apply(this);
+
+ // per CAY-1737 event dispatches from parent context to children are
+ // non-blocking, this causes issues like CAY-1749. so we must
+ // synchronize ObjectStore updates here.
+
+ // TODO: we can get here if a peer context is committed (ok) or
+ // if our context was committed (not ok, since parent changes are
+ // already applied in the commit thread) .. figure out an alt
+ // filtering mechanism to avoid the duplicate object processing
+
+ synchronized (context.getObjectStore()) {
+ event.getDiff().apply(this);
+ }
// repost as change event for our own children
context.fireDataChannelChanged(event.getPostedBy(), event.getDiff());