Learning Solr Code: How Solr Is Started


Entrance
SolrDispatchFilter.init
new CoreContainer.Initialize().initialize();
CoreContainer.Initialize.initialize()
1. SolrResourceLoader.locateSolrHome()
The order to find Solr Home: jndi lookup: java:comp/env/solr/home, system environment: solr.solr.home, otherwise solr/, relative to current directory.
2. new CoreContainer(solrHome).load(solrHome, solr.xml)
This will create add jars in solr-home/lib to class loader, parse solr.xml, use ThreadPoolExecutor and CompletionService to load cores defined in parallel, define a CoreDescriptor for each core, in CoreDescriptor, we can see the default value for core properties: loadOnStartup=true, isTransient = false.
CompletionService completionService = new ExecutorCompletionService(
coreLoadExecutor);
Set> pending = new HashSet>();
pending.add(completionService.submit(task));

In the Callable task, it will call CoreContainer.createFromLocal(String, CoreDescriptor).
CoreContainer.createFromLocal

1. Create SolrConfig which represents solrconfig.xml, this will read the xml, load the jars into classloader, create SolrIndexConfig for indexConfig section, create CacheConfig, HttpCachingConfig, load requestHandler, queryParser, transformer etc.
2. Creat IndexSchema which represents schema.xml, this will parse schema,xml. create field types, SchemaField, read SimilarityFactory.
3. Create one SolrCore: core = new SolrCore(dcore.getName(), null, config, schema, dcore);
This will initialize listeners defined in solrconfig.xml, initIndex, initQParsers, initValueSourceParsers, initTransformerFactories. It will initialize RequestHandlers, create one instance for each request handler defined, and put it into a map. So there will be only one instance for each request handleRequestBody. So be careful of the thread safty when write our own request handler.
reqHandlers = new RequestHandlers(this);
reqHandlers.initHandlersFromConfig(solrConfig);
 
Class in IndexSchema: DynamicField, DynamicCopy

CoreContainer.cfg represents solr.xml:, in CoreContainer, you can find out all available configuration in solr.xml.
Example:  String dcoreName = cfg.get("solr/cores/@defaultCoreName", null);

SolrCore.SolrCore(String, String, SolrConfig, IndexSchema, CoreDescriptor, UpdateHandler, SolrCore)
reqHandlers = new RequestHandlers(this);
reqHandlers.initHandlersFromConfig(solrConfig);
SolrResourceLoader
Add solr-home/lib jars to class loader.
this.classLoader = createClassLoader(null, parent);
addToClassLoader("./lib/", null);
reloadLuceneSPI();
Learned
1. Add jars into class loader?
SolrResourceLoader.replaceClassLoader
2. CompletionService

Labels

adsense (5) Algorithm (69) Algorithm Series (35) Android (7) ANT (6) bat (8) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) Java (186) JavaScript (27) JSON (7) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) regex (5) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) xml (5)