From 15f3f19d1706de26f3ec7f587aad57eaffb4d5aa Mon Sep 17 00:00:00 2001 From: Julian Reschke Date: Wed, 24 Jul 2019 04:29:23 +0000 Subject: [PATCH 1/6] [maven-release-plugin] copy for tag jackrabbit-oak-1.16.0 git-svn-id: https://svn.apache.org/repos/asf/jackrabbit/oak/tags/jackrabbit-oak-1.16.0@1863680 13f79535-47bb-0310-9956-ffa450edef68 From 54c7fd2bdc548c4444b6fe4f975c1c0992f2c1fa Mon Sep 17 00:00:00 2001 From: Mohit Kataria Date: Wed, 18 Sep 2019 13:52:12 +0530 Subject: [PATCH 2/6] OAK-8633: Add warn logs if we add/update a string property larger than 100KB --- .../org/apache/jackrabbit/oak/jcr/Jcr.java | 12 ++- .../oak/jcr/repository/RepositoryImpl.java | 21 ++++- .../jackrabbit/oak/jcr/session/NodeImpl.java | 14 ++- .../oak/jcr/MaxStringPropertySizeTest.java | 94 +++++++++++++++++++ 4 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/MaxStringPropertySizeTest.java diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java index d11c0cc9e71..a86f6fdd448 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java @@ -66,6 +66,7 @@ */ public class Jcr { public static final int DEFAULT_OBSERVATION_QUEUE_LENGTH = BackgroundObserver.DEFAULT_QUEUE_SIZE; + public static final int DEFAULT_MAX_STRING_PROPERTY_SIZE = 102400; private final Oak oak; @@ -93,6 +94,7 @@ public class Jcr { private Repository repository; private Clusterable clusterable; + private int maxStringPropertySize = DEFAULT_MAX_STRING_PROPERTY_SIZE; public Jcr(Oak oak, boolean initialize) { this.oak = oak; @@ -259,6 +261,13 @@ public Jcr withObservationQueueLength(int observationQueueLength) { return this; } + @NotNull + public Jcr withMaxStringPropertySize(int maxStringPropertySize) { + ensureRepositoryIsNotCreated(); + this.maxStringPropertySize = maxStringPropertySize; + return this; + } + @NotNull public Jcr with(@NotNull CommitRateLimiter commitRateLimiter) { ensureRepositoryIsNotCreated(); @@ -387,7 +396,8 @@ public Repository createRepository() { securityProvider, observationQueueLength, commitRateLimiter, - fastQueryResultSize); + fastQueryResultSize, + maxStringPropertySize); } return repository; } diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java index f6a93142976..2b98d43efd7 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java @@ -50,6 +50,7 @@ import org.apache.jackrabbit.oak.api.blob.BlobAccessProvider; import org.apache.jackrabbit.oak.api.jmx.SessionMBean; import org.apache.jackrabbit.oak.commons.concurrent.ExecutorCloser; +import org.apache.jackrabbit.oak.jcr.Jcr; import org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate; import org.apache.jackrabbit.oak.jcr.session.RefreshStrategy; import org.apache.jackrabbit.oak.jcr.session.RefreshStrategy.Composite; @@ -90,6 +91,7 @@ public class RepositoryImpl implements JackrabbitRepository { * @see OAK-1329 */ public static final String RELAXED_LOCKING = "oak.relaxed-locking"; + public static final String MAX_STRING_PROPERTY_SIZE = "oak.repository.property.maxStringSize"; /** * logger instance @@ -138,13 +140,29 @@ public RepositoryImpl(@NotNull ContentRepository contentRepository, this(contentRepository, whiteboard, securityProvider, observationQueueLength, commitRateLimiter, false); } - + public RepositoryImpl(@NotNull ContentRepository contentRepository, @NotNull Whiteboard whiteboard, @NotNull SecurityProvider securityProvider, int observationQueueLength, CommitRateLimiter commitRateLimiter, boolean fastQueryResultSize) { + this(contentRepository, + whiteboard, + securityProvider, + observationQueueLength, + commitRateLimiter, + fastQueryResultSize, + Jcr.DEFAULT_MAX_STRING_PROPERTY_SIZE); + } + + public RepositoryImpl(@NotNull ContentRepository contentRepository, + @NotNull Whiteboard whiteboard, + @NotNull SecurityProvider securityProvider, + int observationQueueLength, + CommitRateLimiter commitRateLimiter, + boolean fastQueryResultSize, + int maxStringPropertySize) { this.contentRepository = checkNotNull(contentRepository); this.whiteboard = checkNotNull(whiteboard); this.securityProvider = checkNotNull(securityProvider); @@ -157,6 +175,7 @@ public RepositoryImpl(@NotNull ContentRepository contentRepository, this.fastQueryResultSize = fastQueryResultSize; this.mountInfoProvider = WhiteboardUtils.getService(whiteboard, MountInfoProvider.class); this.blobAccessProvider = WhiteboardUtils.getService(whiteboard, BlobAccessProvider.class); + descriptors.put(MAX_STRING_PROPERTY_SIZE, new SimpleValueFactory().createValue(maxStringPropertySize), true, true); } //---------------------------------------------------------< Repository >--- diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java index 58f0b8e8353..d29a70b176e 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java @@ -85,6 +85,7 @@ import org.apache.jackrabbit.oak.jcr.delegate.PropertyDelegate; import org.apache.jackrabbit.oak.jcr.delegate.VersionManagerDelegate; import org.apache.jackrabbit.oak.jcr.lock.LockDeprecation; +import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl; import org.apache.jackrabbit.oak.jcr.session.operation.ItemOperation; import org.apache.jackrabbit.oak.jcr.session.operation.NodeOperation; import org.apache.jackrabbit.oak.jcr.version.VersionHistoryImpl; @@ -1379,6 +1380,11 @@ private Property internalSetProperty( final String oakName = getOakPathOrThrow(checkNotNull(jcrName)); final PropertyState state = createSingleState( oakName, value, Type.fromTag(value.getType(), false)); + long maxStringPropertyLength = sessionContext.getRepository().getDescriptorValue(RepositoryImpl.MAX_STRING_PROPERTY_SIZE).getLong(); + if (value.getType() == PropertyType.STRING && value.getString().length() >= maxStringPropertyLength) { + LOG.warn("String property {} having length:{} at path {} is larger than configured" + + " value: {}", jcrName, value.getString().length(), this.getPath(), maxStringPropertyLength); + } return perform(new ItemWriteOperation("internalSetProperty") { @Override public void checkPreconditions() throws RepositoryException { @@ -1414,7 +1420,13 @@ private Property internalSetProperty( if (values.length > MV_PROPERTY_WARN_THRESHOLD) { LOG.warn("Large multi valued property [{}/{}] detected ({} values).",dlg.getPath(), jcrName, values.length); } - + long maxStringPropertyLength = sessionContext.getRepository().getDescriptorValue(RepositoryImpl.MAX_STRING_PROPERTY_SIZE).getLong(); + for (Value value : values) { + if (value.getType() == PropertyType.STRING && value.getString().length() >= maxStringPropertyLength) { + LOG.warn("String property {} having length:{} at path {} is larger than configured" + + " value: {}", jcrName, value.getString().length(), this.getPath(), maxStringPropertyLength); + } + } return perform(new ItemWriteOperation("internalSetProperty") { @Override public void checkPreconditions() throws RepositoryException { diff --git a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/MaxStringPropertySizeTest.java b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/MaxStringPropertySizeTest.java new file mode 100644 index 00000000000..d5ab49b8e44 --- /dev/null +++ b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/MaxStringPropertySizeTest.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.oak.jcr; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.read.ListAppender; +import org.apache.jackrabbit.oak.fixture.NodeStoreFixture; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.LoggerFactory; + +import javax.jcr.Node; +import javax.jcr.Session; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * {@code MaxStringPropertySizeTest} checks if Warn log is bein added on adding + * large string properties + */ +public class MaxStringPropertySizeTest extends AbstractRepositoryTest { + private final static String testStringPropertyKey = "testStringPropertyKey"; + private final static String testLargeStringPropertyValue = "sadahdkhfkhfkhskfhskfhshfksdasdadda"; + private final static String testSmallStringPropertyValue = "sada"; + private final String nodeImplLogger = "org.apache.jackrabbit.oak.jcr.session.NodeImpl"; + private final String warnMessage = "String property {} having length:{} at path {} is larger than configured value: {}"; + private final int maxStringPropertySize = 20; + + public MaxStringPropertySizeTest(NodeStoreFixture fixture) { + super(fixture); + } + + ListAppender listAppender = null; + + @Before + public void loggingAppenderStart() { + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + listAppender = new ListAppender<>(); + listAppender.start(); + context.getLogger(nodeImplLogger).addAppender(listAppender); + } + + @After + public void loggingAppenderStop() { + listAppender.stop(); + } + + @Test + public void noWarnLogOnAddingSmallStringProperties() throws Exception { + Session s = getAdminSession(); + Node test = s.getRootNode().addNode("testSmall"); + test.setProperty(testStringPropertyKey, testSmallStringPropertyValue); + assertFalse(isWarnMessagePresent(listAppender)); + } + + @Test + public void warnLogOnAddingLargeStringProperties() throws Exception { + Session s = getAdminSession(); + Node test = s.getRootNode().addNode("testLarge"); + test.setProperty(testStringPropertyKey, testLargeStringPropertyValue); + assertTrue(isWarnMessagePresent(listAppender)); + } + + private boolean isWarnMessagePresent(ListAppender listAppender) { + for (ILoggingEvent loggingEvent : listAppender.list) { + if (loggingEvent.getMessage().contains(warnMessage)) { + return true; + } + } + return false; + } + + @Override + protected Jcr initJcr(Jcr jcr) { + return super.initJcr(jcr).withMaxStringPropertySize(maxStringPropertySize); + } +} From 56f255233f0ec13b5c95a38150a5706fc9ae88ed Mon Sep 17 00:00:00 2001 From: Mohit Kataria Date: Mon, 23 Sep 2019 14:32:35 +0530 Subject: [PATCH 3/6] OAK-8633: Add warn logs if we add/update a string property larger than 100KB --- .../oak/jcr/repository/RepositoryImpl.java | 5 +++- .../jackrabbit/oak/jcr/session/NodeImpl.java | 14 ++++++----- .../oak/jcr/session/SessionContext.java | 23 +++++++++++++++++++ 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java index 2b98d43efd7..962a428cf2a 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java @@ -128,6 +128,7 @@ public class RepositoryImpl implements JackrabbitRepository { createListeningScheduledExecutorService(); private final StatisticManager statisticManager; + private final int maxStringPropertySize; /** * Constructor used for backward compatibility. @@ -175,6 +176,7 @@ public RepositoryImpl(@NotNull ContentRepository contentRepository, this.fastQueryResultSize = fastQueryResultSize; this.mountInfoProvider = WhiteboardUtils.getService(whiteboard, MountInfoProvider.class); this.blobAccessProvider = WhiteboardUtils.getService(whiteboard, BlobAccessProvider.class); + this.maxStringPropertySize = maxStringPropertySize; descriptors.put(MAX_STRING_PROPERTY_SIZE, new SimpleValueFactory().createValue(maxStringPropertySize), true, true); } @@ -366,7 +368,8 @@ protected SessionContext createSessionContext( Map attributes, SessionDelegate delegate, int observationQueueLength, CommitRateLimiter commitRateLimiter) { return new SessionContext(this, statisticManager, securityProvider, whiteboard, attributes, - delegate, observationQueueLength, commitRateLimiter, mountInfoProvider, blobAccessProvider, fastQueryResultSize); + delegate, observationQueueLength, commitRateLimiter, mountInfoProvider, blobAccessProvider, + fastQueryResultSize, maxStringPropertySize); } /** diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java index d29a70b176e..fc94e9612d9 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java @@ -1380,10 +1380,11 @@ private Property internalSetProperty( final String oakName = getOakPathOrThrow(checkNotNull(jcrName)); final PropertyState state = createSingleState( oakName, value, Type.fromTag(value.getType(), false)); - long maxStringPropertyLength = sessionContext.getRepository().getDescriptorValue(RepositoryImpl.MAX_STRING_PROPERTY_SIZE).getLong(); - if (value.getType() == PropertyType.STRING && value.getString().length() >= maxStringPropertyLength) { + if (value.getType() == PropertyType.STRING + && value.getString().length() >= sessionContext.getMaxStringPropertySize()) { LOG.warn("String property {} having length:{} at path {} is larger than configured" + - " value: {}", jcrName, value.getString().length(), this.getPath(), maxStringPropertyLength); + " value: {}", jcrName, value.getString().length(), this.getPath(), + sessionContext.getMaxStringPropertySize()); } return perform(new ItemWriteOperation("internalSetProperty") { @Override @@ -1420,11 +1421,12 @@ private Property internalSetProperty( if (values.length > MV_PROPERTY_WARN_THRESHOLD) { LOG.warn("Large multi valued property [{}/{}] detected ({} values).",dlg.getPath(), jcrName, values.length); } - long maxStringPropertyLength = sessionContext.getRepository().getDescriptorValue(RepositoryImpl.MAX_STRING_PROPERTY_SIZE).getLong(); for (Value value : values) { - if (value.getType() == PropertyType.STRING && value.getString().length() >= maxStringPropertyLength) { + if (value.getType() == PropertyType.STRING + && value.getString().length() >= sessionContext.getMaxStringPropertySize()) { LOG.warn("String property {} having length:{} at path {} is larger than configured" + - " value: {}", jcrName, value.getString().length(), this.getPath(), maxStringPropertyLength); + " value: {}", jcrName, value.getString().length(), this.getPath(), + sessionContext.getMaxStringPropertySize()); } } return perform(new ItemWriteOperation("internalSetProperty") { diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java index 86e71e5ac33..1413018afb9 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java @@ -41,6 +41,7 @@ import org.apache.jackrabbit.api.security.user.UserManager; import org.apache.jackrabbit.api.stats.RepositoryStatistics.Type; import org.apache.jackrabbit.oak.api.blob.BlobAccessProvider; +import org.apache.jackrabbit.oak.jcr.Jcr; import org.apache.jackrabbit.oak.jcr.delegate.AccessControlManagerDelegator; import org.apache.jackrabbit.oak.jcr.delegate.JackrabbitAccessControlManagerDelegator; import org.apache.jackrabbit.oak.jcr.delegate.NodeDelegate; @@ -92,6 +93,7 @@ public class SessionContext implements NamePathMapper { private final SessionDelegate delegate; private final int observationQueueLength; private final CommitRateLimiter commitRateLimiter; + private final int maxStringPropertySize; private MountInfoProvider mountInfoProvider; private final NamePathMapper namePathMapper; @@ -133,6 +135,26 @@ public SessionContext( int observationQueueLength, CommitRateLimiter commitRateLimiter, MountInfoProvider mountInfoProvider, @Nullable BlobAccessProvider blobAccessProvider, boolean fastQueryResultSize) { + this(repository, + statisticManager, + securityProvider, whiteboard, + attributes, delegate, + observationQueueLength, commitRateLimiter, + mountInfoProvider, blobAccessProvider, + fastQueryResultSize, Jcr.DEFAULT_MAX_STRING_PROPERTY_SIZE); + } + + public int getMaxStringPropertySize() { + return maxStringPropertySize; + } + + public SessionContext( + @NotNull Repository repository, @NotNull StatisticManager statisticManager, + @NotNull SecurityProvider securityProvider, @NotNull Whiteboard whiteboard, + @NotNull Map attributes, @NotNull final SessionDelegate delegate, + int observationQueueLength, CommitRateLimiter commitRateLimiter, + MountInfoProvider mountInfoProvider, @Nullable BlobAccessProvider blobAccessProvider, + boolean fastQueryResultSize, int maxStringPropertySize) { this.repository = checkNotNull(repository); this.statisticManager = statisticManager; this.securityProvider = checkNotNull(securityProvider); @@ -151,6 +173,7 @@ public SessionContext( this.valueFactory = new ValueFactoryImpl( delegate.getRoot(), namePathMapper, this.blobAccessProvider); this.fastQueryResultSize = fastQueryResultSize; + this.maxStringPropertySize = maxStringPropertySize; } public final Map getAttributes() { From 0d22bad48e24d021623df3c8e346df61ade2eede Mon Sep 17 00:00:00 2001 From: Mohit Kataria Date: Mon, 23 Sep 2019 16:59:36 +0530 Subject: [PATCH 4/6] OAK-8633: Add warn logs if we add/update a string property larger than 100KB --- .../java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java index fc94e9612d9..73623fce138 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java @@ -1380,7 +1380,7 @@ private Property internalSetProperty( final String oakName = getOakPathOrThrow(checkNotNull(jcrName)); final PropertyState state = createSingleState( oakName, value, Type.fromTag(value.getType(), false)); - if (value.getType() == PropertyType.STRING + if (value != null && value.getType() == PropertyType.STRING && value.getString().length() >= sessionContext.getMaxStringPropertySize()) { LOG.warn("String property {} having length:{} at path {} is larger than configured" + " value: {}", jcrName, value.getString().length(), this.getPath(), @@ -1422,7 +1422,7 @@ private Property internalSetProperty( LOG.warn("Large multi valued property [{}/{}] detected ({} values).",dlg.getPath(), jcrName, values.length); } for (Value value : values) { - if (value.getType() == PropertyType.STRING + if (value != null && value.getType() == PropertyType.STRING && value.getString().length() >= sessionContext.getMaxStringPropertySize()) { LOG.warn("String property {} having length:{} at path {} is larger than configured" + " value: {}", jcrName, value.getString().length(), this.getPath(), From 5e57ce2d4d179c6d80f3b50f41759dc822b2038d Mon Sep 17 00:00:00 2001 From: Mohit Kataria Date: Mon, 23 Sep 2019 18:31:50 +0530 Subject: [PATCH 5/6] OAK-8633: Add warn logs if we add/update a string property larger than 100KB --- .../org/apache/jackrabbit/oak/jcr/Jcr.java | 18 +++++++++++++----- .../oak/jcr/repository/RepositoryImpl.java | 13 ++++++------- .../jackrabbit/oak/jcr/session/NodeImpl.java | 9 ++++----- .../oak/jcr/session/SessionContext.java | 12 ++++++------ ...java => WarnLogStringPropertySizeTest.java} | 10 +++++----- 5 files changed, 34 insertions(+), 28 deletions(-) rename oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/{MaxStringPropertySizeTest.java => WarnLogStringPropertySizeTest.java} (89%) diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java index a86f6fdd448..831f9c1d82e 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java @@ -66,7 +66,11 @@ */ public class Jcr { public static final int DEFAULT_OBSERVATION_QUEUE_LENGTH = BackgroundObserver.DEFAULT_QUEUE_SIZE; - public static final int DEFAULT_MAX_STRING_PROPERTY_SIZE = 102400; + + /* + Default string property size above which a warning will be logged + */ + public static final int DEFAULT_WARN_LOG_STRING_PROPERTY_SIZE = 102400; private final Oak oak; @@ -94,7 +98,11 @@ public class Jcr { private Repository repository; private Clusterable clusterable; - private int maxStringPropertySize = DEFAULT_MAX_STRING_PROPERTY_SIZE; + + /* + Log a warning if string property added is larger than warnLogStringPropertySize + */ + private int warnLogStringPropertySize = DEFAULT_WARN_LOG_STRING_PROPERTY_SIZE; public Jcr(Oak oak, boolean initialize) { this.oak = oak; @@ -262,9 +270,9 @@ public Jcr withObservationQueueLength(int observationQueueLength) { } @NotNull - public Jcr withMaxStringPropertySize(int maxStringPropertySize) { + public Jcr withWarnLogStringPropertySize(int warnLogStringPropertySize) { ensureRepositoryIsNotCreated(); - this.maxStringPropertySize = maxStringPropertySize; + this.warnLogStringPropertySize = warnLogStringPropertySize; return this; } @@ -397,7 +405,7 @@ public Repository createRepository() { observationQueueLength, commitRateLimiter, fastQueryResultSize, - maxStringPropertySize); + warnLogStringPropertySize); } return repository; } diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java index 962a428cf2a..ac3bd5512b8 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java @@ -91,7 +91,7 @@ public class RepositoryImpl implements JackrabbitRepository { * @see OAK-1329 */ public static final String RELAXED_LOCKING = "oak.relaxed-locking"; - public static final String MAX_STRING_PROPERTY_SIZE = "oak.repository.property.maxStringSize"; + public static final String WARN_LOG_STRING_PROPERTY_SIZE = "oak.repository.property.warnLogStringPropertySize"; /** * logger instance @@ -128,7 +128,7 @@ public class RepositoryImpl implements JackrabbitRepository { createListeningScheduledExecutorService(); private final StatisticManager statisticManager; - private final int maxStringPropertySize; + private final int warnLogStringPropertySize; /** * Constructor used for backward compatibility. @@ -154,7 +154,7 @@ public RepositoryImpl(@NotNull ContentRepository contentRepository, observationQueueLength, commitRateLimiter, fastQueryResultSize, - Jcr.DEFAULT_MAX_STRING_PROPERTY_SIZE); + Jcr.DEFAULT_WARN_LOG_STRING_PROPERTY_SIZE); } public RepositoryImpl(@NotNull ContentRepository contentRepository, @@ -163,7 +163,7 @@ public RepositoryImpl(@NotNull ContentRepository contentRepository, int observationQueueLength, CommitRateLimiter commitRateLimiter, boolean fastQueryResultSize, - int maxStringPropertySize) { + int warnLogStringPropertySize) { this.contentRepository = checkNotNull(contentRepository); this.whiteboard = checkNotNull(whiteboard); this.securityProvider = checkNotNull(securityProvider); @@ -176,8 +176,7 @@ public RepositoryImpl(@NotNull ContentRepository contentRepository, this.fastQueryResultSize = fastQueryResultSize; this.mountInfoProvider = WhiteboardUtils.getService(whiteboard, MountInfoProvider.class); this.blobAccessProvider = WhiteboardUtils.getService(whiteboard, BlobAccessProvider.class); - this.maxStringPropertySize = maxStringPropertySize; - descriptors.put(MAX_STRING_PROPERTY_SIZE, new SimpleValueFactory().createValue(maxStringPropertySize), true, true); + this.warnLogStringPropertySize = warnLogStringPropertySize; } //---------------------------------------------------------< Repository >--- @@ -369,7 +368,7 @@ protected SessionContext createSessionContext( CommitRateLimiter commitRateLimiter) { return new SessionContext(this, statisticManager, securityProvider, whiteboard, attributes, delegate, observationQueueLength, commitRateLimiter, mountInfoProvider, blobAccessProvider, - fastQueryResultSize, maxStringPropertySize); + fastQueryResultSize, warnLogStringPropertySize); } /** diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java index 73623fce138..4ec75d47a36 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java @@ -85,7 +85,6 @@ import org.apache.jackrabbit.oak.jcr.delegate.PropertyDelegate; import org.apache.jackrabbit.oak.jcr.delegate.VersionManagerDelegate; import org.apache.jackrabbit.oak.jcr.lock.LockDeprecation; -import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl; import org.apache.jackrabbit.oak.jcr.session.operation.ItemOperation; import org.apache.jackrabbit.oak.jcr.session.operation.NodeOperation; import org.apache.jackrabbit.oak.jcr.version.VersionHistoryImpl; @@ -1381,10 +1380,10 @@ private Property internalSetProperty( final PropertyState state = createSingleState( oakName, value, Type.fromTag(value.getType(), false)); if (value != null && value.getType() == PropertyType.STRING - && value.getString().length() >= sessionContext.getMaxStringPropertySize()) { + && value.getString().length() >= sessionContext.getWarnLogStringPropertySize()) { LOG.warn("String property {} having length:{} at path {} is larger than configured" + " value: {}", jcrName, value.getString().length(), this.getPath(), - sessionContext.getMaxStringPropertySize()); + sessionContext.getWarnLogStringPropertySize()); } return perform(new ItemWriteOperation("internalSetProperty") { @Override @@ -1423,10 +1422,10 @@ private Property internalSetProperty( } for (Value value : values) { if (value != null && value.getType() == PropertyType.STRING - && value.getString().length() >= sessionContext.getMaxStringPropertySize()) { + && value.getString().length() >= sessionContext.getWarnLogStringPropertySize()) { LOG.warn("String property {} having length:{} at path {} is larger than configured" + " value: {}", jcrName, value.getString().length(), this.getPath(), - sessionContext.getMaxStringPropertySize()); + sessionContext.getWarnLogStringPropertySize()); } } return perform(new ItemWriteOperation("internalSetProperty") { diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java index 1413018afb9..6fb0d5d24d3 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java @@ -93,7 +93,7 @@ public class SessionContext implements NamePathMapper { private final SessionDelegate delegate; private final int observationQueueLength; private final CommitRateLimiter commitRateLimiter; - private final int maxStringPropertySize; + private final int warnLogStringPropertySize; private MountInfoProvider mountInfoProvider; private final NamePathMapper namePathMapper; @@ -141,11 +141,11 @@ public SessionContext( attributes, delegate, observationQueueLength, commitRateLimiter, mountInfoProvider, blobAccessProvider, - fastQueryResultSize, Jcr.DEFAULT_MAX_STRING_PROPERTY_SIZE); + fastQueryResultSize, Jcr.DEFAULT_WARN_LOG_STRING_PROPERTY_SIZE); } - public int getMaxStringPropertySize() { - return maxStringPropertySize; + public int getWarnLogStringPropertySize() { + return warnLogStringPropertySize; } public SessionContext( @@ -154,7 +154,7 @@ public SessionContext( @NotNull Map attributes, @NotNull final SessionDelegate delegate, int observationQueueLength, CommitRateLimiter commitRateLimiter, MountInfoProvider mountInfoProvider, @Nullable BlobAccessProvider blobAccessProvider, - boolean fastQueryResultSize, int maxStringPropertySize) { + boolean fastQueryResultSize, int warnLogStringPropertySize) { this.repository = checkNotNull(repository); this.statisticManager = statisticManager; this.securityProvider = checkNotNull(securityProvider); @@ -173,7 +173,7 @@ public SessionContext( this.valueFactory = new ValueFactoryImpl( delegate.getRoot(), namePathMapper, this.blobAccessProvider); this.fastQueryResultSize = fastQueryResultSize; - this.maxStringPropertySize = maxStringPropertySize; + this.warnLogStringPropertySize = warnLogStringPropertySize; } public final Map getAttributes() { diff --git a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/MaxStringPropertySizeTest.java b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/WarnLogStringPropertySizeTest.java similarity index 89% rename from oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/MaxStringPropertySizeTest.java rename to oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/WarnLogStringPropertySizeTest.java index d5ab49b8e44..6df5ffc5527 100644 --- a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/MaxStringPropertySizeTest.java +++ b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/WarnLogStringPropertySizeTest.java @@ -32,18 +32,18 @@ import static org.junit.Assert.assertTrue; /** - * {@code MaxStringPropertySizeTest} checks if Warn log is bein added on adding + * {@code WarnLogStringPropertySizeTest} checks if Warn log is bein added on adding * large string properties */ -public class MaxStringPropertySizeTest extends AbstractRepositoryTest { +public class WarnLogStringPropertySizeTest extends AbstractRepositoryTest { private final static String testStringPropertyKey = "testStringPropertyKey"; private final static String testLargeStringPropertyValue = "sadahdkhfkhfkhskfhskfhshfksdasdadda"; private final static String testSmallStringPropertyValue = "sada"; private final String nodeImplLogger = "org.apache.jackrabbit.oak.jcr.session.NodeImpl"; private final String warnMessage = "String property {} having length:{} at path {} is larger than configured value: {}"; - private final int maxStringPropertySize = 20; + private final int warnLogStringPropertySize = 20; - public MaxStringPropertySizeTest(NodeStoreFixture fixture) { + public WarnLogStringPropertySizeTest(NodeStoreFixture fixture) { super(fixture); } @@ -89,6 +89,6 @@ private boolean isWarnMessagePresent(ListAppender listAppender) { @Override protected Jcr initJcr(Jcr jcr) { - return super.initJcr(jcr).withMaxStringPropertySize(maxStringPropertySize); + return super.initJcr(jcr).withWarnLogStringPropertySize(warnLogStringPropertySize); } } From 07d067995608973918b8312e3989124c9342c550 Mon Sep 17 00:00:00 2001 From: Mohit Kataria Date: Mon, 23 Sep 2019 18:35:49 +0530 Subject: [PATCH 6/6] OAK-8633: Add warn logs if we add/update a string property larger than 100KB --- .../org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java index ac3bd5512b8..a0d24222987 100644 --- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java +++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java @@ -91,7 +91,6 @@ public class RepositoryImpl implements JackrabbitRepository { * @see OAK-1329 */ public static final String RELAXED_LOCKING = "oak.relaxed-locking"; - public static final String WARN_LOG_STRING_PROPERTY_SIZE = "oak.repository.property.warnLogStringPropertySize"; /** * logger instance