Author: mduerig
Date: Wed Mar 19 16:23:32 2014
New Revision: 1579286
URL: http://svn.apache.org/r1579286
Log:
OAK-1454: Warn on huge multi-valued properties
Log a warning when there are more than 1000 values on a multi valued properties
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/ItemImpl.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/PropertyImpl.java
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/ItemImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/ItemImpl.java?rev=1579286&r1=1579285&r2=1579286&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/ItemImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/ItemImpl.java
Wed Mar 19 16:23:32 2014
@@ -16,7 +16,18 @@
*/
package org.apache.jackrabbit.oak.jcr.session;
+import static com.google.common.collect.Lists.newArrayListWithCapacity;
+import static org.apache.jackrabbit.oak.api.Type.NAME;
+import static org.apache.jackrabbit.oak.api.Type.NAMES;
+import static org.apache.jackrabbit.oak.api.Type.PATH;
+import static org.apache.jackrabbit.oak.api.Type.PATHS;
+import static org.apache.jackrabbit.oak.api.Type.STRING;
+import static org.apache.jackrabbit.oak.api.Type.UNDEFINED;
+import static org.apache.jackrabbit.oak.api.Type.UNDEFINEDS;
+import static
org.apache.jackrabbit.oak.plugins.memory.PropertyStates.createProperty;
+
import java.util.List;
+
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.jcr.AccessDeniedException;
@@ -46,16 +57,6 @@ import org.apache.jackrabbit.oak.plugins
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static com.google.common.collect.Lists.newArrayListWithCapacity;
-import static org.apache.jackrabbit.oak.api.Type.NAME;
-import static org.apache.jackrabbit.oak.api.Type.NAMES;
-import static org.apache.jackrabbit.oak.api.Type.PATH;
-import static org.apache.jackrabbit.oak.api.Type.PATHS;
-import static org.apache.jackrabbit.oak.api.Type.STRING;
-import static org.apache.jackrabbit.oak.api.Type.UNDEFINED;
-import static org.apache.jackrabbit.oak.api.Type.UNDEFINEDS;
-import static
org.apache.jackrabbit.oak.plugins.memory.PropertyStates.createProperty;
-
/**
* TODO document
*/
@@ -63,6 +64,7 @@ abstract class ItemImpl<T extends ItemDe
private static final Logger log = LoggerFactory.getLogger(ItemImpl.class);
public static final String ITEM_SAVE_DOES_SESSION_SAVE =
"item-save-does-session-save";
+ public static final int MV_PROPERTY_WARN_THRESHOLD = 1000;
/**
* The value of this flag determines the behaviour of {@link #save()}. If
{@code false},
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=1579286&r1=1579285&r2=1579286&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
Wed Mar 19 16:23:32 2014
@@ -16,12 +16,24 @@
*/
package org.apache.jackrabbit.oak.jcr.session;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Iterators.transform;
+import static com.google.common.collect.Sets.newLinkedHashSet;
+import static java.util.Arrays.asList;
+import static java.util.Collections.singleton;
+import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
+import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
+import static org.apache.jackrabbit.oak.api.Type.NAME;
+import static org.apache.jackrabbit.oak.api.Type.NAMES;
+import static org.apache.jackrabbit.oak.util.TreeUtil.getNames;
+
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
+
import javax.annotation.Nonnull;
import javax.jcr.AccessDeniedException;
import javax.jcr.Binary;
@@ -81,17 +93,6 @@ import org.apache.jackrabbit.value.Value
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.Iterators.transform;
-import static com.google.common.collect.Sets.newLinkedHashSet;
-import static java.util.Arrays.asList;
-import static java.util.Collections.singleton;
-import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
-import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
-import static org.apache.jackrabbit.oak.api.Type.NAME;
-import static org.apache.jackrabbit.oak.api.Type.NAMES;
-import static org.apache.jackrabbit.oak.util.TreeUtil.getNames;
-
/**
* TODO document
*
@@ -108,7 +109,7 @@ public class NodeImpl<T extends NodeDele
/**
* logger instance
*/
- private static final Logger log = LoggerFactory.getLogger(NodeImpl.class);
+ private static final Logger LOG = LoggerFactory.getLogger(NodeImpl.class);
public static NodeImpl<? extends NodeDelegate> createNodeOrNull(
NodeDelegate delegate, SessionContext context)
@@ -534,7 +535,7 @@ public class NodeImpl<T extends NodeDele
if (nd == null) {
throw new PathNotFoundException(oakPath);
} else {
- return NodeImpl.createNode(nd, sessionContext);
+ return createNode(nd, sessionContext);
}
}
});
@@ -1028,7 +1029,7 @@ public class NodeImpl<T extends NodeDele
// check for pending changes
if (sessionDelegate.hasPendingChanges()) {
String msg = "Unable to perform operation. Session has
pending changes.";
- log.debug(msg);
+ LOG.debug(msg);
throw new InvalidItemStateException(msg);
}
@@ -1376,6 +1377,11 @@ public class NodeImpl<T extends NodeDele
final String oakName = getOakPathOrThrow(checkNotNull(jcrName));
final PropertyState state = createMultiState(
oakName, compact(values), Type.fromTag(type, true));
+
+ if (values.length > MV_PROPERTY_WARN_THRESHOLD) {
+ LOG.warn("Large multi valued property detected ({} values).",
values.length);
+ }
+
return perform(new ItemWriteOperation<Property>() {
@Override
public void checkPreconditions() throws RepositoryException {
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java?rev=1579286&r1=1579285&r2=1579286&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/PropertyImpl.java
Wed Mar 19 16:23:32 2014
@@ -45,11 +45,14 @@ import org.apache.jackrabbit.oak.jcr.del
import org.apache.jackrabbit.oak.jcr.session.operation.PropertyOperation;
import org.apache.jackrabbit.oak.plugins.value.ValueFactoryImpl;
import org.apache.jackrabbit.value.ValueHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* TODO document
*/
public class PropertyImpl extends ItemImpl<PropertyDelegate> implements
Property {
+ private static final Logger LOG =
LoggerFactory.getLogger(PropertyImpl.class);
private static final Value[] NO_VALUES = new Value[0];
@@ -459,8 +462,12 @@ public class PropertyImpl extends ItemIm
});
}
- private void internalSetValue(final @Nonnull Value[] values)
+ private void internalSetValue(@Nonnull final Value[] values)
throws RepositoryException {
+ if (values.length > MV_PROPERTY_WARN_THRESHOLD) {
+ LOG.warn("Large multi valued property detected ({} values).",
values.length);
+ }
+
perform(new ItemWriteOperation<Void>() {
@Override
public Void perform() throws RepositoryException {