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/29 10:00:57 UTC
svn commit: r589549 - in /lucene/java/trunk/src:
java/org/apache/lucene/index/ConcurrentMergeScheduler.java
test/org/apache/lucene/index/TestIndexWriter.java
Author: mikemccand
Date: Mon Oct 29 02:00:56 2007
New Revision: 589549
URL: http://svn.apache.org/viewvc?rev=589549&view=rev
Log:
LUCENE-1036: make sure the priority argument to Thread.setPriority(...) in ConcurrentMergeScheduler is in-bounds
Modified:
lucene/java/trunk/src/java/org/apache/lucene/index/ConcurrentMergeScheduler.java
lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriter.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=589549&r1=589548&r2=589549&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 Mon Oct 29 02:00:56 2007
@@ -78,17 +78,14 @@
/** Return the priority that merge threads run at. */
public synchronized void setMergeThreadPriority(int pri) {
+ if (pri > Thread.MAX_PRIORITY || pri < Thread.MIN_PRIORITY)
+ throw new IllegalArgumentException("priority must be in range " + Thread.MIN_PRIORITY + " .. " + Thread.MAX_PRIORITY + " inclusive");
mergeThreadPriority = pri;
final int numThreads = mergeThreadCount();
for(int i=0;i<numThreads;i++) {
MergeThread merge = (MergeThread) mergeThreads.get(i);
- try {
- merge.setPriority(pri);
- } catch (NullPointerException npe) {
- // Strangely, Sun's JDK 1.5 on Linux sometimes
- // throws NPE out of here...
- }
+ merge.setThreadPriority(pri);
}
}
@@ -98,10 +95,13 @@
}
private synchronized void initMergeThreadPriority() {
- if (mergeThreadPriority == -1)
+ if (mergeThreadPriority == -1) {
// Default to slightly higher priority than our
// calling thread
mergeThreadPriority = 1+Thread.currentThread().getPriority();
+ if (mergeThreadPriority > Thread.MAX_PRIORITY)
+ mergeThreadPriority = Thread.MAX_PRIORITY;
+ }
}
public void close() {
@@ -122,7 +122,12 @@
}
}
private synchronized int mergeThreadCount() {
- return mergeThreads.size();
+ int count = 0;
+ final int numThreads = mergeThreads.size();
+ for(int i=0;i<numThreads;i++)
+ if (((MergeThread) mergeThreads.get(i)).isAlive())
+ count++;
+ return count;
}
public void merge(IndexWriter writer)
@@ -174,12 +179,7 @@
MergeThread merger = new MergeThread(writer, merge);
mergeThreads.add(merger);
message(" launch new thread [" + merger.getName() + "]");
- try {
- merger.setPriority(mergeThreadPriority);
- } catch (NullPointerException npe) {
- // Strangely, Sun's JDK 1.5 on Linux sometimes
- // throws NPE out of here...
- }
+ merger.setThreadPriority(mergeThreadPriority);
merger.start();
continue;
} else
@@ -210,6 +210,18 @@
public synchronized MergePolicy.OneMerge getRunningMerge() {
return runningMerge;
+ }
+
+ public void setThreadPriority(int pri) {
+ try {
+ setPriority(pri);
+ } catch (NullPointerException npe) {
+ // Strangely, Sun's JDK 1.5 on Linux sometimes
+ // throws NPE out of here...
+ } catch (SecurityException se) {
+ // Ignore this because we will still run fine with
+ // normal thread priority
+ }
}
public void run() {
Modified: lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriter.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriter.java?rev=589549&r1=589548&r2=589549&view=diff
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriter.java (original)
+++ lucene/java/trunk/src/test/org/apache/lucene/index/TestIndexWriter.java Mon Oct 29 02:00:56 2007
@@ -1584,6 +1584,27 @@
dir.close();
}
+ // LUCENE-1036
+ public void testMaxThreadPriority() throws IOException {
+ int pri = Thread.currentThread().getPriority();
+ try {
+ MockRAMDirectory dir = new MockRAMDirectory();
+ IndexWriter iw = new IndexWriter(dir, new StandardAnalyzer(), true);
+ Document document = new Document();
+ document.add(new Field("tvtest", "a b c", Field.Store.NO, Field.Index.TOKENIZED,
+ Field.TermVector.YES));
+ iw.setMaxBufferedDocs(2);
+ iw.setMergeFactor(2);
+ Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
+ for(int i=0;i<4;i++)
+ iw.addDocument(document);
+ iw.close();
+
+ } finally {
+ Thread.currentThread().setPriority(pri);
+ }
+ }
+
// Just intercepts all merges & verifies that we are never
// merging a segment with >= 20 (maxMergeDocs) docs
private class MyMergeScheduler implements MergeScheduler {