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 2007/05/05 12:16:34 UTC

svn commit: r535494 - in /cayenne/main/branches/STABLE-1.2/cayenne: cayenne-java/src/cayenne/java/org/objectstyle/cayenne/ cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ cayenne-other/release-notes/

Author: aadamchik
Date: Sat May  5 03:16:32 2007
New Revision: 535494

URL: http://svn.apache.org/viewvc?view=rev&rev=535494
Log:
CAY-786 Race condition in DataContext.localObject() - 1.2 branch

Modified:
    cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/CayenneContext.java
    cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContext.java
    cayenne/main/branches/STABLE-1.2/cayenne/cayenne-other/release-notes/RELEASE-NOTES-1.2.3.txt

Modified: cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/CayenneContext.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/CayenneContext.java?view=diff&rev=535494&r1=535493&r2=535494
==============================================================================
--- cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/CayenneContext.java (original)
+++ cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/CayenneContext.java Sat May  5 03:16:32 2007
@@ -383,12 +383,15 @@
             // breaking encapsulation of the DataChannel to detect where in the hierarchy
             // this context is.
 
-            Persistent localObject = (Persistent) descriptor.createObject();
+            Persistent localObject;
+            synchronized (getGraphManager()) {
+                localObject = (Persistent) descriptor.createObject();
 
-            localObject.setObjectContext(this);
-            localObject.setObjectId(id);
+                localObject.setObjectContext(this);
+                localObject.setObjectId(id);
 
-            getGraphManager().registerNode(id, localObject);
+                getGraphManager().registerNode(id, localObject);
+            }
 
             if (prototype != null) {
                 localObject.setPersistenceState(PersistenceState.COMMITTED);
@@ -485,17 +488,20 @@
         ClassDescriptor descriptor = getEntityResolver().getClassDescriptor(
                 id.getEntityName());
 
-        Persistent object = (Persistent) descriptor.createObject();
-
-        object.setPersistenceState(PersistenceState.HOLLOW);
-        object.setObjectContext(this);
-        object.setObjectId(id);
-
-        // note that this must be called AFTER setting persistence state, otherwise we'd
-        // get ValueHolders incorrectly marked as resolved
-        descriptor.injectValueHolders(object);
-
-        graphManager.registerNode(id, object);
+        Persistent object;
+        synchronized(graphManager) {
+            object = (Persistent) descriptor.createObject();
+
+            object.setPersistenceState(PersistenceState.HOLLOW);
+            object.setObjectContext(this);
+            object.setObjectId(id);
+
+            // note that this must be called AFTER setting persistence state, otherwise we'd
+            // get ValueHolders incorrectly marked as resolved
+            descriptor.injectValueHolders(object);
+        
+            graphManager.registerNode(id, object);
+        }
 
         return object;
     }

Modified: cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContext.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContext.java?view=diff&rev=535494&r1=535493&r2=535494
==============================================================================
--- cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContext.java (original)
+++ cayenne/main/branches/STABLE-1.2/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContext.java Sat May  5 03:16:32 2007
@@ -1940,12 +1940,16 @@
         // create and merge into a new object
         else {
 
-            Persistent localObject = (Persistent) descriptor.createObject();
+            Persistent localObject;
 
-            localObject.setObjectContext(this);
-            localObject.setObjectId(id);
+            synchronized (getGraphManager()) {
+                localObject = (Persistent) descriptor.createObject();
 
-            getGraphManager().registerNode(id, localObject);
+                localObject.setObjectContext(this);
+                localObject.setObjectId(id);
+
+                getGraphManager().registerNode(id, localObject);
+            }
 
             if (prototype != null
                     && prototype.getPersistenceState() != PersistenceState.HOLLOW) {

Modified: cayenne/main/branches/STABLE-1.2/cayenne/cayenne-other/release-notes/RELEASE-NOTES-1.2.3.txt
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-1.2/cayenne/cayenne-other/release-notes/RELEASE-NOTES-1.2.3.txt?view=diff&rev=535494&r1=535493&r2=535494
==============================================================================
--- cayenne/main/branches/STABLE-1.2/cayenne/cayenne-other/release-notes/RELEASE-NOTES-1.2.3.txt (original)
+++ cayenne/main/branches/STABLE-1.2/cayenne/cayenne-other/release-notes/RELEASE-NOTES-1.2.3.txt Sat May  5 03:16:32 2007
@@ -25,3 +25,4 @@
 CAY-781 Bug in CayenneDataObject.readNestedProperty
 CAY-783 jgroups config file not removed from cayenne.xml
 CAY-784 Deleting an object with a read-only flattened relationship fails
+CAY-786 Race condition in DataContext.localObject()