SOLR-7875: Speedup SolrQueryTimeoutImpl

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1694574 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Tomas Eduardo Fernandez Lobbe 2015-08-06 21:27:07 +00:00
parent 455efee9ba
commit b3e0a10336
2 changed files with 12 additions and 26 deletions

View File

@ -328,6 +328,9 @@ Optimizations
* SOLR-7840: ZkStateReader.updateClusterState fetches watched collections twice from ZK. (shalin)
* SOLR-7875: Speedup SolrQueryTimeoutImpl. Avoid setting a timeout time when timeAllowed
parameter is not set. (Tomás Fernández Löbbe)
Other Changes
----------------------

View File

@ -17,11 +17,11 @@ package org.apache.solr.search;
* limitations under the License.
*/
import org.apache.lucene.index.QueryTimeout;
import static java.lang.System.nanoTime;
import java.util.concurrent.TimeUnit;
import static java.lang.System.nanoTime;
import org.apache.lucene.index.QueryTimeout;
/**
* Implementation of {@link QueryTimeout} that is used by Solr.
@ -32,29 +32,7 @@ public class SolrQueryTimeoutImpl implements QueryTimeout {
/**
* The ThreadLocal variable to store the time beyond which, the processing should exit.
*/
public static ThreadLocal<Long> timeoutAt = new ThreadLocal<Long>() {
/**
* {@inheritDoc}
* <p>
* By default, timeoutAt is set as far in the future as possible,
* so that it effectively never happens.
* <p>
* Since nanoTime() values can be anything from Long.MIN_VALUE to
* Long.MAX_VALUE, adding Long.MAX_VALUE can cause overflow. That's
* expected and works fine, since in that case the subtraction of a
* future nanoTime() value from timeoutAt (in
* {@link SolrQueryTimeoutImpl#shouldExit}) will result in underflow,
* and checking the sign of the result of that subtraction (via
* comparison to zero) will correctly indicate whether the future
* nanoTime() value has exceeded the timeoutAt value.
* <p>
* See {@link System#nanoTime}
*/
@Override
protected Long initialValue() {
return nanoTime() + Long.MAX_VALUE;
}
};
public static ThreadLocal<Long> timeoutAt = new ThreadLocal<Long>();
private SolrQueryTimeoutImpl() { }
private static SolrQueryTimeoutImpl instance = new SolrQueryTimeoutImpl();
@ -76,7 +54,12 @@ public class SolrQueryTimeoutImpl implements QueryTimeout {
*/
@Override
public boolean shouldExit() {
return get() - nanoTime() < 0L;
Long timeoutAt = get();
if (timeoutAt == null) {
// timeout unset
return false;
}
return timeoutAt - nanoTime() < 0L;
}
/**