Author: reschke
Date: Mon Jun 4 14:30:45 2018
New Revision: 1832854
URL: http://svn.apache.org/viewvc?rev=1832854&view=rev
Log:
OAK-7471: add a config switch to disable locking
(2nd attempt witch special handling for Workspace.getLockManager())
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockDeprecation.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/JcrDescriptorsImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/xml/ImporterImpl.java
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java?rev=1832854&r1=1832853&r2=1832854&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
Mon Jun 4 14:30:45 2018
@@ -75,6 +75,8 @@ import javax.jcr.security.AccessControlE
import com.google.common.base.Function;
import com.google.common.base.Predicate;
+
+import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Root;
@@ -82,6 +84,7 @@ import org.apache.jackrabbit.oak.api.Tre
import org.apache.jackrabbit.oak.api.Tree.Status;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.jcr.lock.LockDeprecation;
import org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager;
import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
@@ -378,6 +381,9 @@ public class NodeDelegate extends ItemDe
}
public boolean canAddMixin(String typeName) throws RepositoryException {
+ if (!LockDeprecation.isLockingSupported() &&
JcrConstants.MIX_LOCKABLE.equals(typeName)) {
+ return false;
+ }
Tree type =
sessionDelegate.getRoot().getTree(NODE_TYPES_PATH).getChild(typeName);
if (type.exists()) {
return !TreeUtil.getBoolean(type, JCR_IS_ABSTRACT)
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockDeprecation.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockDeprecation.java?rev=1832854&r1=1832853&r2=1832854&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockDeprecation.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockDeprecation.java
Mon Jun 4 14:30:45 2018
@@ -21,8 +21,11 @@ import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
+import javax.jcr.UnsupportedRepositoryOperationException;
+
import org.apache.jackrabbit.oak.jcr.session.NodeImpl;
import org.apache.jackrabbit.oak.jcr.session.SessionImpl;
+import org.apache.jackrabbit.oak.jcr.xml.ImporterImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,6 +36,11 @@ public class LockDeprecation {
private static final Logger LOG =
LoggerFactory.getLogger(LockDeprecation.class);
+ private static final String LOCKSUPPORT =
System.getProperty("oak.locksupport", "deprecated");
+ private static final boolean ISLOCKINGSUPPORTED =
!("disabled".equals(LOCKSUPPORT));
+
+ private static final String MAYBEOK = "(invocation might be ok in order to
detect locking support)";
+
private LockDeprecation() {
}
@@ -40,23 +48,41 @@ public class LockDeprecation {
private static AtomicBoolean NOTWARNEDYET = new AtomicBoolean(true);
- private static Set<String> IGNOREDCLASSES = new
HashSet<String>(Arrays.asList(
+ // classes that we don't want to include in the stack trace elements in the
+ // log message
+ private static final Set<String> IGNOREDCLASSES = new
HashSet<String>(Arrays.asList(
new String[] { Thread.class.getName(),
java.lang.reflect.Method.class.getName(), LockDeprecation.class.getName(),
LockManagerImpl.class.getName(), NodeImpl.class.getName(),
SessionImpl.class.getName() }));
- public static void logCall(String operation) {
-
- boolean firstInvocation = NOTWARNEDYET.getAndSet(false);
-
- if (firstInvocation) {
- String explanation = "Support for JCR Locking is deprecated and
will be disabled in a future version of Jackrabbit Oak (see OAK-6421 for
further information)";
- LOG.warn(explanation + " - " + createLogMessage(operation));
- } else if (LOG.isTraceEnabled()) {
- LOG.trace(createLogMessage(operation));
+ // classes for which we tolerate locking related calls for now (only TRACE
+ // level, no WARNING)
+ private static final Set<String> ACCEPTEDCLASSES = new HashSet<String>(
+ Arrays.asList(new String[] { ImporterImpl.class.getName() }));
+
+ public static void handleCall(String operation) throws
UnsupportedRepositoryOperationException {
+
+ if (!ISLOCKINGSUPPORTED) {
+ throw new UnsupportedRepositoryOperationException(
+ "Support for JCR Locking is disabled (see OAK-6421 for
further information)");
+ } else {
+ boolean firstInvocation = NOTWARNEDYET.getAndSet(false);
+
+ String message = createLogMessage(operation);
+ if (firstInvocation && !message.endsWith(MAYBEOK)) {
+ String explanation = "Support for JCR Locking is deprecated
and will be disabled in a future version of Jackrabbit Oak (see OAK-6421 for
further information)";
+ LOG.warn(explanation + " - " + message);
+ } else if (LOG.isTraceEnabled()) {
+ LOG.trace(message);
+ }
}
}
+ public final static boolean isLockingSupported() {
+ return ISLOCKINGSUPPORTED;
+ }
+
private static String createLogMessage(String operation) {
+ boolean whitelistThisCall = false;
StackTraceElement elements[] = Thread.currentThread().getStackTrace();
StringBuilder b = new StringBuilder();
b.append("operation '" + operation + "' called from:");
@@ -64,12 +90,16 @@ public class LockDeprecation {
for (StackTraceElement e : elements) {
if (depth < LOGDEPTH) {
String cn = e.getClassName();
+ whitelistThisCall |= ACCEPTEDCLASSES.contains(cn);
if (!IGNOREDCLASSES.contains(cn) &&
!cn.startsWith("sun.reflect")) {
b.append(" ").append(e.toString());
depth += 1;
}
}
}
+ if (whitelistThisCall) {
+ b.append(' ').append(MAYBEOK);
+ }
return b.toString();
}
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java?rev=1832854&r1=1832853&r2=1832854&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java
Mon Jun 4 14:30:45 2018
@@ -70,7 +70,7 @@ public class LockManagerImpl implements
@Override
public void addLockToken(final String lockToken)
throws RepositoryException {
- LockDeprecation.logCall("addLockToken");
+ LockDeprecation.handleCall("addLockToken");
try {
delegate.performVoid(new LockOperation<Void>(sessionContext,
lockToken, "addLockToken") {
@Override
@@ -90,7 +90,7 @@ public class LockManagerImpl implements
@Override
public void removeLockToken(final String lockToken) throws
RepositoryException {
- LockDeprecation.logCall("removeLockToken");
+ LockDeprecation.handleCall("removeLockToken");
if (!delegate.perform(new SessionOperation<Boolean>("removeLockToken")
{
@Nonnull
@Override
@@ -148,7 +148,7 @@ public class LockManagerImpl implements
@Override
public Lock lock(String absPath, final boolean isDeep, final boolean
isSessionScoped,
long timeoutHint, String ownerInfo) throws
RepositoryException {
- LockDeprecation.logCall("lock");
+ LockDeprecation.handleCall("lock");
return new LockImpl(sessionContext, delegate.perform(new
LockOperation<NodeDelegate>(sessionContext, absPath, "lock") {
@Nonnull
@Override
@@ -172,7 +172,7 @@ public class LockManagerImpl implements
@Override
public void unlock(String absPath) throws RepositoryException {
- LockDeprecation.logCall("unlock");
+ LockDeprecation.handleCall("unlock");
delegate.performVoid(new LockOperation<Void>(sessionContext, absPath,
"unlock") {
@Override
protected void performVoid(@Nonnull NodeDelegate node)
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/JcrDescriptorsImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/JcrDescriptorsImpl.java?rev=1832854&r1=1832853&r2=1832854&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/JcrDescriptorsImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/JcrDescriptorsImpl.java
Mon Jun 4 14:30:45 2018
@@ -20,6 +20,7 @@ import javax.jcr.Value;
import javax.jcr.ValueFactory;
import org.apache.jackrabbit.oak.api.Descriptors;
+import org.apache.jackrabbit.oak.jcr.lock.LockDeprecation;
import org.apache.jackrabbit.oak.spi.descriptors.GenericDescriptors;
import static javax.jcr.Repository.OPTION_LOCKING_SUPPORTED;
@@ -37,7 +38,7 @@ public class JcrDescriptorsImpl extends
// add the descriptors of the features that are provided by the JCR
layer
final Value trueValue = valueFactory.createValue(true);
- put(OPTION_LOCKING_SUPPORTED, trueValue, true, true);
+ put(OPTION_LOCKING_SUPPORTED,
valueFactory.createValue(LockDeprecation.isLockingSupported()), true, true);
put(OPTION_XML_EXPORT_SUPPORTED, trueValue, true, true);
put(OPTION_XML_IMPORT_SUPPORTED, trueValue, true, true);
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java?rev=1832854&r1=1832853&r2=1832854&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
Mon Jun 4 14:30:45 2018
@@ -956,7 +956,7 @@ public class NodeImpl<T extends NodeDele
public void addMixin(String mixinName) throws RepositoryException {
final String oakTypeName = getOakName(checkNotNull(mixinName));
if (JcrConstants.MIX_LOCKABLE.equals(oakTypeName)) {
- LockDeprecation.logCall("addMixin " + JcrConstants.MIX_LOCKABLE);
+ LockDeprecation.handleCall("addMixin " +
JcrConstants.MIX_LOCKABLE);
}
sessionDelegate.performVoid(new ItemWriteOperation<Void>("addMixin") {
@Override
@@ -1208,6 +1208,9 @@ public class NodeImpl<T extends NodeDele
@Override
public boolean isLocked() throws RepositoryException {
+ if (!LockDeprecation.isLockingSupported()) {
+ return false;
+ }
return getLockManager().isLocked(getPath());
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java?rev=1832854&r1=1832853&r2=1832854&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionImpl.java
Mon Jun 4 14:30:45 2018
@@ -657,7 +657,8 @@ public class SessionImpl implements Jack
if (!parent.isCheckedOut()) {
return false;
}
- if (parent.isLocked()) {
+ boolean hasLocking =
sessionContext.getRepository().getDescriptorValue(Repository.OPTION_LOCKING_SUPPORTED).getBoolean();
+ if (hasLocking && parent.isLocked()) {
return false;
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java?rev=1832854&r1=1832853&r2=1832854&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/WorkspaceImpl.java
Mon Jun 4 14:30:45 2018
@@ -44,6 +44,7 @@ import org.apache.jackrabbit.oak.api.Roo
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate;
import org.apache.jackrabbit.oak.jcr.delegate.WorkspaceDelegate;
+import org.apache.jackrabbit.oak.jcr.lock.LockDeprecation;
import org.apache.jackrabbit.oak.jcr.lock.LockManagerImpl;
import org.apache.jackrabbit.oak.jcr.query.QueryManagerImpl;
import org.apache.jackrabbit.oak.jcr.session.operation.SessionOperation;
@@ -197,7 +198,8 @@ public class WorkspaceImpl implements Ja
}
@Override
- public LockManagerImpl getLockManager() {
+ public LockManagerImpl getLockManager() throws
UnsupportedRepositoryOperationException {
+ LockDeprecation.handleCall("get LockManager");
return new LockManagerImpl(sessionContext);
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java?rev=1832854&r1=1832853&r2=1832854&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionManagerImpl.java
Mon Jun 4 14:30:45 2018
@@ -49,6 +49,7 @@ import org.apache.jackrabbit.oak.jcr.del
import org.apache.jackrabbit.oak.jcr.delegate.VersionDelegate;
import org.apache.jackrabbit.oak.jcr.delegate.VersionHistoryDelegate;
import org.apache.jackrabbit.oak.jcr.delegate.VersionManagerDelegate;
+import org.apache.jackrabbit.oak.jcr.lock.LockDeprecation;
import org.apache.jackrabbit.oak.jcr.lock.LockManagerImpl;
import org.apache.jackrabbit.oak.jcr.session.SessionContext;
import org.apache.jackrabbit.oak.jcr.session.operation.SessionOperation;
@@ -389,12 +390,15 @@ public class VersionManagerImpl implemen
}
private void checkNotLocked(String absPath) throws RepositoryException {
+ if (!LockDeprecation.isLockingSupported()) {
+ return;
+ }
// TODO: avoid nested calls
LockManagerImpl lockManager =
sessionContext.getWorkspace().getLockManager();
if (lockManager.isLocked(absPath)) {
NodeDelegate node =
sessionContext.getSessionDelegate().getNode(absPath);
if (!lockManager.canUnlock(node)) {
- throw new LockException("Node at " + absPath + " is locked");
+ throw new LockException("Node at " + absPath + " is locked");
}
}
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/xml/ImporterImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/xml/ImporterImpl.java?rev=1832854&r1=1832853&r2=1832854&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/xml/ImporterImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/xml/ImporterImpl.java
Mon Jun 4 14:30:45 2018
@@ -31,6 +31,7 @@ import javax.jcr.ImportUUIDBehavior;
import javax.jcr.ItemExistsException;
import javax.jcr.PathNotFoundException;
import javax.jcr.PropertyType;
+import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
@@ -147,7 +148,8 @@ public class ImporterImpl implements Imp
if (!vMgr.isCheckedOut(absPath)) {
throw new VersionException("Target node is checked in.");
}
- if (importTargetTree.getStatus() != Tree.Status.NEW &&
wsp.getLockManager().isLocked(absPath)) {
+ boolean hasLocking =
sessionContext.getRepository().getDescriptorValue(Repository.OPTION_LOCKING_SUPPORTED).getBoolean();
+ if (importTargetTree.getStatus() != Tree.Status.NEW && hasLocking &&
wsp.getLockManager().isLocked(absPath)) {
throw new LockException("Target node is locked.");
}
effectiveNodeTypeProvider = wsp.getNodeTypeManager();