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 2006/03/08 21:32:17 UTC

svn commit: r384322 - in /incubator/jackrabbit/branches/1.0: RELEASE-NOTES.txt jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java

Author: jukka
Date: Wed Mar  8 12:32:15 2006
New Revision: 384322

URL: http://svn.apache.org/viewcvs?rev=384322&view=rev
Log:
1.0: Merged revision 383935: JCR-335 Deadlock caused by versioning operations within transaction

Modified:
    incubator/jackrabbit/branches/1.0/RELEASE-NOTES.txt
    incubator/jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java

Modified: incubator/jackrabbit/branches/1.0/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/branches/1.0/RELEASE-NOTES.txt?rev=384322&r1=384321&r2=384322&view=diff
==============================================================================
--- incubator/jackrabbit/branches/1.0/RELEASE-NOTES.txt (original)
+++ incubator/jackrabbit/branches/1.0/RELEASE-NOTES.txt Wed Mar  8 12:32:15 2006
@@ -96,6 +96,10 @@
 Change History
 --------------
 
+Changes since 1.0-rc1:
+
+  [JCR-335] Deadlock caused by versioning operations within transaction
+
 Changes since 0.9:
 
   [JCR-334] loadURI compile error with Maven 1.0.2

Modified: incubator/jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java?rev=384322&r1=384321&r2=384322&view=diff
==============================================================================
--- incubator/jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (original)
+++ incubator/jackrabbit/branches/1.0/jackrabbit/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java Wed Mar  8 12:32:15 2006
@@ -424,6 +424,11 @@
         private EventStateCollection events;
 
         /**
+         * Flag indicating whether we are holding write lock.
+         */
+        private boolean holdingWriteLock;
+
+        /**
          * Create a new instance of this class.
          */
         public Update(ChangeLog local, EventStateCollectionFactory factory,
@@ -454,6 +459,7 @@
             }
 
             acquireWriteLock();
+            holdingWriteLock = true;
 
             boolean succeeded = false;
 
@@ -572,8 +578,6 @@
                 }
             }
 
-            boolean holdingWriteLock = true;
-
             try {
                 /* Let the shared item listeners know about the change */
                 shared.persisted();
@@ -601,6 +605,7 @@
                 if (holdingWriteLock) {
                     // exception occured before downgrading lock
                     rwLock.writeLock().release();
+                    holdingWriteLock = false;
                 } else {
                     rwLock.readLock().release();
                 }
@@ -612,29 +617,35 @@
          * on the item state manager will have been released.
          */
         public void cancel() {
-            local.disconnect();
+            try {
+                local.disconnect();
 
-            for (Iterator iter = shared.modifiedStates(); iter.hasNext();) {
-                ItemState state = (ItemState) iter.next();
-                try {
-                    state.copy(loadItemState(state.getId()));
-                } catch (ItemStateException e) {
-                    state.discard();
+                for (Iterator iter = shared.modifiedStates(); iter.hasNext();) {
+                    ItemState state = (ItemState) iter.next();
+                    try {
+                        state.copy(loadItemState(state.getId()));
+                    } catch (ItemStateException e) {
+                        state.discard();
+                    }
                 }
-            }
-            for (Iterator iter = shared.deletedStates(); iter.hasNext();) {
-                ItemState state = (ItemState) iter.next();
-                try {
-                    state.copy(loadItemState(state.getId()));
-                } catch (ItemStateException e) {
+                for (Iterator iter = shared.deletedStates(); iter.hasNext();) {
+                    ItemState state = (ItemState) iter.next();
+                    try {
+                        state.copy(loadItemState(state.getId()));
+                    } catch (ItemStateException e) {
+                        state.discard();
+                    }
+                }
+                for (Iterator iter = shared.addedStates(); iter.hasNext();) {
+                    ItemState state = (ItemState) iter.next();
                     state.discard();
                 }
+            } finally {
+                if (holdingWriteLock) {
+                    rwLock.writeLock().release();
+                    holdingWriteLock = false;
+                }
             }
-            for (Iterator iter = shared.addedStates(); iter.hasNext();) {
-                ItemState state = (ItemState) iter.next();
-                state.discard();
-            }
-            rwLock.writeLock().release();
         }
     }