You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by ho...@apache.org on 2009/09/22 06:28:31 UTC

svn commit: r817499 - in /lucene/solr/trunk/src: java/org/apache/solr/core/SolrCore.java java/org/apache/solr/core/SolrResourceLoader.java test/org/apache/solr/core/SolrCoreTest.java

Author: hossman
Date: Tue Sep 22 04:28:30 2009
New Revision: 817499

URL: http://svn.apache.org/viewvc?rev=817499&view=rev
Log:
SOLR-1427: redo of Grant's previous commit that yonik rolled back - but this time with the registration postponed until the latch is released

Modified:
    lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java
    lucene/solr/trunk/src/java/org/apache/solr/core/SolrResourceLoader.java
    lucene/solr/trunk/src/test/org/apache/solr/core/SolrCoreTest.java

Modified: lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java?rev=817499&r1=817498&r2=817499&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/core/SolrCore.java Tue Sep 22 04:28:30 2009
@@ -591,6 +591,14 @@
     }
 
     infoRegistry.put("core", this);
+    
+    // register any SolrInfoMBeans SolrResourceLoader initialized
+    //
+    // this must happen after the latch is released, because a JMX server impl may
+    // choose to block on registering until properties can be fetched from an MBean,
+    // and a SolrCoreAware MBean may have properties that depend on getting a Searcher
+    // from the core.
+    resourceLoader.inform(infoRegistry);
   }
 
   private SolrHighlighter initHighLighter() {
@@ -829,7 +837,11 @@
   }
   private <T> void addIfNotPresent(Map<String ,T> registry, String name, Class<? extends  T> c){
     if(!registry.containsKey(name)){
-      registry.put(name, (T) resourceLoader.newInstance(c.getName()));
+      T searchComp = (T) resourceLoader.newInstance(c.getName());
+      registry.put(name, searchComp);
+      if (searchComp instanceof SolrInfoMBean){
+        infoRegistry.put(((SolrInfoMBean)searchComp).getName(), (SolrInfoMBean)searchComp);
+      }
     }
   }
   

Modified: lucene/solr/trunk/src/java/org/apache/solr/core/SolrResourceLoader.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/core/SolrResourceLoader.java?rev=817499&r1=817498&r2=817499&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/core/SolrResourceLoader.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/core/SolrResourceLoader.java Tue Sep 22 04:28:30 2009
@@ -68,6 +68,7 @@
   private String dataDir;
   
   private final List<SolrCoreAware> waitingForCore = new ArrayList<SolrCoreAware>();
+  private final List<SolrInfoMBean> infoMBeans = new ArrayList<SolrInfoMBean>();
   private final List<ResourceLoaderAware> waitingForResources = new ArrayList<ResourceLoaderAware>();
   private static final Charset UTF_8 = Charset.forName("UTF-8");
 
@@ -345,6 +346,10 @@
       assertAwareCompatibility( ResourceLoaderAware.class, obj );
       waitingForResources.add( (ResourceLoaderAware)obj );
     }
+    if (obj instanceof SolrInfoMBean){
+      //TODO: Assert here?
+      infoMBeans.add((SolrInfoMBean) obj);
+    }
     return obj;
   }
 
@@ -401,6 +406,10 @@
       assertAwareCompatibility( ResourceLoaderAware.class, obj );
       waitingForResources.add( (ResourceLoaderAware)obj );
     }
+    if (obj instanceof SolrInfoMBean){
+      //TODO: Assert here?
+      infoMBeans.add((SolrInfoMBean) obj);
+    }
     return obj;
   }
 
@@ -427,6 +436,16 @@
     }
     waitingForResources.clear();
   }
+
+  /**
+   * Register any {@link org.apache.solr.core.SolrInfoMBean}s
+   * @param infoRegistry The Info Registry
+   */
+  public void inform(Map<String, SolrInfoMBean> infoRegistry) {
+    for (SolrInfoMBean bean : infoMBeans) {
+      infoRegistry.put(bean.getName(), bean);
+    }
+  }
   /**
    * Determines the solrhome from the environment.
    * Tries JNDI (java:comp/env/solr/home) then system property (solr.solr.home);
@@ -535,4 +554,5 @@
     throw new SolrException( SolrException.ErrorCode.SERVER_ERROR, builder.toString() );
   }
 
+
 }

Modified: lucene/solr/trunk/src/test/org/apache/solr/core/SolrCoreTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/core/SolrCoreTest.java?rev=817499&r1=817498&r2=817499&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/core/SolrCoreTest.java (original)
+++ lucene/solr/trunk/src/test/org/apache/solr/core/SolrCoreTest.java Tue Sep 22 04:28:30 2009
@@ -18,6 +18,8 @@
 package org.apache.solr.core;
 
 import org.apache.solr.handler.RequestHandlerBase;
+import org.apache.solr.handler.component.SpellCheckComponent;
+import org.apache.solr.handler.component.QueryComponent;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrQueryResponse;
 import org.apache.solr.request.SolrRequestHandler;
@@ -164,6 +166,24 @@
     service.shutdown();
     assertTrue("Running for too long...", service.awaitTermination(60, TimeUnit.SECONDS));
   }
+
+  public void testInfoRegistry() throws Exception {
+    //TEst that SolrInfoMBeans are registered, including SearchComponents
+    SolrCore core = h.getCore();
+
+    Map<String, SolrInfoMBean> infoRegistry = core.getInfoRegistry();
+    assertTrue("infoRegistry Size: " + infoRegistry.size() + " is not greater than: " + 0, infoRegistry.size() > 0);
+    //try out some that we know are in the config
+    SolrInfoMBean bean = infoRegistry.get(SpellCheckComponent.class.getName());
+    assertNotNull("bean not registered", bean);
+    //try a default one
+    bean = infoRegistry.get(QueryComponent.class.getName());
+    assertNotNull("bean not registered", bean);
+    //try a Req Handler, which are stored by name, not clas
+    bean = infoRegistry.get("standard");
+    assertNotNull("bean not registered", bean);
+  }
+
 }