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 2014/11/25 12:40:47 UTC
svn commit: r1641584 - in /lucene/dev/trunk/lucene: CHANGES.txt
core/src/java/org/apache/lucene/store/RateLimiter.java
core/src/test/org/apache/lucene/store/TestRateLimiter.java
Author: mikemccand
Date: Tue Nov 25 11:40:47 2014
New Revision: 1641584
URL: http://svn.apache.org/r1641584
Log:
LUCENE-6075: don't overflow int in SimpleRateLimiter
Modified:
lucene/dev/trunk/lucene/CHANGES.txt
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/store/RateLimiter.java
lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/store/TestRateLimiter.java
Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1641584&r1=1641583&r2=1641584&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Tue Nov 25 11:40:47 2014
@@ -281,6 +281,9 @@ Bug Fixes
* LUCENE-6062: Pass correct fieldinfos to docvalues producer when the
segment has updates. (Mike McCandless, Shai Erera, Robert Muir)
+
+* LUCENE-6075: Don't overflow int in SimpleRateLimiter (Boaz Leskes
+ via Mike McCandless)
Documentation
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/store/RateLimiter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/store/RateLimiter.java?rev=1641584&r1=1641583&r2=1641584&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/store/RateLimiter.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/store/RateLimiter.java Tue Nov 25 11:40:47 2014
@@ -138,7 +138,17 @@ public abstract class RateLimiter {
// NOTE: except maybe on real-time JVMs, minimum realistic sleep time
// is 1 msec; if you pass just 1 nsec the default impl rounds
// this up to 1 msec:
- Thread.sleep((int) (pauseNS/1000000), (int) (pauseNS % 1000000));
+ int sleepNS;
+ int sleepMS;
+ if (pauseNS > 100000L * Integer.MAX_VALUE) {
+ // Not really practical (sleeping for 25 days) but we shouldn't overflow int:
+ sleepMS = Integer.MAX_VALUE;
+ sleepNS = 0;
+ } else {
+ sleepMS = (int) (pauseNS/1000000);
+ sleepNS = (int) (pauseNS % 1000000);
+ }
+ Thread.sleep(sleepMS, sleepNS);
} catch (InterruptedException ie) {
throw new ThreadInterruptedException(ie);
}
Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/store/TestRateLimiter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/store/TestRateLimiter.java?rev=1641584&r1=1641583&r2=1641584&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/store/TestRateLimiter.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/store/TestRateLimiter.java Tue Nov 25 11:40:47 2014
@@ -17,10 +17,8 @@ package org.apache.lucene.store;
* limitations under the License.
*/
-import java.util.Locale;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.lucene.store.RateLimiter.SimpleRateLimiter;
@@ -44,6 +42,24 @@ public final class TestRateLimiter exten
assertTrue("we should sleep at least 1 second but did only: " + convert + " millis", convert > 1000l);
}
+ // LUCENE-6075
+ public void testOverflowInt() throws Exception {
+ Thread t = new Thread() {
+ @Override
+ public void run() {
+ try {
+ new SimpleRateLimiter(1).pause((long) (1.5*Integer.MAX_VALUE*1024*1024/1000));
+ fail("should have been interrupted");
+ } catch (ThreadInterruptedException tie) {
+ // expected
+ }
+ }
+ };
+ t.start();
+ Thread.sleep(10);
+ t.interrupt();
+ }
+
public void testThreads() throws Exception {
double targetMBPerSec = 10.0 + 20 * random().nextDouble();