From f4cf5ead7d5adc385473a02914df98e92a71d203 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Fri, 15 Mar 2013 22:45:51 +0000 Subject: [PATCH] LUCENE-4836: Fix SimpleRateLimiter#pause to return the actual time spent sleeping git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1457154 13f79535-47bb-0310-9956-ffa450edef68 --- lucene/CHANGES.txt | 3 ++ .../org/apache/lucene/store/RateLimiter.java | 5 ++- .../apache/lucene/store/TestRateLimiter.java | 40 +++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 lucene/core/src/test/org/apache/lucene/store/TestRateLimiter.java diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 8fbb26bfd02..c182579738e 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -109,6 +109,9 @@ Bug Fixes * LUCENE-4828: BooleanQuery no longer extracts terms from its MUST_NOT clauses. (Mike McCandless) +* LUCENE-4836: Fix SimpleRateLimiter#pause to return the actual time spent + sleeping instead of the wakeup timestamp in nano seconds. (Simon Willnauer) + ======================= Lucene 4.2.0 ======================= Changes in backwards compatibility policy diff --git a/lucene/core/src/java/org/apache/lucene/store/RateLimiter.java b/lucene/core/src/java/org/apache/lucene/store/RateLimiter.java index 9fca1e8a7f1..b837fca40f1 100644 --- a/lucene/core/src/java/org/apache/lucene/store/RateLimiter.java +++ b/lucene/core/src/java/org/apache/lucene/store/RateLimiter.java @@ -97,7 +97,8 @@ public abstract class RateLimiter { // TODO: this is purely instantaneous rate; maybe we // should also offer decayed recent history one? final long targetNS = lastNS = lastNS + ((long) (bytes * nsPerByte)); - long curNS = System.nanoTime(); + final long startNS; + long curNS = startNS = System.nanoTime(); if (lastNS < curNS) { lastNS = curNS; } @@ -117,7 +118,7 @@ public abstract class RateLimiter { } break; } - return targetNS; + return curNS - startNS; } } } diff --git a/lucene/core/src/test/org/apache/lucene/store/TestRateLimiter.java b/lucene/core/src/test/org/apache/lucene/store/TestRateLimiter.java new file mode 100644 index 00000000000..3ffef155136 --- /dev/null +++ b/lucene/core/src/test/org/apache/lucene/store/TestRateLimiter.java @@ -0,0 +1,40 @@ +package org.apache.lucene.store; + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.util.concurrent.TimeUnit; + +import org.apache.lucene.store.RateLimiter.SimpleRateLimiter; +import org.apache.lucene.util.LuceneTestCase; + +/** + * Simple testcase for RateLimiter.SimpleRateLimiter + */ +public final class TestRateLimiter extends LuceneTestCase { + + public void testPause() { + SimpleRateLimiter limiter = new SimpleRateLimiter(10); // 10 MB / Sec + limiter.pause(2);//init + long pause = 0; + for (int i = 0; i < 3; i++) { + pause += limiter.pause(4 * 1024 * 1024); // fire up 3 * 4 MB + } + final long convert = TimeUnit.MILLISECONDS.convert(pause, TimeUnit.NANOSECONDS); + assertTrue("we should sleep less than 2 seconds but did: " + convert + " millis", convert < 2000l); + assertTrue("we should sleep at least 1 second but did only: " + convert + " millis", convert > 1000l); + } +}