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

asalamon74 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 0525708  SOLR-15301: Eliminate repetitive index size calculation for 
Solr metrics
0525708 is described below

commit 052570895021f337c8a4892e3d26f8d3f07543f6
Author: Andras Salamon <[email protected]>
AuthorDate: Thu Sep 30 15:05:15 2021 +0200

    SOLR-15301: Eliminate repetitive index size calculation for Solr metrics
---
 solr/CHANGES.txt                                   |  2 ++
 .../src/java/org/apache/solr/core/SolrCore.java    | 25 ++++++++++++++++++++--
 .../apache/solr/handler/ReplicationHandler.java    |  2 +-
 .../apache/solr/handler/admin/MetricsHandler.java  |  1 +
 4 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index f048534..2cdfa64 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -154,6 +154,8 @@ when told to. The admin UI now tells it to. (Nazerke 
Seidan, David Smiley)
   for an HTTP proxy.  This is only for the Apache HttpClient based SolrJ 
communication, not Jetty.
   (Shawn Heisey, David Smiley)
 
+* SOLR-15301: Eliminate repetitive index size calculation for Solr metrics 
(Andras Salamon)
+
 Build
 ---------------------
 
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java 
b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index 9275c9a..79a78a6 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -470,6 +470,8 @@ public final class SolrCore implements SolrInfoBean, 
Closeable {
     return indexReaderFactory;
   }
 
+  private ThreadLocal<Long> indexSize = new ThreadLocal<>();
+
   public long getIndexSize() {
     Directory dir;
     long size = 0;
@@ -488,6 +490,25 @@ public final class SolrCore implements SolrInfoBean, 
Closeable {
     return size;
   }
 
+  public long getCachedIndexSize() {
+    if (indexSize.get() == null) {
+      if (log.isDebugEnabled()) {
+        log.debug("Recalculating index size for {}", getName());
+      }
+      indexSize.set(getIndexSize());
+    } else if (log.isDebugEnabled()) {
+      log.debug("reusing previous index size for {}", getName());
+    }
+    return indexSize.get();
+  }
+
+  public void clearIndexSizeCache() {
+    if (log.isDebugEnabled()) {
+      log.debug("Clearing index size cache for {}", getName());
+    }
+    indexSize.remove();
+  }
+
   public int getSegmentCount() {
     try {
       return withSearcher( solrIndexSearcher -> 
solrIndexSearcher.getRawReader().getIndexCommit().getSegmentCount());
@@ -1209,9 +1230,9 @@ public final class SolrCore implements SolrInfoBean, 
Closeable {
     parentContext.gauge(() -> getOpenCount(), true, "refCount", 
Category.CORE.toString());
     parentContext.gauge(() -> getInstancePath().toString(), true, 
"instanceDir", Category.CORE.toString());
     parentContext.gauge(() -> isClosed() ? parentContext.nullString() : 
getIndexDir(), true, "indexDir", Category.CORE.toString());
-    parentContext.gauge(() -> isClosed() ? parentContext.nullNumber() : 
getIndexSize(), true, "sizeInBytes", Category.INDEX.toString());
+    parentContext.gauge(() -> isClosed() ? parentContext.nullNumber() : 
getCachedIndexSize(), true, "sizeInBytes", Category.INDEX.toString());
     parentContext.gauge(() -> isClosed() ? parentContext.nullNumber() : 
getSegmentCount(), true, "segments", Category.INDEX.toString());
-    parentContext.gauge(() -> isClosed() ? parentContext.nullString() : 
NumberUtils.readableSize(getIndexSize()), true, "size", 
Category.INDEX.toString());
+    parentContext.gauge(() -> isClosed() ? parentContext.nullString() : 
NumberUtils.readableSize(getCachedIndexSize()), true, "size", 
Category.INDEX.toString());
 
     final CloudDescriptor cd = getCoreDescriptor().getCloudDescriptor();
     if (cd != null) {
diff --git a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java 
b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
index 71fe0f4..c8746f7 100644
--- a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
@@ -886,7 +886,7 @@ public class ReplicationHandler extends RequestHandlerBase 
implements SolrCoreAw
   @Override
   public void initializeMetrics(SolrMetricsContext parentContext, String 
scope) {
     super.initializeMetrics(parentContext, scope);
-    solrMetricsContext.gauge(() -> (core != null && !core.isClosed() ? 
NumberUtils.readableSize(core.getIndexSize()) : parentContext.nullString()),
+    solrMetricsContext.gauge(() -> (core != null && !core.isClosed() ? 
NumberUtils.readableSize(core.getCachedIndexSize()) : 
parentContext.nullString()),
         true, "indexSize", getCategory().toString(), scope);
     solrMetricsContext.gauge(() -> (core != null && !core.isClosed() ? 
getIndexVersion().toString() : parentContext.nullString()),
          true, "indexVersion", getCategory().toString(), scope);
diff --git 
a/solr/core/src/java/org/apache/solr/handler/admin/MetricsHandler.java 
b/solr/core/src/java/org/apache/solr/handler/admin/MetricsHandler.java
index 52d90f9..b46fbf5 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/MetricsHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/MetricsHandler.java
@@ -117,6 +117,7 @@ public class MetricsHandler extends RequestHandlerBase 
implements PermissionName
       consumer.accept("error", "metrics collection is disabled");
       return;
     }
+    cc.getCores().forEach((core) -> core.clearIndexSizeCache());
     boolean compact = params.getBool(COMPACT_PARAM, true);
     String[] keys = params.getParams(KEY_PARAM);
     if (keys != null && keys.length > 0) {

Reply via email to