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 mi...@apache.org on 2010/11/15 11:48:54 UTC
svn commit: r1035219 - in /lucene/java/branches/lucene_3_0: CHANGES.txt
src/java/org/apache/lucene/index/IndexWriter.java
Author: mikemccand
Date: Mon Nov 15 10:48:54 2010
New Revision: 1035219
URL: http://svn.apache.org/viewvc?rev=1035219&view=rev
Log:
LUCENE-2618: if normal merges run at same time as optimize, upgrade them to optimize merges if they involve segments marked for optimize
Modified:
lucene/java/branches/lucene_3_0/CHANGES.txt
lucene/java/branches/lucene_3_0/src/java/org/apache/lucene/index/IndexWriter.java
Modified: lucene/java/branches/lucene_3_0/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/java/branches/lucene_3_0/CHANGES.txt?rev=1035219&r1=1035218&r2=1035219&view=diff
==============================================================================
--- lucene/java/branches/lucene_3_0/CHANGES.txt (original)
+++ lucene/java/branches/lucene_3_0/CHANGES.txt Mon Nov 15 10:48:54 2010
@@ -83,6 +83,10 @@ Bug fixes
may be opened for read even though they are still open for write.
(Mike McCandless)
+* LUCENE-2618: Fix rare thread safety issue whereby
+ IndexWriter.optimize could sometimes return even though the index
+ wasn't fully optimized (Mike McCandless)
+
Optimizations
* LUCENE-2556: Improve memory usage after cloning TermAttribute.
Modified: lucene/java/branches/lucene_3_0/src/java/org/apache/lucene/index/IndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/java/branches/lucene_3_0/src/java/org/apache/lucene/index/IndexWriter.java?rev=1035219&r1=1035218&r2=1035219&view=diff
==============================================================================
--- lucene/java/branches/lucene_3_0/src/java/org/apache/lucene/index/IndexWriter.java (original)
+++ lucene/java/branches/lucene_3_0/src/java/org/apache/lucene/index/IndexWriter.java Mon Nov 15 10:48:54 2010
@@ -268,6 +268,7 @@ public class IndexWriter implements Clos
private IndexFileDeleter deleter;
private Set<SegmentInfo> segmentsToOptimize = new HashSet<SegmentInfo>(); // used by optimize to note those needing optimization
+ private int optimizeMaxNumSegments;
private Lock writeLock;
@@ -2335,6 +2336,7 @@ public class IndexWriter implements Clos
synchronized(this) {
resetMergeExceptions();
segmentsToOptimize = new HashSet<SegmentInfo>();
+ optimizeMaxNumSegments = maxNumSegments;
final int numSegments = segmentInfos.size();
for(int i=0;i<numSegments;i++)
segmentsToOptimize.add(segmentInfos.info(i));
@@ -2538,8 +2540,9 @@ public class IndexWriter implements Clos
throws CorruptIndexException, IOException {
assert !optimize || maxNumSegmentsOptimize > 0;
- if (stopMerges)
+ if (stopMerges) {
return;
+ }
// Do not start new merges if we've hit OOME
if (hitOOM) {
@@ -2553,19 +2556,21 @@ public class IndexWriter implements Clos
if (spec != null) {
final int numMerges = spec.merges.size();
for(int i=0;i<numMerges;i++) {
- final MergePolicy.OneMerge merge = ( spec.merges.get(i));
+ final MergePolicy.OneMerge merge = spec.merges.get(i);
merge.optimize = true;
merge.maxNumSegmentsOptimize = maxNumSegmentsOptimize;
}
}
- } else
+ } else {
spec = mergePolicy.findMerges(segmentInfos);
+ }
if (spec != null) {
final int numMerges = spec.merges.size();
- for(int i=0;i<numMerges;i++)
+ for(int i=0;i<numMerges;i++) {
registerMerge(spec.merges.get(i));
+ }
}
}
@@ -3924,8 +3929,10 @@ public class IndexWriter implements Clos
// disk, updating SegmentInfo, etc.:
readerPool.clear(merge.segments);
- if (merge.optimize)
+ if (merge.optimize) {
+ // cascade the optimize:
segmentsToOptimize.add(merge.info);
+ }
return true;
}
@@ -4037,12 +4044,19 @@ public class IndexWriter implements Clos
boolean isExternal = false;
for(int i=0;i<count;i++) {
final SegmentInfo info = merge.segments.info(i);
- if (mergingSegments.contains(info))
+ if (mergingSegments.contains(info)) {
return false;
- if (segmentInfos.indexOf(info) == -1)
+ }
+ if (segmentInfos.indexOf(info) == -1) {
return false;
- if (info.dir != directory)
+ }
+ if (info.dir != directory) {
isExternal = true;
+ }
+ if (segmentsToOptimize.contains(info)) {
+ merge.optimize = true;
+ merge.maxNumSegmentsOptimize = optimizeMaxNumSegments;
+ }
}
ensureContiguousMerge(merge);