You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ho...@apache.org on 2013/06/19 00:31:47 UTC

svn commit: r1494348 - in /lucene/dev/trunk/solr: ./ core/src/java/org/apache/solr/update/ core/src/test-files/solr/collection1/conf/ core/src/test/org/apache/solr/core/

Author: hossman
Date: Tue Jun 18 22:31:47 2013
New Revision: 1494348

URL: http://svn.apache.org/r1494348
Log:
SOLR-4934: Fix handling of <mergePolicy> init arg "useCompoundFile" needed after changes in LUCENE-5038

Added:
    lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-defaults.xml
      - copied, changed from r1494185, lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy.xml
    lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-legacy.xml
      - copied, changed from r1494185, lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy.xml
Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java
    lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy.xml
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1494348&r1=1494347&r2=1494348&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Tue Jun 18 22:31:47 2013
@@ -59,6 +59,16 @@ Apache ZooKeeper 3.4.5
 Upgrading from Solr 4.3.0
 ----------------------
 
+* TieredMergePolicy and the various subtypes of LogMergePolicy no longer have 
+  an explicit "setUseCompoundFile" method.  Instead this behavior is now driven
+  entirely by the value of "setNoCFSRatio".  If you have explicitly configured 
+  one of these classes using <mergePolicy> and include an init arg like this...
+     <bool name="useCompoundFile">true</bool>
+  ...this will now be ignored and a warning will be logged.  Users with an 
+  explicitly declared <mergePolicy> are encouraged to review the current 
+  javadocs for their MergePolicy subclass and review their configured options 
+  carefully.  See SOLR-4934 and LUCENE-5038 for more information.
+
 * SOLR-4778: The signature of LogWatcher.registerListener has changed, from
   (ListenerConfig, CoreContainer) to (ListenerConfig).  Users implementing their
   own LogWatcher classes will need to change their code accordingly.
@@ -164,6 +174,10 @@ Bug Fixes
   defined in the original. Benign since the default values are saved, but still incorrect.
   (Erick Erickson, thanks Shawn Heisey for helping test!)
 
+* SOLR-4934: Fix handling of <mergePolicy> init arg "useCompoundFile" needed 
+  after changes in LUCENE-5038 (hossman)
+
+
 Optimizations
 ----------------------
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java?rev=1494348&r1=1494347&r2=1494348&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java Tue Jun 18 22:31:47 2013
@@ -221,6 +221,9 @@ public class SolrIndexConfig {
 
       if (mergeFactor != -1)
         logMergePolicy.setMergeFactor(mergeFactor);
+
+      fixUseCFInitArg(LogMergePolicy.class);
+
     } else if (policy instanceof TieredMergePolicy) {
       TieredMergePolicy tieredMergePolicy = (TieredMergePolicy) policy;
       
@@ -230,8 +233,11 @@ public class SolrIndexConfig {
         tieredMergePolicy.setMaxMergeAtOnce(mergeFactor);
         tieredMergePolicy.setSegmentsPerTier(mergeFactor);
       }
-    } else {
-      log.warn("Use of compound file format or mergefactor cannot be configured if merge policy is not an instance of LogMergePolicy or TieredMergePolicy. The configured policy's defaults will be used.");
+
+      fixUseCFInitArg(TieredMergePolicy.class);
+
+    } else if (useCompoundFile && (mergeFactor != -1)) {
+      log.warn("Use of <useCompoundFile> or <mergeFactor> cannot be configured if merge policy is not an instance of LogMergePolicy or TieredMergePolicy. The configured policy's defaults will be used.");
     }
 
     if (mergePolicyInfo != null)
@@ -249,4 +255,20 @@ public class SolrIndexConfig {
 
     return scheduler;
   }
+
+  /**
+   * Lucene 4.4 removed the setUseCompoundFile(boolean) method from the two 
+   * conrete MergePolicies provided with Lucene/Solr.  In the event that users 
+   * have a value explicitly configured for this setter in their mergePolicy 
+   * init args, we remove it for them and warn about it.
+   */
+  private void fixUseCFInitArg(Class c) {
+
+    if (null == mergePolicyInfo || null == mergePolicyInfo.initArgs) return;
+
+    Object useCFSArg = mergePolicyInfo.initArgs.remove("useCompoundFile");
+    if (null != useCFSArg) {
+      log.warn("Ignoring 'useCompoundFile' specified as an init arg for the <mergePolicy> since it is no longer supported by " + c.getSimpleName());
+    }
+  }
 }

Copied: lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-defaults.xml (from r1494185, lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy.xml)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-defaults.xml?p2=lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-defaults.xml&p1=lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy.xml&r1=1494185&r2=1494348&rev=1494348&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy.xml (original)
+++ lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-defaults.xml Tue Jun 18 22:31:47 2013
@@ -22,12 +22,9 @@
   <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.RAMDirectoryFactory}"/>
 
   <indexConfig>
-    <mergeFactor>7</mergeFactor>
-    <mergePolicy class="org.apache.lucene.index.TieredMergePolicy">
-      <int name="maxMergeAtOnceExplicit">19</int>
-      <int name="segmentsPerTier">9</int>
-      <double name="noCFSRatio">1.0</double>
-    </mergePolicy>
+    <!-- do not put any merge policy, merge factor 
+         or CFS related settings here 
+    -->
   </indexConfig>
 
   <requestHandler name="standard" class="solr.StandardRequestHandler"></requestHandler>

