mirror of https://github.com/apache/lucene.git
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:
parent
455efee9ba
commit
b3e0a10336
solr
|
@ -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
|
||||
----------------------
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue