You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2013/05/09 16:25:35 UTC

svn commit: r1480663 - in /lucene/dev/branches/branch_4x: ./ lucene/ lucene/core/ lucene/core/src/java/org/apache/lucene/index/ lucene/core/src/test/org/apache/lucene/index/

Author: mikemccand
Date: Thu May  9 14:25:33 2013
New Revision: 1480663

URL: http://svn.apache.org/r1480663
Log:
LUCENE-4986: NRT reopen after tryDeleteDocument was failing to reflect the deletion

Added:
    lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestTryDelete.java
      - copied unchanged from r1480650, lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/index/TestTryDelete.java
Modified:
    lucene/dev/branches/branch_4x/   (props changed)
    lucene/dev/branches/branch_4x/lucene/   (props changed)
    lucene/dev/branches/branch_4x/lucene/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_4x/lucene/core/   (props changed)
    lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
    lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/StandardDirectoryReader.java

Modified: lucene/dev/branches/branch_4x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/CHANGES.txt?rev=1480663&r1=1480662&r2=1480663&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/lucene/CHANGES.txt Thu May  9 14:25:33 2013
@@ -84,6 +84,10 @@ Bug Fixes
 * LUCENE-4980: Fix issues preventing mixing of RangeFacetRequest and
   non-RangeFacetRequest when using DrillSideways.  (Mike McCandless,
   Shai Erera)
+
+* LUCENE-4986: Fixed case where a newly opened near-real-time reader
+  fails to reflect a delete from IndexWriter.tryDeleteDocument (Reg,
+  Mike McCandless)
   
 Optimizations
 

Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java?rev=1480663&r1=1480662&r2=1480663&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/IndexWriter.java Thu May  9 14:25:33 2013
@@ -370,7 +370,7 @@ public class IndexWriter implements Clos
           }
           success = true;
           // Prevent segmentInfos from changing while opening the
-          // reader; in theory we could do similar retry logic,
+          // reader; in theory we could instead do similar retry logic,
           // just like we do when loading segments_N
           synchronized(this) {
             maybeApplyDeletes(applyAllDeletes);
@@ -437,6 +437,16 @@ public class IndexWriter implements Clos
       }
     }
 
+    public synchronized boolean anyPendingDeletes() {
+      for(ReadersAndLiveDocs rld : readerMap.values()) {
+        if (rld.getPendingDeleteCount() != 0) {
+          return true;
+        }
+      }
+
+      return false;
+    }
+
     public synchronized void release(ReadersAndLiveDocs rld) throws IOException {
 
       // Matches incRef in get:
@@ -555,8 +565,21 @@ public class IndexWriter implements Clos
         rld.incRef();
       }
 
+      assert noDups();
+
       return rld;
     }
