You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2017/08/15 09:33:18 UTC

lucene-solr:branch_7x: SOLR-11235: Some SolrCore metrics should check if core is closed before reporting.

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_7x d1a620b57 -> 814d4fb23


SOLR-11235: Some SolrCore metrics should check if core is closed before reporting.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/814d4fb2
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/814d4fb2
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/814d4fb2

Branch: refs/heads/branch_7x
Commit: 814d4fb23e4fe9bbf2d3dc49a26c5f7a1cf4bbeb
Parents: d1a620b
Author: Andrzej Bialecki <ab...@apache.org>
Authored: Tue Aug 15 11:32:24 2017 +0200
Committer: Andrzej Bialecki <ab...@apache.org>
Committed: Tue Aug 15 11:33:11 2017 +0200

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  2 ++
 .../src/java/org/apache/solr/core/SolrCore.java | 25 +++++++-------
 .../metrics/reporters/SolrJmxReporterTest.java  | 36 ++++++++++++++++++++
 3 files changed, 51 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/814d4fb2/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 01ccd24..d067cdb 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -439,6 +439,8 @@ Bug Fixes
 * SOLR-11221: SolrJmxReporter broken on core reload. This resulted in some or most metrics not being reported
   via JMX after core reloads, depending on timing. (ab)
 
+* SOLR-11235: Some SolrCore metrics should check if core is closed before reporting. (ab)
+
 Optimizations
 ----------------------
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/814d4fb2/solr/core/src/java/org/apache/solr/core/SolrCore.java
----------------------------------------------------------------------
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 641d1a1..53708f1 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -1133,9 +1133,9 @@ public final class SolrCore implements SolrInfoBean, SolrMetricProducer, Closeab
     manager.registerGauge(this, registry, () -> startTime, true, "startTime", Category.CORE.toString());
     manager.registerGauge(this, registry, () -> getOpenCount(), true, "refCount", Category.CORE.toString());
     manager.registerGauge(this, registry, () -> resourceLoader.getInstancePath().toString(), true, "instanceDir", Category.CORE.toString());
-    manager.registerGauge(this, registry, () -> getIndexDir(), true, "indexDir", Category.CORE.toString());
-    manager.registerGauge(this, registry, () -> getIndexSize(), true, "sizeInBytes", Category.INDEX.toString());
-    manager.registerGauge(this, registry, () -> NumberUtils.readableSize(getIndexSize()), true, "size", Category.INDEX.toString());
+    manager.registerGauge(this, registry, () -> isClosed() ? "(closed)" : getIndexDir(), true, "indexDir", Category.CORE.toString());
+    manager.registerGauge(this, registry, () -> isClosed() ? 0 : getIndexSize(), true, "sizeInBytes", Category.INDEX.toString());
+    manager.registerGauge(this, registry, () -> isClosed() ? "(closed)" : NumberUtils.readableSize(getIndexSize()), true, "size", Category.INDEX.toString());
     if (coreContainer != null) {
       manager.registerGauge(this, registry, () -> coreContainer.getNamesForCore(this), true, "aliases", Category.CORE.toString());
       final CloudDescriptor cd = getCoreDescriptor().getCloudDescriptor();
@@ -1488,6 +1488,16 @@ public final class SolrCore implements SolrInfoBean, SolrMetricProducer, Closeab
     }
     log.info(logid+" CLOSING SolrCore " + this);
 
+    // stop reporting metrics
+    try {
+      coreMetricManager.close();
+    } catch (Throwable e) {
+      SolrException.log(log, e);
+      if (e instanceof  Error) {
+        throw (Error) e;
+      }
+    }
+
     if( closeHooks != null ) {
        for( CloseHook hook : closeHooks ) {
          try {
@@ -1586,15 +1596,6 @@ public final class SolrCore implements SolrInfoBean, SolrMetricProducer, Closeab
       }
     }
 
-    try {
-      coreMetricManager.close();
-    } catch (Throwable e) {
-      SolrException.log(log, e);
-      if (e instanceof  Error) {
-        throw (Error) e;
-      }
-    }
-
     // Close the snapshots meta-data directory.
     Directory snapshotsDir = snapshotMgr.getSnapshotsDir();
     try {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/814d4fb2/solr/core/src/test/org/apache/solr/metrics/reporters/SolrJmxReporterTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/metrics/reporters/SolrJmxReporterTest.java b/solr/core/src/test/org/apache/solr/metrics/reporters/SolrJmxReporterTest.java
index 11cdf37..e02db4b 100644
--- a/solr/core/src/test/org/apache/solr/metrics/reporters/SolrJmxReporterTest.java
+++ b/solr/core/src/test/org/apache/solr/metrics/reporters/SolrJmxReporterTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.metrics.reporters;
 
+import javax.management.InstanceNotFoundException;
 import javax.management.MBeanServer;
 import javax.management.ObjectInstance;
 import javax.management.ObjectName;
@@ -174,6 +175,41 @@ public class SolrJmxReporterTest extends SolrTestCaseJ4 {
             rootName.equals(o.getObjectName().getDomain())).count());
   }
 
+  private static boolean stopped = false;
+
+  @Test
+  public void testClosedCore() throws Exception {
+    Set<ObjectInstance> objects = mBeanServer.queryMBeans(new ObjectName("*:category=CORE,name=indexDir,*"), null);
+    assertEquals("Unexpected number of indexDir beans: " + objects.toString(), 1, objects.size());
+    final ObjectInstance inst = objects.iterator().next();
+    stopped = false;
+    try {
+      Thread t = new Thread() {
+        public void run() {
+          while (!stopped) {
+            try {
+              Object value = mBeanServer.getAttribute(inst.getObjectName(), "Value");
+              assertNotNull(value);
+            } catch (InstanceNotFoundException x) {
+              // no longer present
+              break;
+            } catch (Exception e) {
+              fail("Unexpected error retrieving attribute: " + e.toString());
+            }
+          }
+        }
+      };
+      t.start();
+      Thread.sleep(500);
+      h.getCoreContainer().unload(h.getCore().getName());
+      Thread.sleep(2000);
+      objects = mBeanServer.queryMBeans(new ObjectName("*:category=CORE,name=indexDir,*"), null);
+      assertEquals("Unexpected number of beans after core closed: " + objects, 0, objects.size());
+    } finally {
+      stopped = true;
+    }
+  }
+
   @Test
   public void testEnabled() throws Exception {
     String root1 = PREFIX + TestUtil.randomSimpleString(random(), 5, 10);