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 2011/06/08 23:50:43 UTC
svn commit: r1133572 - in /lucene/dev/branches/branch_3x: ./ lucene/
lucene/backwards/ lucene/src/java/org/apache/lucene/index/IndexWriter.java
lucene/src/test/org/apache/lucene/index/TestAddIndexes.java solr/
Author: mikemccand
Date: Wed Jun 8 21:50:43 2011
New Revision: 1133572
URL: http://svn.apache.org/viewvc?rev=1133572&view=rev
Log:
LUCENE-3182: fix corruption case, when one thread is calling IW.addIndices(IR...) and another thread calls IW.rollback()
Modified:
lucene/dev/branches/branch_3x/ (props changed)
lucene/dev/branches/branch_3x/lucene/ (props changed)
lucene/dev/branches/branch_3x/lucene/backwards/ (props changed)
lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/IndexWriter.java
lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestAddIndexes.java
lucene/dev/branches/branch_3x/solr/ (props changed)
Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/IndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/IndexWriter.java?rev=1133572&r1=1133571&r2=1133572&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/IndexWriter.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/index/IndexWriter.java Wed Jun 8 21:50:43 2011
@@ -2836,6 +2836,9 @@ public class IndexWriter implements Clos
// will always write to a new generation ("write
// once").
segmentInfos.rollbackSegmentInfos(rollbackSegments);
+ if (infoStream != null ) {
+ message("rollback: infos=" + segString(segmentInfos));
+ }
docWriter.abort();
@@ -3061,6 +3064,8 @@ public class IndexWriter implements Clos
flush(false, true);
String mergedName = newSegmentName();
+ // TODO: somehow we should fix this merge so it's
+ // abortable so that IW.close(false) is able to stop it
SegmentMerger merger = new SegmentMerger(directory, config.getTermIndexInterval(),
mergedName, null, payloadProcessorProvider,
((FieldInfos) docWriter.getFieldInfos().clone()));
@@ -3078,6 +3083,11 @@ public class IndexWriter implements Clos
boolean useCompoundFile;
synchronized(this) { // Guard segmentInfos
+ if (stopMerges) {
+ deleter.deleteNewFiles(info.files());
+ return;
+ }
+ ensureOpen();
useCompoundFile = mergePolicy.useCompoundFile(segmentInfos, info);
}
@@ -3093,6 +3103,11 @@ public class IndexWriter implements Clos
// Register the new segment
synchronized(this) {
+ if (stopMerges) {
+ deleter.deleteNewFiles(info.files());
+ return;
+ }
+ ensureOpen();
segmentInfos.add(info);
checkpoint();
}
@@ -3825,6 +3840,7 @@ public class IndexWriter implements Clos
boolean success = false;
final long t0 = System.currentTimeMillis();
+ //System.out.println(Thread.currentThread().getName() + ": merge start: size=" + (merge.estimatedMergeBytes/1024./1024.) + " MB\n merge=" + merge.segString(directory) + "\n idx=" + segString());
try {
try {
@@ -3865,6 +3881,7 @@ public class IndexWriter implements Clos
if (infoStream != null && merge.info != null) {
message("merge time " + (System.currentTimeMillis()-t0) + " msec for " + merge.info.docCount + " docs");
}
+ //System.out.println(Thread.currentThread().getName() + ": merge end");
}
/** Hook that's called when the specified merge is complete. */
@@ -4486,6 +4503,8 @@ public class IndexWriter implements Clos
assert testPoint("midStartCommit");
+ boolean pendingCommitSet = false;
+
try {
// This call can take a long time -- 10s of seconds
// or more. We do it without sync:
@@ -4505,6 +4524,7 @@ public class IndexWriter implements Clos
toSync.prepareCommit(directory);
pendingCommit = toSync;
+ pendingCommitSet = true;
pendingCommitChangeCount = myChangeCount;
}
@@ -4522,7 +4542,7 @@ public class IndexWriter implements Clos
// double-write a segments_N file.
segmentInfos.updateGeneration(toSync);
- if (pendingCommit == null) {
+ if (!pendingCommitSet) {
if (infoStream != null) {
message("hit exception committing segments file");
}
Modified: lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestAddIndexes.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestAddIndexes.java?rev=1133572&r1=1133571&r2=1133572&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestAddIndexes.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/index/TestAddIndexes.java Wed Jun 8 21:50:43 2011
@@ -18,6 +18,7 @@ package org.apache.lucene.index;
*/
import java.io.IOException;
+import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
@@ -857,6 +858,8 @@ public class TestAddIndexes extends Luce
if (t instanceof AlreadyClosedException || t instanceof MergePolicy.MergeAbortedException || t instanceof NullPointerException) {
report = !didClose;
+ } else if (t instanceof FileNotFoundException) {
+ report = !didClose;
} else if (t instanceof IOException) {
Throwable t2 = t.getCause();
if (t2 instanceof MergePolicy.MergeAbortedException) {