This is an automated email from the ASF dual-hosted git repository.

thomasm pushed a commit to branch OAK-11025-b
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit 7a884dff45d2bea13885a595f8b7043442009986
Author: Thomas Mueller <[email protected]>
AuthorDate: Fri Aug 16 15:37:24 2024 +0200

    OAK-11025 Silence more warnings for ordered properties
---
 oak-commons/pom.xml                                |  1 +
 .../jackrabbit/oak/commons/log}/LogSilencer.java   |  2 +-
 .../jackrabbit/oak/commons/log/package-info.java   | 26 +++++++++++
 .../oak/commons/log}/LogSilencerTest.java          |  2 +-
 .../plugins/index/lucene/LuceneDocumentMaker.java  | 52 ++++++++++++++++------
 .../oak/plugins/document/NodeDocument.java         | 38 ++++++++--------
 .../oak/plugins/document/SplitDocumentCleanUp.java | 13 +++---
 7 files changed, 92 insertions(+), 42 deletions(-)

diff --git a/oak-commons/pom.xml b/oak-commons/pom.xml
index e0b1cbc186..14d3e8e929 100644
--- a/oak-commons/pom.xml
+++ b/oak-commons/pom.xml
@@ -51,6 +51,7 @@
               org.apache.jackrabbit.oak.commons.concurrent,
               org.apache.jackrabbit.oak.commons.io,
               org.apache.jackrabbit.oak.commons.json,
+              org.apache.jackrabbit.oak.commons.log,
               org.apache.jackrabbit.oak.commons.sort,
               org.apache.jackrabbit.oak.commons.properties
             </Export-Package>
diff --git 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LogSilencer.java
 
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/log/LogSilencer.java
similarity index 98%
rename from 
oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LogSilencer.java
rename to 
oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/log/LogSilencer.java
index d05d9e12ab..4ed3f3b543 100644
--- 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/LogSilencer.java
+++ 
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/log/LogSilencer.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.jackrabbit.oak.plugins.document.util;
+package org.apache.jackrabbit.oak.commons.log;
 
 import java.time.Duration;
 import java.util.Collections;
diff --git 
a/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/log/package-info.java
 
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/log/package-info.java
new file mode 100644
index 0000000000..4da92d131a
--- /dev/null
+++ 
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/log/package-info.java
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+/**
+ * <em>For Oak internal use only. Do not use outside Oak components.</em>
+ */
+@Internal(since = "1.0.0")
+@Version("1.0.0")
+package org.apache.jackrabbit.oak.commons.log;
+
+import org.osgi.annotation.versioning.Version;
+import org.apache.jackrabbit.oak.commons.annotations.Internal;
+
diff --git 
a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/util/LogSilencerTest.java
 
b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/log/LogSilencerTest.java
similarity index 98%
rename from 
oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/util/LogSilencerTest.java
rename to 
oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/log/LogSilencerTest.java
index 4502031511..0caa3693c3 100644
--- 
a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/util/LogSilencerTest.java
+++ 
b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/log/LogSilencerTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.jackrabbit.oak.plugins.document.util;
+package org.apache.jackrabbit.oak.commons.log;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
diff --git 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneDocumentMaker.java
 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneDocumentMaker.java
index 2be705154e..505efa27ce 100644
--- 
a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneDocumentMaker.java
+++ 
b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneDocumentMaker.java
@@ -21,6 +21,7 @@ package org.apache.jackrabbit.oak.plugins.index.lucene;
 
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -29,6 +30,7 @@ import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.commons.log.LogSilencer;
 import 
org.apache.jackrabbit.oak.plugins.index.lucene.util.FacetsConfigProvider;
 import org.apache.jackrabbit.oak.plugins.index.search.Aggregate;
 import org.apache.jackrabbit.oak.plugins.index.search.FieldNames;
