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());