You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/11/24 15:11:13 UTC
svn commit: r1038609 - in /jackrabbit/branches/2.0: ./
jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java
jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
Author: jukka
Date: Wed Nov 24 14:11:12 2010
New Revision: 1038609
URL: http://svn.apache.org/viewvc?rev=1038609&view=rev
Log:
2.0: Merged revision 1038599 (JCR-2813)
Modified:
jackrabbit/branches/2.0/ (props changed)
jackrabbit/branches/2.0/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java
jackrabbit/branches/2.0/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
Propchange: jackrabbit/branches/2.0/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 24 14:11:12 2010
@@ -1,6 +1,6 @@
/jackrabbit/branches/1.5:794012,794100,794102
-/jackrabbit/branches/2.1:955309,955314,982266,982277,982505,998310,1025933,1025957,1025962,1025964,1025981,1025985,1025990,1025995,1025999,1026002,1038594
+/jackrabbit/branches/2.1:955309,955314,982266,982277,982505,998310,1025933,1025957,1025962,1025964,1025981,1025985,1025990,1025995,1025999,1026002,1038594,1038599
/jackrabbit/sandbox/JCR-1456:774917-886178
/jackrabbit/sandbox/JCR-2170:812417-816332
/jackrabbit/sandbox/tripod-JCR-2209:795441-795863
-/jackrabbit/trunk:891595,891629,892253,892263,894150-894151,896408,896513,896532,896857,896870,896876,896908,896940,896942-896943,896969,896977,897071,897836,897842,897858,897935,897983,897992-897993,897996,898002,898042,898267,898325,898540,898677,898699,898701,898715,898872,899102,899181,899391,899393-899394,899583,899594,899643,900305,900310,900314,900453,900702,900736,900762-900763,900767,900782,901095,901122,901139,901144,901170,901176,901191,901193,901196,901216,901228,901285,902058,902062,926324,928888,936668,955222,955229,955307,955852,965539,995411-995412,996810,999298-999299,999965,1000947,1001707,1002065-1002066,1002084,1002101-1002102,1002168,1002170,1002589,1002608,1002657,1002729,1003423,1003470,1003542,1003773,1004182,1004184,1004223-1004224,1004652,1005057,1005112,1036336-1036337
+/jackrabbit/trunk:891595,891629,892253,892263,894150-894151,896408,896513,896532,896857,896870,896876,896908,896940,896942-896943,896969,896977,897071,897836,897842,897858,897935,897983,897992-897993,897996,898002,898042,898267,898325,898540,898677,898699,898701,898715,898872,899102,899181,899391,899393-899394,899583,899594,899643,900305,900310,900314,900453,900702,900736,900762-900763,900767,900782,901095,901122,901139,901144,901170,901176,901191,901193,901196,901216,901228,901285,902058,902062,926324,928888,936668,955222,955229,955307,955852,965539,995411-995412,996810,999298-999299,999965,1000947,1001707,1002065-1002066,1002084,1002101-1002102,1002168,1002170,1002589,1002608,1002657,1002729,1003423,1003470,1003542,1003773,1004182,1004184,1004223-1004224,1004652,1005057,1005112,1036117,1036336-1036337,1038201
Modified: jackrabbit/branches/2.0/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.0/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java?rev=1038609&r1=1038608&r2=1038609&view=diff
==============================================================================
--- jackrabbit/branches/2.0/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java (original)
+++ jackrabbit/branches/2.0/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/LocalItemStateManager.java Wed Nov 24 14:11:12 2010
@@ -163,17 +163,19 @@ public class LocalItemStateManager
return state;
}
- // check cache
- state = cache.retrieve(id);
- if (state == null) {
- // regular behaviour
- if (id.denotesNode()) {
- state = getNodeState((NodeId) id);
- } else {
- state = getPropertyState((PropertyId) id);
+ // check cache. synchronized to ensure an entry is not created twice.
+ synchronized (this) {
+ state = cache.retrieve(id);
+ if (state == null) {
+ // regular behaviour
+ if (id.denotesNode()) {
+ state = getNodeState((NodeId) id);
+ } else {
+ state = getPropertyState((PropertyId) id);
+ }
}
+ return state;
}
- return state;
}
/**
Modified: jackrabbit/branches/2.0/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.0/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java?rev=1038609&r1=1038608&r2=1038609&view=diff
==============================================================================
--- jackrabbit/branches/2.0/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (original)
+++ jackrabbit/branches/2.0/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java Wed Nov 24 14:11:12 2010
@@ -18,6 +18,8 @@ package org.apache.jackrabbit.core.state
import java.io.PrintStream;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Set;
@@ -1692,20 +1694,64 @@ public class SharedItemStateManager
}
/**
+ * Identifiers of the item states that are currently being loaded from
+ * the underlying persistence manager. Used exclusively by the
+ * {@link #getNonVirtualItemState(ItemId)} method to prevent two threads
+ * from concurrently loading the same items.
+ */
+ private final Set<ItemId> currentlyLoading = new HashSet<ItemId>();
+
+ /**
* Returns the item state for the given id without considering virtual
* item state providers.
*/
private ItemState getNonVirtualItemState(ItemId id)
throws NoSuchItemStateException, ItemStateException {
+ // First check if the item state is already in the cache
ItemState state = cache.retrieve(id);
- if (state == null) {
- // not found in cache, load from persistent storage
+ if (state != null) {
+ return state;
+ }
+
+ // Wait if another thread is already loading this item state
+ synchronized (this) {
+ while (currentlyLoading.contains(id)) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ throw new ItemStateException(
+ "Interrupted while waiting for " + id, e);
+ }
+ }
+
+ state = cache.retrieve(id);
+ if (state != null) {
+ return state;
+ }
+
+ // No other thread has loaded the item state, so we'll do it
+ currentlyLoading.add(id);
+ }
+
+ try {
+ // Load the item state from persistent storage
+ // NOTE: This needs to happen outside a synchronized block!
state = loadItemState(id);
state.setStatus(ItemState.STATUS_EXISTING);
state.setContainer(this);
+
+ // put it in cache
cache.cache(state);
+
+ return state;
+ } finally {
+ // Notify other concurrent threads that we're done with this item
+ // NOTE: This needs to happen within the finally block!
+ synchronized (this) {
+ currentlyLoading.remove(id);
+ notifyAll();
+ }
}
- return state;
}
/**