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