Author: aadamchik
Date: Sun Oct 21 10:50:15 2012
New Revision: 1400617
URL: http://svn.apache.org/viewvc?rev=1400617&view=rev
Log:
CAY-1749 NPE on simple nested context commit
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java?rev=1400617&r1=1400616&r2=1400617&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java
Sun Oct 21 10:50:15 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());