Hi all,

I was trying to use the new 'shareSchema=true' feature in solr 1.4 and
it appears as though this will only happen in one configuration. I'd like
someone to confirm this for me and then we can file a bug on it.

This all happens in CoreContainer.create().  

When you have shareSchema=true in solr.xml then an instance variable
indexSchemaCache is created in the CoreContainer instance.

This snippet is from CoreContainer.create

      if (indexSchemaCache != null){
         //schema sharing is enabled. so check if it already is loaded

[1]      File schemFile = new File(solrLoader.getInstanceDir() + "conf" + 
File.separator + dcore.getSchemaName());
         if(schemFile. exists()){
[2]         String key = schemFile.getAbsolutePath()+":"+new 
SimpleDateFormat("yyyyMMddhhmmss").format(new Date(schemFile.lastModified()));

          schema = indexSchemaCache.get(key);
          if(schema == null){
            log.info("creating new schema object for core: " + dcore.name);
            schema = new IndexSchema(config, dcore.getSchemaName(), null);
            indexSchemaCache.put(key,schema);
          } else {
            log.info("re-using schema object for core: " + dcore.name);
          }   
        }   
      }
      if(schema == null){
        schema = new IndexSchema(config, dcore.getSchemaName(), null);
      }   

A couple of points:

[1] dcore.getSchemaName() is the value that is in the 'schema' 
    <core /> element in the solr.xml.  This means that the this MUST
    be relative to the core-instance-dir/conf directory.  Putting an
    absolute path in the xml means that schemFile.exists() will always 
    return false.  That is, if I put in 

      <core name="core0" 
schema="/opt/search/solr/conf/multicore-common-schema.xml" />

    then schemFile will have a path of:

      
/path/to/core0/instanceDir/conf/opt/search/solr/conf/multicore-common-schema.xml

    Which never exists.

[2] If you do use a relative path to the schema.xml file, then the key will 
always be 
    unique, since each schemFile is relative to a core's instanceDir, the core 
name is 
    in the path and schemFile.getAbsolutePathe() will always be unique for 
every core.

The result of this is, if I wanted to use shareSchema, it looks like the
only way for that to happen, is if two cores are using the same instanceDir
but different dataDir.  

I tried a test with this solr.xml in the example multicore configurae, and this
appears to be the only way to reuse the schema instance, and to me this has a 
bit of a smell:

  <solr persistent="false">
    <cores adminPath="/admin/cores" shareSchema="true" >
      <core name="core0" instanceDir="mcore" schema="schema-common.xml" 
dataDir="core0/data" />
      <core name="core1" instanceDir="mcore" schema="schema-common.xml" 
dataDir="core1/data" />
    </cores>
  </solr> 

In my initial playing with this feature, I assumed that just putting in 
the full path to a common schema.xml file would do the trick.  That is 
evidently not the way it works.

What is the way that shareSchema=true is supposed to work?

enjoy,

-jeremy

-- 
========================================================================
 Jeremy Hinegardner                              jer...@hinegardner.org 

Reply via email to