@@ -60,14 +62,14 @@ public class LuceneDocumentMaker extends 
FulltextDocumentMaker<Document> {
 
     private static final String DYNAMIC_BOOST_SPLIT_REGEX = "[:/]";
     
-    // warn once every 10 seconds at most
-    private static final long DUPLICATE_WARNING_INTERVAL_MS = 10 * 1000;
-
     private final FacetsConfigProvider facetsConfigProvider;
     private final IndexAugmentorFactory augmentorFactory;
     
-    // when did we warn (static, as we construct new objects quite often)
-    private static long lastDuplicateWarning;
+    private static final LogSilencer LOG_SILENCER = new 
LogSilencer(Duration.ofSeconds(10).toMillis(), 10);
+    private static final String LOG_KEY_DUPLICATE = "Duplicate value";
+    private static final String LOG_KEY_NOT_A_DATE_STRING = "Not a date 
string";
+    private static final String LOG_KEY_UNABLE_TO_PARSE = "Unable to parse the 
provided date field";
+    private static final String LOG_KEY_FOR_INPUT_STRING = "For input string";
 
     public LuceneDocumentMaker(IndexDefinition definition,
                                IndexDefinition.IndexingRule indexingRule,
@@ -299,19 +301,43 @@ public class LuceneDocumentMaker extends 
FulltextDocumentMaker<Document> {
                     doc.add(f);
                     fieldAdded = true;
                 } else {
-                    long now = System.currentTimeMillis();
-                    if (now > lastDuplicateWarning + 
DUPLICATE_WARNING_INTERVAL_MS) {
+                    if (!LOG_SILENCER.silence(LOG_KEY_DUPLICATE)) {
                         log.warn("Duplicate value for ordered field {}; 
ignoring. Possibly duplicate index definition.", f.name());
-                        lastDuplicateWarning = now;
                     }
                 }
             }
         } catch (Exception e) {
-            log.warn(
-                    "[{}] Ignoring ordered property. Could not convert 
property {} of type {} to type {} for path {}",
-                    getIndexName(), pname,
-                    Type.fromTag(property.getType().tag(), false),
-                    Type.fromTag(tag, false), path, e);
+            String message = e.getMessage();
+            String key = null;
+            // This is a known warning, one of:
+            // - IllegalArgumentException: Not a date string
+            // - RuntimeException: Unable to parse the provided date field
+            // - NumberFormatException: For input string
+            // For these we do not log a stack trace, and we only log once 
every 10 seconds
+            // (the location of the code can be found if needed, as it's in 
Oak)
+            if (message.startsWith("Not a date string")) {
+                key = LOG_KEY_NOT_A_DATE_STRING;
+            } else if (message.startsWith("Unable to parse the provided date 
field")) {
+                key = LOG_KEY_UNABLE_TO_PARSE;
+            } else if (message.startsWith("For input string")) {
+                key = LOG_KEY_FOR_INPUT_STRING;
+            }
+            if (key != null) {
+                if (!LOG_SILENCER.silence(key)) {
+                    // log without stack trace (as it is known)
+                    log.warn(
+                            "[{}] Ignoring ordered property. Could not convert 
property {} of type {} to type {} for path {}, message {}",
+                            getIndexName(), pname,
+                            Type.fromTag(property.getType().tag(), false),
+                            Type.fromTag(tag, false), path, e.getMessage());
+                }
+            } else {
+                log.warn(
+                        "[{}] Ignoring ordered property. Could not convert 
property {} of type {} to type {} for path {}",
+                        getIndexName(), pname,
+                        Type.fromTag(property.getType().tag(), false),
+                        Type.fromTag(tag, false), path, e);
+            }
         }
         return fieldAdded;
     }
diff --git 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
index 92218b0ab3..7c1da65208 100644
--- 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
+++ 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java
@@ -16,6 +16,20 @@
  */
 package org.apache.jackrabbit.oak.plugins.document;
 
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toSet;
+import static 
org.apache.jackrabbit.guava.common.base.Preconditions.checkArgument;
+import static org.apache.jackrabbit.guava.common.collect.ImmutableList.copyOf;
+import static org.apache.jackrabbit.guava.common.collect.Iterables.filter;
+import static org.apache.jackrabbit.guava.common.collect.Iterables.mergeSorted;
+import static org.apache.jackrabbit.guava.common.collect.Iterables.transform;
+import static org.apache.jackrabbit.oak.plugins.document.Collection.NODES;
+import static 
org.apache.jackrabbit.oak.plugins.document.StableRevisionComparator.REVERSE;
+import static 
org.apache.jackrabbit.oak.plugins.document.util.Utils.abortingIterable;
+import static 
org.apache.jackrabbit.oak.plugins.document.util.Utils.resolveCommitRevision;
+import static org.apache.jackrabbit.oak.plugins.document.UpdateOp.Key;
+import static org.apache.jackrabbit.oak.plugins.document.UpdateOp.Operation;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -39,42 +53,26 @@ import java.util.function.Predicate;
 
 import org.apache.jackrabbit.guava.common.collect.AbstractIterator;
 import org.apache.jackrabbit.guava.common.collect.ImmutableList;
+import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.guava.common.collect.Lists;
+import org.apache.jackrabbit.guava.common.collect.Maps;
 import org.apache.jackrabbit.guava.common.collect.Ordering;
 import org.apache.jackrabbit.guava.common.collect.Queues;
+import org.apache.jackrabbit.guava.common.collect.Sets;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.commons.json.JsopBuilder;
 import org.apache.jackrabbit.oak.commons.json.JsopReader;
 import org.apache.jackrabbit.oak.commons.json.JsopTokenizer;
 import org.apache.jackrabbit.oak.commons.json.JsopWriter;
+import org.apache.jackrabbit.oak.commons.log.LogSilencer;
 import org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore;
-import org.apache.jackrabbit.oak.plugins.document.util.LogSilencer;
 import org.apache.jackrabbit.oak.plugins.document.util.Utils;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.jackrabbit.guava.common.collect.Iterables;
-import org.apache.jackrabbit.guava.common.collect.Maps;
-import org.apache.jackrabbit.guava.common.collect.Sets;
-
-import static java.util.Objects.requireNonNull;
-import static java.util.stream.Collectors.toSet;
-
-import static 
org.apache.jackrabbit.guava.common.base.Preconditions.checkArgument;
-import static org.apache.jackrabbit.guava.common.collect.ImmutableList.copyOf;
-import static org.apache.jackrabbit.guava.common.collect.Iterables.filter;
-import static org.apache.jackrabbit.guava.common.collect.Iterables.mergeSorted;
-import static org.apache.jackrabbit.guava.common.collect.Iterables.transform;
-import static org.apache.jackrabbit.oak.plugins.document.Collection.NODES;
-import static 
org.apache.jackrabbit.oak.plugins.document.StableRevisionComparator.REVERSE;
-import static org.apache.jackrabbit.oak.plugins.document.UpdateOp.Key;
-import static org.apache.jackrabbit.oak.plugins.document.UpdateOp.Operation;
-import static 
org.apache.jackrabbit.oak.plugins.document.util.Utils.abortingIterable;
-import static 
org.apache.jackrabbit.oak.plugins.document.util.Utils.resolveCommitRevision;
-
 /**
  * A document storing data about a node.
  */
diff --git 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/SplitDocumentCleanUp.java
 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/SplitDocumentCleanUp.java
index b72b83f8e0..ecfe5ae124 100644
--- 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/SplitDocumentCleanUp.java
+++ 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/SplitDocumentCleanUp.java
@@ -16,23 +16,22 @@
  */
 package org.apache.jackrabbit.oak.plugins.document;
 
+import static 
org.apache.jackrabbit.guava.common.base.Preconditions.checkArgument;
+import static org.apache.jackrabbit.oak.plugins.document.Collection.NODES;
+import static 
org.apache.jackrabbit.oak.plugins.document.NodeDocument.SplitDocType.INTERMEDIATE;
+import static 
org.apache.jackrabbit.oak.plugins.document.NodeDocument.SplitDocType.NONE;
+
 import java.io.Closeable;
 import java.io.IOException;
 import java.util.List;
 
 import org.apache.jackrabbit.guava.common.collect.Lists;
-
+import org.apache.jackrabbit.oak.commons.log.LogSilencer;
 import 
org.apache.jackrabbit.oak.plugins.document.VersionGarbageCollector.VersionGCStats;
-import org.apache.jackrabbit.oak.plugins.document.util.LogSilencer;
 import org.apache.jackrabbit.oak.plugins.document.util.Utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static 
org.apache.jackrabbit.guava.common.base.Preconditions.checkArgument;
-import static org.apache.jackrabbit.oak.plugins.document.Collection.NODES;
-import static 
org.apache.jackrabbit.oak.plugins.document.NodeDocument.SplitDocType.INTERMEDIATE;
-import static 
org.apache.jackrabbit.oak.plugins.document.NodeDocument.SplitDocType.NONE;
-
 /**
  * Implements a split document cleanup.
  */

Reply via email to