Author: aadamchik
Date: Thu May 25 19:31:23 2006
New Revision: 409541

URL: http://svn.apache.org/viewvc?rev=409541&view=rev
Log:
CAY-525 - fixing ObjectStore excessive synchronization - seeing some 
performance increase on commit and significant performance increase on peer 
events processing

Modified:
    
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContextMergeHandler.java
    
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectDiff.java
    
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java
    
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStoreGraphDiff.java

Modified: 
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContextMergeHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContextMergeHandler.java?rev=409541&r1=409540&r2=409541&view=diff
==============================================================================
--- 
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContextMergeHandler.java
 (original)
+++ 
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataContextMergeHandler.java
 Thu May 25 19:31:23 2006
@@ -171,7 +171,10 @@
     }
 
     public void nodeRemoved(Object nodeId) {
-        context.getObjectStore().processDeletedID(nodeId);
+        ObjectStore os = context.getObjectStore();
+        synchronized (os) {
+            os.processDeletedID(nodeId);
+        }
     }
 
     public void nodePropertyChanged(

Modified: 
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectDiff.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectDiff.java?rev=409541&r1=409540&r2=409541&view=diff
==============================================================================
--- 
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectDiff.java
 (original)
+++ 
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectDiff.java
 Thu May 25 19:31:23 2006
@@ -284,7 +284,7 @@
     }
 
     private void applySimplePropertyChanges(final GraphChangeHandler handler) {
-        final Persistent object = (Persistent) 
objectStore.objectMap.get(nodeId);
+        final Persistent object = (Persistent) 
objectStore.getNodeNoSync(nodeId);
         getClassDescriptor().visitProperties(new PropertyVisitor() {
 
             public boolean visitProperty(Property property) {

Modified: 
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java?rev=409541&r1=409540&r2=409541&view=diff
==============================================================================
--- 
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java
 (original)
+++ 
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStore.java
 Thu May 25 19:31:23 2006
@@ -840,7 +840,6 @@
                 ? (ObjectContext) event.getPostedBy()
                 : null;
         context.fireDataChannelChanged(originatingContext, diff);
-
     }
 
     /**
@@ -980,11 +979,15 @@
     }
 
     /**
+     * Requires external synchronization.
+     * 
      * @since 1.2
      */
     void processDeletedID(Object nodeId) {
 
-        DataObject object = (DataObject) getNode(nodeId);
+        // access object map directly - the method should be called in a 
synchronized
+        // context...
+        DataObject object = (DataObject) objectMap.get(nodeId);
 
         if (object != null) {
 
@@ -1072,13 +1075,18 @@
     }
 
     /**
+     * Requires external synchronization.
+     * 
      * @since 1.1
      */
     void processIndirectlyModifiedIDs(Collection indirectlyModifiedIDs) {
         Iterator indirectlyModifiedIt = indirectlyModifiedIDs.iterator();
         while (indirectlyModifiedIt.hasNext()) {
             Object oid = indirectlyModifiedIt.next();
-            DataObject object = (DataObject) getNode(oid);
+
+            // access object map directly - the method should be called in a 
synchronized
+            // context...
+            DataObject object = (DataObject) objectMap.get(oid);
 
             if (object == null
                     || object.getPersistenceState() != 
PersistenceState.COMMITTED) {
@@ -1112,11 +1120,15 @@
     }
 
     /**
+     * Requires external synchronization.
+     * 
      * @since 1.1
      */
     void processUpdatedSnapshot(Object nodeId, DataRow diff) {
 
-        DataObject object = (DataObject) getNode(nodeId);
+        // access object map directly - the method should be called ina 
synchronized
+        // context...
+        DataObject object = (DataObject) objectMap.get(nodeId);
 
         // no object, or HOLLOW object require no processing
         if (object != null && object.getPersistenceState() != 
PersistenceState.HOLLOW) {
@@ -1180,6 +1192,11 @@
      * @since 1.2
      */
     public synchronized Object getNode(Object nodeId) {
+        return objectMap.get(nodeId);
+    }
+
+    // non-synchronized version of getNode for private use
+    final Object getNodeNoSync(Object nodeId) {
         return objectMap.get(nodeId);
     }
 

Modified: 
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStoreGraphDiff.java
URL: 
http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStoreGraphDiff.java?rev=409541&r1=409540&r2=409541&view=diff
==============================================================================
--- 
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStoreGraphDiff.java
 (original)
+++ 
incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectStoreGraphDiff.java
 Thu May 25 19:31:23 2006
@@ -92,6 +92,9 @@
         return objectStore.getChangesByObjectId();
     }
 
+    /**
+     * Requires external synchronization on ObjectStore.
+     */
     boolean validateAndCheckNoop() {
         if (getChangesByObjectId().isEmpty()) {
             return true;
@@ -109,7 +112,8 @@
 
                 noop = false;
 
-                DataObject object = (DataObject) 
objectStore.getNode(entry.getKey());
+                // accessing objectMap directly to avoid unneeded 
synchronization.
+                DataObject object = (DataObject) 
objectStore.getNodeNoSync(entry.getKey());
                 switch (object.getPersistenceState()) {
                     case PersistenceState.NEW:
                         object.validateForInsert(result);


Reply via email to