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 36f5e41 SOLR-15301: Eliminate repetitive index size calculation for
Solr metrics
36f5e41 is described below
commit 36f5e4155dd2327416b9c0519e8d5ff48781fce7
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 74980ec..0200899 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -157,6 +157,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) {