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 {


Reply via email to