You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@lucene.apache.org by yo...@apache.org on 2006/09/18 23:26:02 UTC

svn commit: r447570 - in /lucene/java/trunk/src: java/org/apache/lucene/index/IndexWriter.java test/org/apache/lucene/index/TestIndexWriterMergePolicy.java

Author: yonik
Date: Mon Sep 18 14:26:02 2006
New Revision: 447570

URL: http://svn.apache.org/viewvc?view=rev&rev=447570
Log:
retain zero size segments resulting from a merge: LUCENE-672

Modified:
    lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java
    lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java

Modified: lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java?view=diff&rev=447570&r1=447569&r2=447570
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java Mon Sep 18 14:26:02 2006
@@ -734,15 +734,14 @@
   /** Merges all RAM-resident segments, then may merge segments. */
   private final void flushRamSegments() throws IOException {
     if (ramSegmentInfos.size() > 0) {
-      if (mergeSegments(ramSegmentInfos, 0, ramSegmentInfos.size()) > 0) {
-        maybeMergeSegments();
-      }
+      mergeSegments(ramSegmentInfos, 0, ramSegmentInfos.size());
+      maybeMergeSegments();
     }
   }
 
   /** Incremental segment merger.  */
   private final void maybeMergeSegments() throws IOException {
-    long lowerBound = 0;
+    long lowerBound = -1;
     long upperBound = minMergeDocs;
 
     while (upperBound * mergeFactor <= maxMergeDocs) {
@@ -782,7 +781,7 @@
             // continue to merge the rest of the worthy segments on this level
             minSegment++;
             exceedsUpperLimit = true;
-          } else if (docCount > 0) {
+          } else {
             // if the merged segment does not exceed upperBound, consider
             // this segment for further merges on this same level
             numSegments++;
@@ -810,7 +809,6 @@
     if (infoStream != null) infoStream.print("merging segments");
     SegmentMerger merger = new SegmentMerger(this, mergedName);
 
-    boolean fromRAM = false;
     final Vector segmentsToDelete = new Vector();
     for (int i = minSegment; i < end; i++) {
       SegmentInfo si = sourceSegments.info(i);
@@ -821,9 +819,6 @@
       if ((reader.directory() == this.directory) || // if we own the directory
           (reader.directory() == this.ramDirectory))
         segmentsToDelete.addElement(reader);   // queue segment for deletion
-      if (!fromRAM && (reader.directory() == this.ramDirectory)) {
-        fromRAM = true;
-      }
     }
 
     int mergedDocCount = merger.merge();
@@ -834,17 +829,13 @@
 
     SegmentInfo newSegment = new SegmentInfo(mergedName, mergedDocCount,
         directory);
-    if (fromRAM) {
+    if (sourceSegments == ramSegmentInfos) {
       sourceSegments.removeAllElements();
-      if (mergedDocCount > 0)
-        segmentInfos.addElement(newSegment);
+      segmentInfos.addElement(newSegment);
     } else {
       for (int i = end-1; i > minSegment; i--)     // remove old infos & add new
         sourceSegments.remove(i);
-      if (mergedDocCount > 0)
-        segmentInfos.set(minSegment, newSegment);
-      else
-        sourceSegments.remove(minSegment);
+      segmentInfos.set(minSegment, newSegment);
     }
 
     // close readers before we attempt to delete now-obsolete segments

Modified: lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java?view=diff&rev=447570&r1=447569&r2=447570
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriterMergePolicy.java Mon Sep 18 14:26:02 2006
@@ -157,9 +157,9 @@
     writer.setMaxBufferedDocs(10);
     writer.setMergeFactor(5);
 
+    // merge factor is changed, so check invariants after all adds
     for (int i = 0; i < 10; i++) {
       addDoc(writer);
-      checkInvariants(writer);
     }
     checkInvariants(writer);
     assertEquals(10, writer.docCount());
@@ -173,7 +173,7 @@
     writer.addDocument(doc);
   }
 
-  private void checkInvariants(IndexWriter writer) {
+  private void checkInvariants(IndexWriter writer) throws IOException {
     int maxBufferedDocs = writer.getMaxBufferedDocs();
     int mergeFactor = writer.getMergeFactor();
     int maxMergeDocs = writer.getMaxMergeDocs();
@@ -188,10 +188,10 @@
     int segmentCount = writer.getSegmentCount();
     for (int i = segmentCount - 1; i >= 0; i--) {
       int docCount = writer.getDocCount(i);
-      assertTrue(docCount > lowerBound);
+      assertTrue(docCount > lowerBound || docCount == 0);
 
       if (docCount <= upperBound) {
-        segmentCount++;
+        numSegments++;
       } else {
         if (upperBound * mergeFactor <= maxMergeDocs) {
           assertTrue(numSegments < mergeFactor);
@@ -199,12 +199,21 @@
 
         lowerBound = upperBound;
         upperBound *= mergeFactor;
-        segmentCount = 1;
+        numSegments = 1;
       }
     }
     if (upperBound * mergeFactor <= maxMergeDocs) {
       assertTrue(numSegments < mergeFactor);
     }
+
+    String[] files = writer.getDirectory().list();
+    int segmentCfsCount = 0;
+    for (int i = 0; i < files.length; i++) {
+      if (files[i].endsWith(".cfs")) {
+        segmentCfsCount++;
+      }
+    }
+    assertEquals(segmentCount, segmentCfsCount);
   }
 
   private void printSegmentDocCounts(IndexWriter writer) {