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 2009/03/04 15:13:15 UTC
svn commit: r750013 - in /jackrabbit/branches/1.5: ./
jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/
jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/
jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ jackrabbit...
Author: jukka
Date: Wed Mar 4 14:13:15 2009
New Revision: 750013
URL: http://svn.apache.org/viewvc?rev=750013&view=rev
Log:
1.5: Merged revisions 749953, 749965 and 750011 (JCR-2000)
Modified:
jackrabbit/branches/1.5/ (props changed)
jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java
jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java
jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java
jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java
jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java
jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentVersioningWithTransactionsTest.java
jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/daily/RandomOperationTest.java
Propchange: jackrabbit/branches/1.5/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Mar 4 14:13:15 2009
@@ -1,2 +1,2 @@
/jackrabbit/branches/1.3:631261
-/jackrabbit/trunk:703899-704158,704165,704167,704324,704358,704361,704864,704933,704939,705010,705033,705243,705496,705522,705579,705925,705932,705934,705937-705938,705961,706242,706273,706285-706286,706562,706606,706649,706655,706660,706697,706918,707303-707304,707307,707310,707630,708206,708598,708609,708613,708619,708634,708840,708863,708909,708929,708943,709115,709142,709207,709211,710047,711238,711566-711567,711595,711841-711843,712984-712985,713037,713059,713065,713072,713076,713162,713214,713956,713958,713964,713971,713975,714034,718218,718249-718250,718371,718376,718566,718632,718981,719225,719282,719575-719577,719579,719585-719586,719588,719592,720455,720484,720492,720524,720533,720540,720673,720679,720687,720784,720940,720969,721186,721191,721194,721235,721387-721389,721470,721495,722068-722069,722463,722465,722467,722470,722825,723281,723346,723728,723784,724300,724387,725292,727376,727388,727390,727395,727397,727402,727492,727701,728022,731896,731934,731941,73234
7,732678,732686,732689,732693,732703,732715-732716,732719,732728,732730,732734-732738,732740,732742-732743,732745,732867,732883,733057-733059,733061,733080,734092,734366,734375,734400,734709,735401,736021,736030,736274,736276,736650-736651,736653-736656,736658,736680,737695,738087,738119,738121,738419,738422,738474,738512,739210,739212,739226,740262,740734,740736-740738,740747,740749-740750,741052,741100,741121,741206,741208-741210,741213,741509,741524,741652,741803,742382,742538,743295,743713,743718,743726,743734,743738,744883-744884,744889,744895,744911,744935,744940,744954,744956,745041,745051,745053,745056,745060,745120,745500,745534,745824,745849,746301-746302,746486,746602-746603,746609,746666,746747-746748
+/jackrabbit/trunk:703899-704158,704165,704167,704324,704358,704361,704864,704933,704939,705010,705033,705243,705496,705522,705579,705925,705932,705934,705937-705938,705961,706242,706273,706285-706286,706562,706606,706649,706655,706660,706697,706918,707303-707304,707307,707310,707630,708206,708598,708609,708613,708619,708634,708840,708863,708909,708929,708943,709115,709142,709207,709211,710047,711238,711566-711567,711595,711841-711843,712984-712985,713037,713059,713065,713072,713076,713162,713214,713956,713958,713964,713971,713975,714034,718218,718249-718250,718371,718376,718566,718632,718981,719225,719282,719575-719577,719579,719585-719586,719588,719592,720455,720484,720492,720524,720533,720540,720673,720679,720687,720784,720940,720969,721186,721191,721194,721235,721387-721389,721470,721495,722068-722069,722463,722465,722467,722470,722825,723281,723346,723728,723784,724300,724387,725292,727376,727388,727390,727395,727397,727402,727492,727701,728022,731896,731934,731941,73234
7,732678,732686,732689,732693,732703,732715-732716,732719,732728,732730,732734-732738,732740,732742-732743,732745,732867,732883,733057-733059,733061,733080,734092,734366,734375,734400,734709,735401,736021,736030,736274,736276,736650-736651,736653-736656,736658,736680,737695,738087,738119,738121,738419,738422,738474,738512,739210,739212,739226,740262,740734,740736-740738,740747,740749-740750,741052,741100,741121,741206,741208-741210,741213,741509,741524,741652,741803,742382,742538,743295,743713,743718,743726,743734,743738,744883-744884,744889,744895,744911,744935,744940,744954,744956,745041,745051,745053,745056,745060,745120,745500,745534,745824,745849,746301-746302,746486,746602-746603,746609,746666,746747-746748,749953,749965,750011
Modified: jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java?rev=750013&r1=750012&r2=750013&view=diff
==============================================================================
--- jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java (original)
+++ jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java Wed Mar 4 14:13:15 2009
@@ -52,8 +52,8 @@
return new WriteLock() {
{
- rwLock.setActiveXid(TransactionContext.getCurrentXid());
rwLock.writeLock().acquire();
+ rwLock.setActiveXid(TransactionContext.getCurrentXid());
}
/**
Modified: jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java?rev=750013&r1=750012&r2=750013&view=diff
==============================================================================
--- jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java (original)
+++ jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/AbstractVersionManager.java Wed Mar 4 14:13:15 2009
@@ -16,14 +16,15 @@
*/
package org.apache.jackrabbit.core.version;
-import EDU.oswego.cs.dl.util.concurrent.ReadWriteLock;
-import EDU.oswego.cs.dl.util.concurrent.ReentrantWriterPreferenceReadWriteLock;
import org.apache.jackrabbit.core.NodeId;
import org.apache.jackrabbit.core.NodeImpl;
import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
+import org.apache.jackrabbit.core.state.DefaultISMLocking;
import org.apache.jackrabbit.core.state.ItemStateException;
import org.apache.jackrabbit.core.state.LocalItemStateManager;
import org.apache.jackrabbit.core.state.NodeState;
+import org.apache.jackrabbit.core.state.ISMLocking.ReadLock;
+import org.apache.jackrabbit.core.state.ISMLocking.WriteLock;
import org.apache.jackrabbit.spi.Name;
import org.apache.jackrabbit.spi.commons.name.NameConstants;
import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl;
@@ -66,17 +67,7 @@
/**
* the lock on this version manager
*/
- private final ReadWriteLock rwLock =
- new ReentrantWriterPreferenceReadWriteLock() {
- /**
- * Allow reader when there is no active writer, or current
- * thread owns the write lock (reentrant).
- */
- protected boolean allowReader() {
- return activeWriter_ == null
- || activeWriter_ == Thread.currentThread();
- }
- };
+ private final DefaultISMLocking rwLock = new DefaultISMLocking();
public AbstractVersionManager(NodeTypeRegistry ntReg) {
this.ntReg = ntReg;
@@ -108,13 +99,12 @@
//-------------------------------------------------------< implementation >
/**
- * aquires the write lock on this version manager.
+ * Acquires the write lock on this version manager.
*/
- protected void acquireWriteLock() {
+ protected WriteLock acquireWriteLock() {
while (true) {
try {
- rwLock.writeLock().acquire();
- return;
+ return rwLock.acquireWriteLock(null);
} catch (InterruptedException e) {
// ignore
}
@@ -122,20 +112,12 @@
}
/**
- * releases the write lock on this version manager.
- */
- protected void releaseWriteLock() {
- rwLock.writeLock().release();
- }
-
- /**
- * aquires the read lock on this version manager.
+ * acquires the read lock on this version manager.
*/
- protected void acquireReadLock() {
+ protected ReadLock acquireReadLock() {
while (true) {
try {
- rwLock.readLock().acquire();
- return;
+ return rwLock.acquireReadLock(null);
} catch (InterruptedException e) {
// ignore
}
@@ -143,13 +125,6 @@
}
/**
- * releases the read lock on this version manager.
- */
- protected void releaseReadLock() {
- rwLock.readLock().release();
- }
-
- /**
* Helper for managing write operations.
*/
private class WriteOperation {
@@ -159,6 +134,12 @@
*/
private boolean success = false;
+ private final WriteLock lock;
+
+ public WriteOperation(WriteLock lock) {
+ this.lock = lock;
+ }
+
/**
* Saves the pending operations in the {@link LocalItemStateManager}.
*
@@ -182,7 +163,7 @@
stateMgr.cancel();
}
} finally {
- releaseWriteLock();
+ lock.release();
}
}
}
@@ -211,16 +192,16 @@
*/
private WriteOperation startWriteOperation() throws RepositoryException {
boolean success = false;
- acquireWriteLock();
+ WriteLock lock = acquireWriteLock();
try {
stateMgr.edit();
success = true;
- return new WriteOperation();
+ return new WriteOperation(lock);
} catch (IllegalStateException e) {
throw new RepositoryException("Unable to start edit operation.", e);
} finally {
if (!success) {
- releaseWriteLock();
+ lock.release();
}
}
}
@@ -232,7 +213,7 @@
throws RepositoryException {
VersionHistoryInfo info = null;
- acquireReadLock();
+ ReadLock lock = acquireReadLock();
try {
String uuid = node.getNodeId().getUUID().toString();
Name name = getName(uuid);
@@ -246,7 +227,7 @@
history.getState().getChildNodeEntry(root, 1).getId());
}
} finally {
- releaseReadLock();
+ lock.release();
}
if (info == null) {
Modified: jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java?rev=750013&r1=750012&r2=750013&view=diff
==============================================================================
--- jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java (original)
+++ jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/InternalVersionImpl.java Wed Mar 4 14:13:15 2009
@@ -17,6 +17,7 @@
package org.apache.jackrabbit.core.version;
import org.apache.jackrabbit.core.state.ChildNodeEntry;
+import org.apache.jackrabbit.core.state.ISMLocking.ReadLock;
import org.apache.jackrabbit.core.value.InternalValue;
import org.apache.jackrabbit.core.NodeId;
import org.apache.jackrabbit.spi.Name;
@@ -136,7 +137,7 @@
* {@inheritDoc}
*/
public InternalVersion[] getSuccessors() {
- vMgr.acquireReadLock();
+ ReadLock lock = vMgr.acquireReadLock();
try {
InternalValue[] values = node.getPropertyValues(NameConstants.JCR_SUCCESSORS);
if (values != null) {
@@ -150,7 +151,7 @@
return new InternalVersion[0];
}
} finally {
- vMgr.releaseReadLock();
+ lock.release();
}
}
Modified: jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java?rev=750013&r1=750012&r2=750013&view=diff
==============================================================================
--- jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java (original)
+++ jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java Wed Mar 4 14:13:15 2009
@@ -42,6 +42,7 @@
import org.apache.jackrabbit.core.state.SharedItemStateManager;
import org.apache.jackrabbit.core.state.ISMLocking;
import org.apache.jackrabbit.core.state.NoSuchItemStateException;
+import org.apache.jackrabbit.core.state.ISMLocking.ReadLock;
import org.apache.jackrabbit.core.value.InternalValue;
import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider;
import org.apache.jackrabbit.spi.Path;
@@ -233,11 +234,11 @@
* {@inheritDoc}
*/
public boolean hasItem(NodeId id) {
- acquireReadLock();
+ ReadLock lock = acquireReadLock();
try {
return stateMgr.hasItemState(id);
} finally {
- releaseReadLock();
+ lock.release();
}
}
@@ -250,7 +251,7 @@
if (id.equals(getHistoryRootId())) {
return null;
}
- acquireReadLock();
+ ReadLock lock = acquireReadLock();
try {
synchronized (versionItems) {
InternalVersionItem item = (InternalVersionItem) versionItems.get(id);
@@ -265,7 +266,7 @@
return item;
}
} finally {
- releaseReadLock();
+ lock.release();
}
}
@@ -350,7 +351,7 @@
* @param items items updated
*/
public void itemsUpdated(Collection items) {
- acquireReadLock();
+ ReadLock lock = acquireReadLock();
try {
synchronized (versionItems) {
Iterator iter = items.iterator();
@@ -371,7 +372,7 @@
}
}
} finally {
- releaseReadLock();
+ lock.release();
}
}
@@ -390,11 +391,11 @@
*/
protected void itemDiscarded(InternalVersionItem item) {
// evict removed item from cache
- acquireReadLock();
+ ReadLock lock = acquireReadLock();
try {
versionItems.remove(item.getId());
} finally {
- releaseReadLock();
+ lock.release();
}
}
@@ -473,11 +474,11 @@
*/
public void stateDestroyed(ItemState destroyed) {
// evict removed item from cache
- acquireReadLock();
+ ReadLock lock = acquireReadLock();
try {
versionItems.remove(destroyed.getId());
} finally {
- releaseReadLock();
+ lock.release();
}
}
Modified: jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java?rev=750013&r1=750012&r2=750013&view=diff
==============================================================================
--- jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java (original)
+++ jackrabbit/branches/1.5/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java Wed Mar 4 14:13:15 2009
@@ -46,6 +46,8 @@
import org.apache.jackrabbit.core.state.NodeReferencesId;
import org.apache.jackrabbit.core.state.NodeState;
import org.apache.jackrabbit.core.state.XAItemStateManager;
+import org.apache.jackrabbit.core.state.ISMLocking.ReadLock;
+import org.apache.jackrabbit.core.state.ISMLocking.WriteLock;
import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider;
import org.apache.jackrabbit.core.virtual.VirtualNodeState;
import org.apache.jackrabbit.core.virtual.VirtualPropertyState;
@@ -91,6 +93,11 @@
private boolean vmgrLocked = false;
/**
+ * The global write lock on the version manager.
+ */
+ private WriteLock vmgrLock;
+
+ /**
* Creates a new instance of this class.
*/
public XAVersionManager(VersionManagerImpl vMgr, NodeTypeRegistry ntReg,
@@ -515,8 +522,7 @@
/**
* Returns an {@link InternalXAResource} that acquires a write lock on the
- * version manager in {@link InternalXAResource#prepare(TransactionContext)}
- * if there are any version related items involved in this transaction.
+ * version manager in {@link InternalXAResource#prepare(TransactionContext)}.
*
* @return an internal XA resource.
*/
@@ -529,11 +535,8 @@
}
public void prepare(TransactionContext tx) {
- Map vItems = (Map) tx.getAttribute(ITEMS_ATTRIBUTE_NAME);
- if (!vItems.isEmpty()) {
- vMgr.acquireWriteLock();
- vmgrLocked = true;
- }
+ vmgrLock = vMgr.acquireWriteLock();
+ vmgrLocked = true;
}
public void commit(TransactionContext tx) {
@@ -578,7 +581,7 @@
private void internalReleaseWriteLock() {
if (vmgrLocked) {
- vMgr.releaseWriteLock();
+ vmgrLock.release();
vmgrLocked = false;
}
}
@@ -602,7 +605,7 @@
*/
private InternalVersionHistoryImpl makeLocalCopy(InternalVersionHistoryImpl history)
throws RepositoryException {
- acquireReadLock();
+ ReadLock lock = acquireReadLock();
try {
NodeState state = (NodeState) stateMgr.getItemState(history.getId());
NodeStateEx stateEx = new NodeStateEx(stateMgr, ntReg, state, null);
@@ -610,7 +613,7 @@
} catch (ItemStateException e) {
throw new RepositoryException("Unable to make local copy", e);
} finally {
- releaseReadLock();
+ lock.release();
}
}
Modified: jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentVersioningWithTransactionsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentVersioningWithTransactionsTest.java?rev=750013&r1=750012&r2=750013&view=diff
==============================================================================
--- jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentVersioningWithTransactionsTest.java (original)
+++ jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentVersioningWithTransactionsTest.java Wed Mar 4 14:13:15 2009
@@ -46,6 +46,27 @@
*/
private static final int NUM_OPERATIONS = 100;
+ /**
+ * Creates the named test node. The node is created within a transaction
+ * to avoid mixing transactional and non-transactional writes within a
+ * concurrent test run.
+ */
+ private static synchronized Node createParentNode(Node test, String name)
+ throws RepositoryException {
+ try {
+ UserTransaction utx = new UserTransactionImpl(test.getSession());
+ utx.begin();
+ Node parent = test.addNode(name);
+ test.save();
+ utx.commit();
+ return parent;
+ } catch (RepositoryException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new RepositoryException("Failed to add node: " + name, e);
+ }
+ }
+
public void testConcurrentAddVersionableInTransaction()
throws RepositoryException {
runTask(new Task() {
@@ -53,11 +74,7 @@
throws RepositoryException {
// add versionable nodes
final String threadName = Thread.currentThread().getName();
- Node parent;
- synchronized (ConcurrentVersioningWithTransactionsTest.class) {
- parent = test.addNode(threadName);
- test.save();
- }
+ Node parent = createParentNode(test, threadName);
for (int i = 0; i < NUM_OPERATIONS / CONCURRENCY; i++) {
try {
final UserTransaction utx = new UserTransactionImpl(test.getSession());
Modified: jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/daily/RandomOperationTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/daily/RandomOperationTest.java?rev=750013&r1=750012&r2=750013&view=diff
==============================================================================
--- jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/daily/RandomOperationTest.java (original)
+++ jackrabbit/branches/1.5/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/daily/RandomOperationTest.java Wed Mar 4 14:13:15 2009
@@ -101,7 +101,16 @@
runTasks(new Task[]{task1, task2}, NUM_THREADS, end + MAX_WAIT_SECONDS * 1000);
}
- public void testContentAndVersionOperationsXAMixed() throws RepositoryException {
+ /**
+ * Test disabled since it violates the "Don't mix concurrent transactional
+ * and non-transactional writes to a single workspace" guideline formed
+ * during the concurrency review.
+ *
+ * @see <a href="http://jackrabbit.apache.org/concurrency-control.html">Concurrency control</a>
+ * @see <a href="https://issues.apache.org/jira/browse/JCR-2000">JCR-2000</a>
+ */
+ public void disabledTestContentAndVersionOperationsXAMixed()
+ throws RepositoryException {
ContentOperationsTask task1 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end);
ContentOperationsTask task2 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end);
task2.setUseXA(true);
@@ -111,7 +120,16 @@
runTasks(new Task[]{task1, task2, task3, task4}, NUM_THREADS, end + MAX_WAIT_SECONDS * 1000);
}
- public void testContentAndVersionOperationsXAMixedShortSaveInterval() throws RepositoryException {
+ /**
+ * Test disabled since it violates the "Don't mix concurrent transactional
+ * and non-transactional writes to a single workspace" guideline formed
+ * during the concurrency review.
+ *
+ * @see <a href="http://jackrabbit.apache.org/concurrency-control.html">Concurrency control</a>
+ * @see <a href="https://issues.apache.org/jira/browse/JCR-2000">JCR-2000</a>
+ */
+ public void disabledTestContentAndVersionOperationsXAMixedShortSaveInterval()
+ throws RepositoryException {
ContentOperationsTask task1 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, 1, end);
ContentOperationsTask task2 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, 1, end);
task2.setUseXA(true);
@@ -120,4 +138,5 @@
task4.setUseXA(true);
runTasks(new Task[]{task1, task2, task3, task4}, NUM_THREADS, end + MAX_WAIT_SECONDS * 1000);
}
+
}