You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2005/08/30 16:05:02 UTC

svn commit: r264785 - in /incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core: ItemImpl.java NodeImpl.java PropertyImpl.java state/ItemState.java

Author: stefan
Date: Tue Aug 30 07:04:56 2005
New Revision: 264785

URL: http://svn.apache.org/viewcvs?rev=264785&view=rev
Log:
fixing another concurrency issue that could lead to inconsistent repository content

Modified:
    incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/ItemImpl.java
    incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/NodeImpl.java
    incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/PropertyImpl.java
    incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/state/ItemState.java

Modified: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/ItemImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/ItemImpl.java?rev=264785&r1=264784&r2=264785&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/ItemImpl.java (original)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/ItemImpl.java Tue Aug 30 07:04:56 2005
@@ -170,7 +170,7 @@
 
     protected abstract ItemState getOrCreateTransientItemState() throws RepositoryException;
 
-    protected abstract void makePersistent();
+    protected abstract void makePersistent() throws InvalidItemStateException;
 
     /**
      * Marks this instance as 'removed' and notifies its listeners.
@@ -324,7 +324,7 @@
         ArrayList dirty = new ArrayList();
         ItemState transientState;
 
-        // check status of this item's state
+        // fail-fast test: check status of this item's state
         if (isTransient()) {
             switch (state.getStatus()) {
                 case ItemState.STATUS_EXISTING_MODIFIED:
@@ -376,6 +376,7 @@
             Iterator iter = stateMgr.getDescendantTransientItemStates((NodeId) id);
             while (iter.hasNext()) {
                 transientState = (ItemState) iter.next();
+                // fail-fast test: check status of transient state
                 switch (transientState.getStatus()) {
                     case ItemState.STATUS_NEW:
                     case ItemState.STATUS_EXISTING_MODIFIED:

Modified: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/NodeImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/NodeImpl.java?rev=264785&r1=264784&r2=264785&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/NodeImpl.java Tue Aug 30 07:04:56 2005
@@ -884,7 +884,7 @@
         return session.getNodeTypeManager().getPropertyDefinition(pd.getId());
     }
 
-    protected void makePersistent() {
+    protected void makePersistent() throws InvalidItemStateException {
         if (!isTransient()) {
             log.debug(safeGetJCRPath() + " (" + id + "): there's no transient state to persist");
             return;
@@ -899,6 +899,13 @@
         }
 
         synchronized (persistentState) {
+            // check staleness of transient state first
+            if (transientState.isStale()) {
+                String msg = safeGetJCRPath()
+                        + ": the node cannot be saved because it has been modified externally.";
+                log.debug(msg);
+                throw new InvalidItemStateException(msg);
+            }
             // copy state from transient state:
             // parent uuid's
             persistentState.setParentUUID(transientState.getParentUUID());

Modified: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/PropertyImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/PropertyImpl.java?rev=264785&r1=264784&r2=264785&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/PropertyImpl.java (original)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/PropertyImpl.java Tue Aug 30 07:04:56 2005
@@ -40,6 +40,7 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 import javax.jcr.ValueFormatException;
+import javax.jcr.InvalidItemStateException;
 import javax.jcr.lock.LockException;
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.nodetype.PropertyDefinition;
@@ -98,7 +99,7 @@
         return state;
     }
 
-    protected void makePersistent() {
+    protected void makePersistent() throws InvalidItemStateException {
         if (!isTransient()) {
             log.debug(safeGetJCRPath() + " (" + id + "): there's no transient state to persist");
             return;
@@ -112,6 +113,13 @@
         }
 
         synchronized (persistentState) {
+            // check staleness of transient state first
+            if (transientState.isStale()) {
+                String msg = safeGetJCRPath()
+                        + ": the property cannot be saved because it has been modified externally.";
+                log.debug(msg);
+                throw new InvalidItemStateException(msg);
+            }
             // copy state from transient state
             persistentState.setDefinitionId(transientState.getDefinitionId());
             persistentState.setType(transientState.getType());

Modified: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/state/ItemState.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/state/ItemState.java?rev=264785&r1=264784&r2=264785&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/state/ItemState.java (original)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/state/ItemState.java Tue Aug 30 07:04:56 2005
@@ -196,14 +196,6 @@
     }
 
     /**
-     * Determines whether this item state has become stale.
-     * @return true if this item state has become stale, false otherwise.
-     */
-    boolean isStale() {
-        return overlayedState != null && modCount != overlayedState.getModCount();
-    }
-
-    /**
      * Called by <code>TransientItemStateManager</code> and
      * <code>LocalItemStateManager</code> when this item state has been disposed.
      */
@@ -339,6 +331,20 @@
     public boolean isTransient() {
         return isTransient;
 
+    }
+
+    /**
+     * Determines whether this item state has become stale.
+     * @return true if this item state has become stale, false otherwise.
+     */
+    public boolean isStale() {
+        if (isTransient) {
+            return status == STATUS_STALE_MODIFIED
+                    || status == STATUS_STALE_DESTROYED;
+        } else {
+            return overlayedState != null
+                    && modCount != overlayedState.getModCount();
+        }
     }
 
     /**