You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ma...@apache.org on 2023/12/08 21:21:15 UTC

(solr) branch main updated: SOLR-17063: Do not retain log param references in LogWatcher (#2058)

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

magibney pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 6b74f86fc46 SOLR-17063: Do not retain log param references in LogWatcher (#2058)
6b74f86fc46 is described below

commit 6b74f86fc46cbac8e5e4278597de9e3a7334849c
Author: Michael Gibney <mi...@michaelgibney.net>
AuthorDate: Fri Dec 8 16:21:09 2023 -0500

    SOLR-17063: Do not retain log param references in LogWatcher (#2058)
---
 solr/CHANGES.txt                                   |  2 ++
 .../java/org/apache/solr/logging/LogWatcher.java   | 24 ++++++++++++++--------
 .../org/apache/solr/logging/jul/JulWatcher.java    |  5 -----
 .../apache/solr/logging/log4j2/Log4j2Watcher.java  |  7 +------
 4 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 68d6924b608..e0896a29a28 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -123,6 +123,8 @@ Improvements
 
 * SOLR-16577: Ensure core load failures are always logged. (Haythem Khiri, David Smiley)
 
+* SOLR-17063: Do not retain log param references in LogWatcher (Michael Gibney)
+
 Optimizations
 ---------------------
 * SOLR-17084: LBSolrClient (used by CloudSolrClient) now returns the count of core tracked as not live AKA zombies
diff --git a/solr/core/src/java/org/apache/solr/logging/LogWatcher.java b/solr/core/src/java/org/apache/solr/logging/LogWatcher.java
index e023d99d0c6..86ca1b86dbd 100644
--- a/solr/core/src/java/org/apache/solr/logging/LogWatcher.java
+++ b/solr/core/src/java/org/apache/solr/logging/LogWatcher.java
@@ -18,6 +18,8 @@ package org.apache.solr.logging;
 
 import java.lang.invoke.MethodHandles;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -38,7 +40,7 @@ public abstract class LogWatcher<E> {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  protected CircularList<E> history;
+  protected CircularList<SolrDocument> history;
   protected long last = -1;
 
   /**
@@ -64,10 +66,18 @@ public abstract class LogWatcher<E> {
   public abstract String getThreshold();
 
   public void add(E event, long timstamp) {
-    history.add(event);
+    history.add(unmodifiable(toSolrDocument(event)));
     last = timstamp;
   }
 
+  /**
+   * Since we store the derivative {@link SolrDocument} instances and potentially return the same
+   * instance to multiple callers, we should guard against modification.
+   */
+  private static SolrDocument unmodifiable(SolrDocument doc) {
+    return new SolrDocument(Collections.unmodifiableMap(doc.getFieldValueMap()));
+  }
+
   public long getLastEvent() {
     return last;
   }
@@ -82,25 +92,23 @@ public abstract class LogWatcher<E> {
     }
 
     SolrDocumentList docs = new SolrDocumentList();
-    Iterator<E> iter = history.iterator();
+    Iterator<SolrDocument> iter = history.iterator();
     while (iter.hasNext()) {
-      E e = iter.next();
-      long ts = getTimestamp(e);
+      SolrDocument logEventEntry = iter.next();
+      long ts = ((Date) logEventEntry.getFirstValue("time")).getTime();
       if (ts == since) {
         if (found != null) {
           found.set(true);
         }
       }
       if (ts > since) {
-        docs.add(toSolrDocument(e));
+        docs.add(logEventEntry);
       }
     }
     docs.setNumFound(docs.size()); // make it not look too funny
     return docs;
   }
 
-  public abstract long getTimestamp(E event);
-
   public abstract SolrDocument toSolrDocument(E event);
 
   public abstract void registerListener(ListenerConfig cfg);
diff --git a/solr/core/src/java/org/apache/solr/logging/jul/JulWatcher.java b/solr/core/src/java/org/apache/solr/logging/jul/JulWatcher.java
index c025ef59df0..271e1358fd1 100644
--- a/solr/core/src/java/org/apache/solr/logging/jul/JulWatcher.java
+++ b/solr/core/src/java/org/apache/solr/logging/jul/JulWatcher.java
@@ -144,11 +144,6 @@ public class JulWatcher extends LogWatcher<LogRecord> {
     log.addHandler(handler);
   }
 
-  @Override
-  public long getTimestamp(LogRecord event) {
-    return event.getMillis();
-  }
-
   @Override
   public SolrDocument toSolrDocument(LogRecord event) {
     SolrDocument doc = new SolrDocument();
diff --git a/solr/core/src/java/org/apache/solr/logging/log4j2/Log4j2Watcher.java b/solr/core/src/java/org/apache/solr/logging/log4j2/Log4j2Watcher.java
index e5ecc60bccf..9e266baa5ad 100644
--- a/solr/core/src/java/org/apache/solr/logging/log4j2/Log4j2Watcher.java
+++ b/solr/core/src/java/org/apache/solr/logging/log4j2/Log4j2Watcher.java
@@ -261,7 +261,7 @@ public class Log4j2Watcher extends LogWatcher<LogEvent> {
   public void registerListener(ListenerConfig cfg) {
     if (history != null) throw new IllegalStateException("History already registered");
 
-    history = new CircularList<LogEvent>(cfg.size);
+    history = new CircularList<>(cfg.size);
 
     Level threshold = (cfg.threshold != null) ? Level.toLevel(cfg.threshold) : Level.WARN;
     ThresholdFilter filter =
@@ -281,11 +281,6 @@ public class Log4j2Watcher extends LogWatcher<LogEvent> {
     ctx.updateLoggers();
   }
 
-  @Override
-  public long getTimestamp(LogEvent event) {
-    return event.getTimeMillis();
-  }
-
   @Override
   public SolrDocument toSolrDocument(LogEvent event) {
     SolrDocument doc = new SolrDocument();