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 2018/03/13 14:56:47 UTC

lucene-solr:branch_7_3: SOLR-12070: Fix testJmxIntegration that used obsolete APIs.

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_7_3 04d1a8258 -> c733c9673


SOLR-12070: Fix testJmxIntegration that used obsolete APIs.


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

Branch: refs/heads/branch_7_3
Commit: c733c9673cd603562848b1c7930bcfc8f6827fc6
Parents: 04d1a82
Author: Andrzej Bialecki <ab...@apache.org>
Authored: Tue Mar 13 15:46:25 2018 +0100
Committer: Andrzej Bialecki <ab...@apache.org>
Committed: Tue Mar 13 15:56:37 2018 +0100

----------------------------------------------------------------------
 .../solr/metrics/reporters/SolrJmxReporter.java | 12 ++-
 .../apache/solr/core/TestJmxIntegration.java    | 80 +++++++++++++++++---
 2 files changed, 80 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c733c967/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java
index 79ffed9..fd927b1 100644
--- a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java
@@ -54,6 +54,7 @@ public class SolrJmxReporter extends FilteringSolrMetricReporter {
   private MetricRegistry registry;
   private MBeanServer mBeanServer;
   private JmxMetricsReporter reporter;
+  private String instanceTag;
   private boolean started;
 
   /**
@@ -98,13 +99,13 @@ public class SolrJmxReporter extends FilteringSolrMetricReporter {
     registry = metricManager.registry(registryName);
 
     final MetricFilter filter = newMetricFilter();
-    String tag = Integer.toHexString(this.hashCode());
+    instanceTag = Integer.toHexString(this.hashCode());
     reporter = JmxMetricsReporter.forRegistry(registry)
                           .registerWith(mBeanServer)
                           .inDomain(fullDomain)
                           .filter(filter)
                           .createsObjectNamesWith(jmxObjectNameFactory)
-                          .withTag(tag)
+                          .withTag(instanceTag)
                           .build();
     reporter.start();
     started = true;
@@ -112,6 +113,13 @@ public class SolrJmxReporter extends FilteringSolrMetricReporter {
   }
 
   /**
+   * For unit tests.
+   */
+  public String getInstanceTag() {
+    return instanceTag;
+  }
+
+  /**
    * Stops the reporter from publishing metrics.
    */
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c733c967/solr/core/src/test/org/apache/solr/core/TestJmxIntegration.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/core/TestJmxIntegration.java b/solr/core/src/test/org/apache/solr/core/TestJmxIntegration.java
index 0f2c21a..36f41e2 100644
--- a/solr/core/src/test/org/apache/solr/core/TestJmxIntegration.java
+++ b/solr/core/src/test/org/apache/solr/core/TestJmxIntegration.java
@@ -16,12 +16,15 @@
  */
 package org.apache.solr.core;
 
+import com.codahale.metrics.MetricRegistry;
 import org.apache.solr.metrics.SolrMetricManager;
 import org.apache.solr.metrics.SolrMetricReporter;
+import org.apache.solr.metrics.reporters.jmx.JmxMetricsReporter;
 import org.apache.solr.metrics.reporters.jmx.JmxObjectNameFactory;
 import org.apache.solr.metrics.reporters.SolrJmxReporter;
 import org.apache.solr.SolrTestCaseJ4;
 import org.junit.AfterClass;
+import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -37,6 +40,7 @@ import javax.management.ObjectName;
 import java.lang.invoke.MethodHandles;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
 /**
  * Test for JMX Integration
@@ -98,6 +102,12 @@ public class TestJmxIntegration extends SolrTestCaseJ4 {
     mbeanServer = null;
   }
 
+  @Before
+  public void resetIndex() throws Exception {
+    clearIndex();
+    assertU("commit", commit());
+  }
+
   @Test
   public void testJmxRegistration() throws Exception {
     assertTrue("No MBeans found in server", mbeanServer.getMBeanCount() > 0);
@@ -159,16 +169,32 @@ public class TestJmxIntegration extends SolrTestCaseJ4 {
         numDocs > oldNumDocs);
   }
 
-  @Test @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-2715") // timing problem?
+  @Test
   public void testJmxOnCoreReload() throws Exception {
+    // make sure searcher beans are registered
+    assertQ(req("q", "*:*"), "//result[@numFound='0']");
 
+    SolrMetricManager mgr = h.getCoreContainer().getMetricManager();
+    String registryName = h.getCore().getCoreMetricManager().getRegistryName();
     String coreName = h.getCore().getName();
+    String coreHashCode = String.valueOf(h.getCore().hashCode());
+    Map<String, SolrMetricReporter> reporters = mgr.getReporters(registryName);
+    // take first JMX reporter
+    SolrJmxReporter reporter = null;
+    for (Map.Entry<String, SolrMetricReporter> e : reporters.entrySet()) {
+      if (e.getKey().endsWith(coreHashCode) && e.getValue() instanceof SolrJmxReporter) {
+        reporter = (SolrJmxReporter)e.getValue();
+        break;
+      }
+    }
+    assertNotNull("could not find JMX reporter for " + registryName, reporter);
+    String tag = reporter.getInstanceTag();
 
     Set<ObjectInstance> oldBeans = mbeanServer.queryMBeans(null, null);
     int oldNumberOfObjects = 0;
     for (ObjectInstance bean : oldBeans) {
       try {
-        if (String.valueOf(h.getCore().hashCode()).equals(mbeanServer.getAttribute(bean.getObjectName(), "coreHashCode"))) {
+        if (tag.equals(mbeanServer.getAttribute(bean.getObjectName(), JmxMetricsReporter.INSTANCE_TAG))) {
           oldNumberOfObjects++;
         }
       } catch (AttributeNotFoundException e) {
@@ -176,19 +202,45 @@ public class TestJmxIntegration extends SolrTestCaseJ4 {
       }
     }
 
-    log.info("Before Reload: Size of infoRegistry: " + h.getCore().getInfoRegistry().size() + " MBeans: " + oldNumberOfObjects);
-    assertEquals("Number of registered MBeans is not the same as info registry size", h.getCore().getInfoRegistry().size(), oldNumberOfObjects);
-
+    int totalCoreMetrics = mgr.registry(registryName).getMetrics().size();
+    log.info("Before Reload: size of all core metrics: " + totalCoreMetrics + " MBeans: " + oldNumberOfObjects);
+    assertEquals("Number of registered MBeans is not the same as the number of core metrics", totalCoreMetrics, oldNumberOfObjects);
     h.getCoreContainer().reload(coreName);
+    assertQ(req("q", "*:*"), "//result[@numFound='0']");
+
+    reporters = mgr.getReporters(registryName);
+    coreHashCode = String.valueOf(h.getCore().hashCode());
+    // take first JMX reporter
+    reporter = null;
+    for (Map.Entry<String, SolrMetricReporter> e : reporters.entrySet()) {
+      if (e.getKey().endsWith(coreHashCode) && e.getValue() instanceof SolrJmxReporter) {
+        reporter = (SolrJmxReporter)e.getValue();
+        break;
+      }
+    }
+    assertNotNull("could not find JMX reporter for " + registryName, reporter);
+    tag = reporter.getInstanceTag();
 
     Set<ObjectInstance> newBeans = mbeanServer.queryMBeans(null, null);
     int newNumberOfObjects = 0;
-    int registrySize = 0;
+    Set<String> metricNames = new TreeSet<>();
+    Set<String> beanNames = new TreeSet<>();
     try (SolrCore core = h.getCoreContainer().getCore(coreName)) {
-      registrySize = core.getInfoRegistry().size();
+      MetricRegistry registry = mgr.registry(registryName);
+      metricNames.addAll(registry.getNames());
+      totalCoreMetrics = registry.getMetrics().size();
       for (ObjectInstance bean : newBeans) {
         try {
-          if (String.valueOf(core.hashCode()).equals(mbeanServer.getAttribute(bean.getObjectName(), "coreHashCode"))) {
+          if (tag.equals(mbeanServer.getAttribute(bean.getObjectName(), JmxMetricsReporter.INSTANCE_TAG))) {
+            String[] name = bean.getObjectName().toString().substring(32).split(",");
+            StringBuilder sb = new StringBuilder();
+            for (String n : name) {
+              if (sb.length() > 0) {
+                sb.append(".");
+              }
+              sb.append(n.split("=")[1]);
+            }
+            beanNames.add(sb.toString());
             newNumberOfObjects++;
           }
         } catch (AttributeNotFoundException e) {
@@ -197,7 +249,15 @@ public class TestJmxIntegration extends SolrTestCaseJ4 {
       }
     }
 
-    log.info("After Reload: Size of infoRegistry: " + registrySize + " MBeans: " + newNumberOfObjects);
-    assertEquals("Number of registered MBeans is not the same as info registry size", registrySize, newNumberOfObjects);
+    log.info("After Reload: size of all core metrics: " + totalCoreMetrics + " MBeans: " + newNumberOfObjects);
+    if (totalCoreMetrics != newNumberOfObjects) {
+      Set<String> errors = new TreeSet<>(beanNames);
+      errors.removeAll(metricNames);
+      log.error("Unexpected bean names: " + errors);
+      errors = new TreeSet<>(metricNames);
+      errors.removeAll(beanNames);
+      log.error("Unexpected metric names: " + errors);
+      fail("Number of registered MBeans is not the same as the number of core metrics: " + totalCoreMetrics + " != " + newNumberOfObjects);
+    }
   }
 }