### Eclipse Workspace Patch 1.0 #P jackrabbit-core Index: src/main/java/org/apache/jackrabbit/core/TransactionContext.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/TransactionContext.java (revision 814512) +++ src/main/java/org/apache/jackrabbit/core/TransactionContext.java (working copy) @@ -350,6 +350,6 @@ */ public static boolean isCurrentXid(Xid xid, boolean fallback) { Xid currentXid = (Xid) CURRENT_XID.get(); - return fallback ? true : (currentXid == null || xid == null) ? fallback : Arrays.equals(xid.getGlobalTransactionId(), currentXid.getGlobalTransactionId()); + return (currentXid == null || xid == null) ? fallback : Arrays.equals(xid.getGlobalTransactionId(), currentXid.getGlobalTransactionId()); } } Index: src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java (revision 899564) +++ src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java (working copy) @@ -109,7 +109,7 @@ * the write lock (reentrant). */ protected boolean allowReader() { - return TransactionContext.isCurrentXid(activeXid, (activeWriter_ == null || activeWriter_ == Thread.currentThread())); + return TransactionContext.isCurrentXid(activeXid, (activeWriter_ == null || activeWriter_ == Thread.currentThread())); } /** @@ -120,7 +120,8 @@ if (activeXid != null && xid != null) { boolean sameGTI = Arrays.equals(activeXid.getGlobalTransactionId(), xid.getGlobalTransactionId()); if (!sameGTI) { - log.warn("Unable to set the ActiveXid while a other one is associated with a different GloalTransactionId with this RWLock."); + log.warn("Unable to set the ActiveXid while a other one is associated with a different GlobalTransactionId with this RWLock. " + + "Please file a Jira Issue if you see this message and refer to JCR-1334."); return; } } @@ -148,5 +149,30 @@ } } } + + /** + * {@inheritDoc} + * + * If there is still a active Xid on this RWLock do not allow startWrite + */ + protected synchronized boolean startWrite() { + boolean allowWrite = TransactionContext.isCurrentXid(activeXid, (activeWriter_ == Thread.currentThread())); + if (allowWrite) { + ++writeHolds_; + return true; + } else if (writeHolds_ == 0) { + if (activeReaders_ == 0 || + (readers_.size() == 1 && + readers_.get(Thread.currentThread()) != null)) { + activeWriter_ = Thread.currentThread(); + writeHolds_ = 1; + return true; + } else { + return false; + } + } else { + return false; + } + } } }