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 2007/10/06 17:12:44 UTC
svn commit: r582508 - in /lucene/java/trunk/src:
java/org/apache/lucene/index/ test/org/apache/lucene/index/
Author: mikemccand
Date: Sat Oct 6 08:12:43 2007
New Revision: 582508
URL: http://svn.apache.org/viewvc?rev=582508&view=rev
Log:
LUCENE-1018: fix intermittent exception in TestConcurrentMergeScheduler
Modified:
lucene/java/trunk/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java
lucene/java/trunk/src/java/org/apache/lucene/index/IndexFileDeleter.java
lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java
lucene/java/trunk/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java
Modified: lucene/java/trunk/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java?rev=582508&r1=582507&r2=582508&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java Sat Oct 6 08:12:43 2007
@@ -107,10 +107,8 @@
while(mergeThreads.size() > 0) {
if (VERBOSE) {
message("now wait for threads; currently " + mergeThreads.size() + " still running");
- for(int i=0;i<mergeThreads.size();i++) {
- final MergeThread mergeThread = ((MergeThread) mergeThreads.get(i));
- message(" " + i + ": " + mergeThread.merge.segString(dir));
- }
+ for(int i=0;i<mergeThreads.size();i++)
+ message(" " + i + ": " + ((MergeThread) mergeThreads.get(i)));
}
try {
@@ -210,24 +208,35 @@
private class MergeThread extends Thread {
IndexWriter writer;
- MergePolicy.OneMerge merge;
+ MergePolicy.OneMerge startMerge;
+ MergePolicy.OneMerge runningMerge;
- public MergeThread(IndexWriter writer, MergePolicy.OneMerge merge) throws IOException {
+ public MergeThread(IndexWriter writer, MergePolicy.OneMerge startMerge) throws IOException {
this.writer = writer;
- this.merge = merge;
+ this.startMerge = startMerge;
+ }
+
+ public synchronized void setRunningMerge(MergePolicy.OneMerge merge) {
+ runningMerge = merge;
+ }
+
+ public synchronized MergePolicy.OneMerge getRunningMerge() {
+ return runningMerge;
}
public void run() {
+
+ // First time through the while loop we do the merge
+ // that we were started with:
+ MergePolicy.OneMerge merge = this.startMerge;
+
try {
if (VERBOSE)
message(" merge thread: start");
- // First time through the while loop we do the merge
- // that we were started with:
- MergePolicy.OneMerge merge = this.merge;
-
while(true) {
+ setRunningMerge(merge);
writer.merge(merge);
// Subsequent times through the loop we do any new
@@ -248,13 +257,17 @@
// When a merge was aborted & IndexWriter closed,
// it's possible to get various IOExceptions,
// NullPointerExceptions, AlreadyClosedExceptions:
- merge.setException(exc);
- writer.addMergeException(merge);
+ if (merge != null) {
+ merge.setException(exc);
+ writer.addMergeException(merge);
+ }
- if (!merge.isAborted()) {
+ if (merge == null || !merge.isAborted()) {
// If the merge was not aborted then the exception
// is real
- exceptions.add(exc);
+ synchronized(ConcurrentMergeScheduler.this) {
+ exceptions.add(exc);
+ }
if (!suppressExceptions)
// suppressExceptions is normally only set during
@@ -270,6 +283,9 @@
}
public String toString() {
+ MergePolicy.OneMerge merge = getRunningMerge();
+ if (merge == null)
+ merge = startMerge;
return "merge thread: " + merge.segString(dir);
}
}
Modified: lucene/java/trunk/src/java/org/apache/lucene/index/IndexFileDeleter.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/java/org/apache/lucene/index/IndexFileDeleter.java?rev=582508&r1=582507&r2=582508&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/index/IndexFileDeleter.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/index/IndexFileDeleter.java Sat Oct 6 08:12:43 2007
@@ -100,6 +100,10 @@
private IndexDeletionPolicy policy;
private DocumentsWriter docWriter;
+ /** Change to true to see details of reference counts when
+ * infoStream != null */
+ public static boolean VERBOSE_REF_COUNTS = false;
+
void setInfoStream(PrintStream infoStream) {
this.infoStream = infoStream;
if (infoStream != null)
@@ -342,6 +346,8 @@
deletable = null;
int size = oldDeletable.size();
for(int i=0;i<size;i++) {
+ if (infoStream != null)
+ message("delete pending file " + oldDeletable.get(i));
deleteFile((String) oldDeletable.get(i));
}
}
@@ -441,7 +447,7 @@
for(int i=0;i<size;i++) {
String fileName = (String) files.get(i);
RefCount rc = getRefCount(fileName);
- if (infoStream != null) {
+ if (infoStream != null && VERBOSE_REF_COUNTS) {
message(" IncRef \"" + fileName + "\": pre-incr count is " + rc.count);
}
rc.IncRef();
@@ -457,7 +463,7 @@
private void decRef(String fileName) throws IOException {
RefCount rc = getRefCount(fileName);
- if (infoStream != null) {
+ if (infoStream != null && VERBOSE_REF_COUNTS) {
message(" DecRef \"" + fileName + "\": pre-decr count is " + rc.count);
}
if (0 == rc.DecRef()) {
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?rev=582508&r1=582507&r2=582508&view=diff
==============================================================================
--- lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java (original)
+++ lucene/java/trunk/src/java/org/apache/lucene/index/IndexWriter.java Sat Oct 6 08:12:43 2007
@@ -1172,7 +1172,9 @@
if (infoStream != null)
message("now flush at close");
- flush(true, true);
+ // Only allow a new merge to be triggered if we are
+ // going to wait for merges:
+ flush(waitForMerges, true);
mergePolicy.close();
@@ -1947,15 +1949,23 @@
if (!waitForMerges) {
// Abort all pending & running merges:
Iterator it = pendingMerges.iterator();
- while(it.hasNext())
- ((MergePolicy.OneMerge) it.next()).abort();
-
+ while(it.hasNext()) {
+ final MergePolicy.OneMerge merge = (MergePolicy.OneMerge) it.next();
+ if (infoStream != null)
+ message("now abort pending merge " + merge.segString(directory));
+ merge.abort();
+ }
pendingMerges.clear();
- it = runningMerges.iterator();
- while(it.hasNext())
- ((MergePolicy.OneMerge) it.next()).abort();
+ it = runningMerges.iterator();
+ while(it.hasNext()) {
+ final MergePolicy.OneMerge merge = (MergePolicy.OneMerge) it.next();
+ if (infoStream != null)
+ message("now abort running merge " + merge.segString(directory));
+ merge.abort();
+ }
runningMerges.clear();
+
mergingSegments.clear();
notifyAll();
} else {
@@ -3078,7 +3088,7 @@
return mergedDocCount;
}
- void addMergeException(MergePolicy.OneMerge merge) {
+ synchronized void addMergeException(MergePolicy.OneMerge merge) {
if (!mergeExceptions.contains(merge) && mergeGen == merge.mergeGen)
mergeExceptions.add(merge);
}
Modified: lucene/java/trunk/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java?rev=582508&r1=582507&r2=582508&view=diff
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java Sat Oct 6 08:12:43 2007
@@ -225,8 +225,8 @@
try {
directory.close();
- } catch (RuntimeException ioe) {
- // MockRAMDirectory will throw IOExceptions when there
+ } catch (RuntimeException re) {
+ // MockRAMDirectory will throw RuntimeExceptions when there
// are still open files, which is OK since some merge
// threads may still be running at this point.
}