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