Copied: lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-legacy.xml (from r1494185, lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy.xml)
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-legacy.xml?p2=lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-legacy.xml&p1=lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy.xml&r1=1494185&r2=1494348&rev=1494348&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy.xml (original)
+++ lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-legacy.xml Tue Jun 18 22:31:47 2013
@@ -23,11 +23,7 @@
 
   <indexConfig>
     <mergeFactor>7</mergeFactor>
-    <mergePolicy class="org.apache.lucene.index.TieredMergePolicy">
-      <int name="maxMergeAtOnceExplicit">19</int>
-      <int name="segmentsPerTier">9</int>
-      <double name="noCFSRatio">1.0</double>
-    </mergePolicy>
+    <useCompoundFile>true</useCompoundFile>
   </indexConfig>
 
   <requestHandler name="standard" class="solr.StandardRequestHandler"></requestHandler>

Modified: lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy.xml
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy.xml?rev=1494348&r1=1494347&r2=1494348&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy.xml (original)
+++ lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy.xml Tue Jun 18 22:31:47 2013
@@ -26,7 +26,13 @@
     <mergePolicy class="org.apache.lucene.index.TieredMergePolicy">
       <int name="maxMergeAtOnceExplicit">19</int>
       <int name="segmentsPerTier">9</int>
-      <double name="noCFSRatio">1.0</double>
+      <double name="noCFSRatio">0.6</double>
+
+      <!-- Setter for this was removed in Lucene 4.4, but we should
+           ignore it with a warning if users have it in their configs
+      -->
+      <bool name="useCompoundFile">true</bool>
+
     </mergePolicy>
   </indexConfig>
 

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java?rev=1494348&r1=1494347&r2=1494348&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java Tue Jun 18 22:31:47 2013
@@ -21,31 +21,64 @@ import org.apache.lucene.index.IndexWrit
 import org.apache.lucene.index.MergePolicy;
 import org.apache.lucene.index.TieredMergePolicy;
 import org.apache.solr.SolrTestCaseJ4;
-import org.junit.BeforeClass;
+import org.junit.After;
 
 public class TestMergePolicyConfig extends SolrTestCaseJ4 {
 
-  @BeforeClass
-  public static void beforeClass() throws Exception {
-    initCore("solrconfig-mergepolicy.xml","schema.xml");
+  @After
+  public void after() throws Exception {
+    deleteCore();
+  }
+
+  public void testDefaultMergePolicyConfig() throws Exception {
+    initCore("solrconfig-mergepolicy-defaults.xml","schema-minimal.xml");
+    IndexWriterConfig iwc = solrConfig.indexConfig.toIndexWriterConfig(h.getCore().getLatestSchema());
+
+    TieredMergePolicy tieredMP = assertAndCast(TieredMergePolicy.class,
+                                               iwc.getMergePolicy());
+    assertEquals(0.0D, tieredMP.getNoCFSRatio(), 0.0D);
+
+  }
+
+  public void testLegacyMergePolicyConfig() throws Exception {
+    initCore("solrconfig-mergepolicy-legacy.xml","schema-minimal.xml");
+    IndexWriterConfig iwc = solrConfig.indexConfig.toIndexWriterConfig(h.getCore().getLatestSchema());
+    TieredMergePolicy tieredMP = assertAndCast(TieredMergePolicy.class,
+                                               iwc.getMergePolicy());
+
+    assertEquals(7, tieredMP.getMaxMergeAtOnce());
+    assertEquals(7.0D, tieredMP.getSegmentsPerTier(), 0.0D);
+    assertEquals(1.0D, tieredMP.getNoCFSRatio(), 0.0D);
   }
   
   public void testTieredMergePolicyConfig() throws Exception {
+    initCore("solrconfig-mergepolicy.xml","schema-minimal.xml");
     IndexWriterConfig iwc = solrConfig.indexConfig.toIndexWriterConfig(h.getCore().getLatestSchema());
-    MergePolicy mp = iwc.getMergePolicy();
-    assertTrue(mp instanceof TieredMergePolicy);
-    TieredMergePolicy tieredMP = (TieredMergePolicy) mp;
+    TieredMergePolicy tieredMP = assertAndCast(TieredMergePolicy.class,
+                                               iwc.getMergePolicy());
 
-    // mp-specific setter
-    assertEquals(19, tieredMP.getMaxMergeAtOnceExplicit());
-    
+    // set by legacy <mergeFactor> setting
     assertEquals(7, tieredMP.getMaxMergeAtOnce());
     
-    // make sure we overrode segmentsPerTier (split from maxMergeAtOnce out of mergeFactor)
+    // mp-specific setters
+    assertEquals(19, tieredMP.getMaxMergeAtOnceExplicit());
+    assertEquals(0.6D, tieredMP.getNoCFSRatio(), 0.001);
+    // make sure we overrode segmentsPerTier 
+    // (split from maxMergeAtOnce out of mergeFactor)
     assertEquals(9D, tieredMP.getSegmentsPerTier(), 0.001);
     
-    // make sure we overrode noCFSRatio (useless because we disabled useCompoundFile,
-    // but just to make sure it works)
-    assertEquals(1.0D, tieredMP.getNoCFSRatio(), 0.001);
   }
+
+  /**
+   * Given a Type and an object asserts that the object is non-null and an 
+   * instance of the specified Type.  The object is then cast to that type and 
+   * returned.
+   */
+  public static <T> T assertAndCast(Class<? extends T> clazz, Object o) {
+    assertNotNull(clazz);
+    assertNotNull(o);
+    assertTrue(clazz.isInstance(o));
+    return clazz.cast(o);
+  }
+
 }