+
+    // Make sure that every segment appears only once in the
+    // pool:
+    private boolean noDups() {
+      Set<String> seen = new HashSet<String>();
+      for(SegmentInfoPerCommit info : readerMap.keySet()) {
+        assert !seen.contains(info.info.name);
+        seen.add(info.info.name);
+      }
+      return true;
+    }
   }
 
   /**
@@ -678,8 +701,7 @@ public class IndexWriter implements Clos
 
         // Record that we have a change (zero out all
         // segments) pending:
-        changeCount++;
-        segmentInfos.changed();
+        changed();
       } else {
         segmentInfos.read(directory);
 
@@ -695,8 +717,7 @@ public class IndexWriter implements Clos
           SegmentInfos oldInfos = new SegmentInfos();
           oldInfos.read(directory, commit.getSegmentsFileName());
           segmentInfos.replace(oldInfos);
-          changeCount++;
-          segmentInfos.changed();
+          changed();
           if (infoStream.isEnabled("IW")) {
             infoStream.message("IW", "init: loaded commit \"" + commit.getSegmentsFileName() + "\"");
           }
@@ -723,8 +744,7 @@ public class IndexWriter implements Clos
         // We have to mark ourself as changed so that if we
         // are closed w/o any further changes we write a new
         // segments_N file.
-        changeCount++;
-        segmentInfos.changed();
+        changed();
       }
 
       if (infoStream.isEnabled("IW")) {
@@ -1087,6 +1107,9 @@ public class IndexWriter implements Clos
     if (docWriter.anyDeletions()) {
       return true;
     }
+    if (readerPool.anyPendingDeletes()) {
+      return true;
+    }
     for (final SegmentInfoPerCommit info : segmentInfos) {
       if (info.hasDeletions()) {
         return true;
@@ -1356,7 +1379,7 @@ public class IndexWriter implements Clos
 
             // Must bump changeCount so if no other changes
             // happened, we still commit this change:
-            changeCount++;
+            changed();
           }
           //System.out.println("  yes " + info.info.name + " " + docID);
           return true;
@@ -2173,9 +2196,14 @@ public class IndexWriter implements Clos
    * index directory.
    */
   synchronized void checkpoint() throws IOException {
+    changed();
+    deleter.checkpoint(segmentInfos, false);
+  }
+
+  /** Called internally if any index state has changed. */
+  synchronized void changed() {
     changeCount++;
     segmentInfos.changed();
-    deleter.checkpoint(segmentInfos, false);
   }
 
   synchronized void publishFrozenDeletes(FrozenBufferedDeletes packet) {
@@ -4158,8 +4186,7 @@ public class IndexWriter implements Clos
     //System.out.println("IW.nrtIsCurrent " + (infos.version == segmentInfos.version && !docWriter.anyChanges() && !bufferedDeletesStream.any()));
     ensureOpen();
     if (infoStream.isEnabled("IW")) {
-      infoStream.message("IW", "nrtIsCurrent: infoVersion matches: " + (infos.version == segmentInfos.version) + " DW changes: " + docWriter.anyChanges() + " BD changes: "+bufferedDeletesStream.any());
-
+      infoStream.message("IW", "nrtIsCurrent: infoVersion matches: " + (infos.version == segmentInfos.version) + "; DW changes: " + docWriter.anyChanges() + "; BD changes: "+ bufferedDeletesStream.any());
     }
     return infos.version == segmentInfos.version && !docWriter.anyChanges() && !bufferedDeletesStream.any();
   }

Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/StandardDirectoryReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/StandardDirectoryReader.java?rev=1480663&r1=1480662&r2=1480663&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/StandardDirectoryReader.java (original)
+++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/StandardDirectoryReader.java Thu May  9 14:25:33 2013
@@ -89,6 +89,10 @@ final class StandardDirectoryReader exte
       IOException prior = null;
       boolean success = false;
       try {
+        // NOTE: important that we use infos not
+        // segmentInfos here, so that we are passing the
+        // actual instance of SegmentInfoPerCommit in
+        // IndexWriter's segmentInfos:
         final SegmentInfoPerCommit info = infos.info(i);
         assert info.info.dir == dir;
         final ReadersAndLiveDocs rld = writer.readerPool.get(info, true);
@@ -118,9 +122,10 @@ final class StandardDirectoryReader exte
       writer, segmentInfos, writer.getConfig().getReaderTermsIndexDivisor(), applyAllDeletes);
   }
 
-  /** This constructor is only used for {@link #doOpenIfChanged(SegmentInfos, IndexWriter)} */
-  private static DirectoryReader open(Directory directory, IndexWriter writer, SegmentInfos infos, List<? extends AtomicReader> oldReaders,
+  /** This constructor is only used for {@link #doOpenIfChanged(SegmentInfos)} */
+  private static DirectoryReader open(Directory directory, SegmentInfos infos, List<? extends AtomicReader> oldReaders,
     int termInfosIndexDivisor) throws IOException {
+
     // we put the old SegmentReaders in a map, that allows us
     // to lookup a reader using its segment name
     final Map<String,Integer> segmentReaders = new HashMap<String,Integer>();
@@ -207,7 +212,7 @@ final class StandardDirectoryReader exte
         }
       }
     }    
-    return new StandardDirectoryReader(directory, newReaders, writer, infos, termInfosIndexDivisor, false);
+    return new StandardDirectoryReader(directory, newReaders, null, infos, termInfosIndexDivisor, false);
   }
 
   @Override
@@ -232,7 +237,7 @@ final class StandardDirectoryReader exte
 
   @Override
   protected DirectoryReader doOpenIfChanged() throws IOException {
-    return doOpenIfChanged(null);
+    return doOpenIfChanged((IndexCommit) null);
   }
 
   @Override
@@ -302,13 +307,13 @@ final class StandardDirectoryReader exte
       protected Object doBody(String segmentFileName) throws IOException {
         final SegmentInfos infos = new SegmentInfos();
         infos.read(directory, segmentFileName);
-        return doOpenIfChanged(infos, null);
+        return doOpenIfChanged(infos);
       }
     }.run(commit);
   }
 
-  DirectoryReader doOpenIfChanged(SegmentInfos infos, IndexWriter writer) throws IOException {
-    return StandardDirectoryReader.open(directory, writer, infos, getSequentialSubReaders(), termInfosIndexDivisor);
+  DirectoryReader doOpenIfChanged(SegmentInfos infos) throws IOException {
+    return StandardDirectoryReader.open(directory, infos, getSequentialSubReaders(), termInfosIndexDivisor);
   }
 
   @Override